Swab попарно поменять байты


Содержание

Swab попарно поменять байты

подскажите плиз как поменять местами байты в переменной Word
например 0100 сделать 0001

Например, с помощью функции Swap.

Если как в примере, то 4 shr 2,
см. хелп — Logical operators

> P.N.P. © (14.03.05 12:47) [2]

Кто ж его знает — может быть, он написал в шестнадцатеричной системе :-)

var
W: Word;
begin
W := . ;
W := ((W and $FF) shl 8) or ((W and $FF00) shr 8)
end.

второй and лишний

Согласен. Приношу извинения.

var
L: Byte;
H: Byte;
R: Word;
begin
R := 0;
L := Lo(Исходное значение);
H := Hi(Исходное значение);
R := L;
R := R SHL 8;
R := R + H; //результат

Код несколько избыточен, для наглядности

w: Word;
pch: PChar;
ch: Char;

Где-то на этом форуме уже видел такую функцию:

function SwapW(i: Word): Word;
asm
XCHG al,ah
end;

Можно и в двойном слове байты в противоположном порядке разместить:

function SwapL(i: LongWord): LongWord;
asm
BSWAP eax
end;

можно ещё через ROR[ROL], три XOR»а, но быстрей всего через XCHG

Ещё с CopyMemory можно

Sorry.. Вношу поправку данные в шестнадцатеричном виде

Создание, редактирование и удаление SWAP в Linux

Оперативной памяти много не бывает. Виртуальная память предназначена для рационального распределения оперативной памяти между пользовательскими и системными процессами. Проще говоря, чтобы не расходовать оперативную память на хранение статичной информации, выделяют некоторую область жесткого диска для ее размещения.

Содержание

В системе Линукс для размещения виртуальной памяти можно выделить отдельный раздел жесткого диска или использовать обычный файл. Линукс позволяет комбинировать эти два способа. По умолчанию в Unix системах применяется SWAP раздел. Производительность отдельного SWAP раздела жесткого диска выше, чем производительность виртуальной памяти размещенной в файле. Единственным минусом SWAP раздела является сложность его редактирования.

Если Вы до эксплуатации сервера знаете какой емкости нужна SWAP область, то обязательно используйте отдельный раздел жесткого диска. Если нагрузка на SWAP область пока неизвестна, то лучше разместить виртуальную память в файле, после чего определив потребности системы, создать раздел нужного размера.

Система Linux позволяет одновременно использовать несколько SWAP разделов и SWAP файлов. Это позволяет более гибко подойти к вопросу расширения виртуальной памяти в случае нехватке размера SWAP области на сервере. Чаще всего, на работающем сервере с существующим SWAP разделом выясняется, что текущего размера виртуальной памяти уже не хватает. Целесообразнее добавить тестовый файл подкачки для определения нагрузки на SWAP область, а уже после увеличить размер раздела.

Создание, редактирование и удаление любых разделов из под загруженной в данный момент операционной системы не безопасно, поэтому создание SWAP раздела, вместо SWAP файла, делается только с использованием LiveCD. Статья на тему безопасного редактирования разделов будет написана в будущее время.

В системе Windows виртуальная память размещена только в отдельном файле — pagefile.sys (для Windows 2000 и выше) и win386.swp (для Windows 9x).

Для любой операционной системы, если используется спящий режим (Hebernation), размер виртуальной памяти следует делать не меньше объема оперативной памяти. В общих случаях наиболее эффективно использовать размер виртуальной памяти кратный 4 (1024 Мб, 2048 Мб и т.д.), так как ядро системы производит обмен страницами с памятью по 4 Кб в каждой. Размер виртуальной памяти легче посчитать от объема оперативной памяти *2, *3. Область подкачки стоит размещать на самом быстром жестком диске ближе к началу.

Хочу обратить Ваше внимани, что приведенные ниже инструкции касается только изменения размера ФАЙЛА ВИРТУАЛЬНОЙ ПАМЯТИ, а не изменение размера отдельной директории SWAP.

Ниже приведены пошаговые инструкции, которые позволят создать, изменить и удалить файл SWAP.

  1. Создаем файл необходимого размера для swap области, где /home/swap-tmp — это имя и путь файла, а count=1024K его размерв, в данном случае — 1024 Мб):

Редактировать файл fstab можно самостоятельно или командой, которая добавляет в конец файла fstab строку /home/swap-tmp swap swap defaults 0 0:

  1. Просматриваем все объекты, которые используются для размещения виртуальной памяти

Если Вы раньше добавляли строчку в fstab, для автоматической загрузки SWAP файла при старте операционной системы, то следует ее удалить. Выводим файл /etc/fstab для редактирования на экран:


Действия по редактирование объема SWAP файла сводятся к удалению уже созданного файла SWAP и созданию нового файла требуемого размера. То есть нужно сначало сделать пункт 3, а после пункт 2.

  1. linux’оид#
    3 Август, 01:01

А что насчёт отдельных разделов? С ними как быть?
Или тоже достаточно удалить раздел и стереть его из fstab?

С разделами все так же, только следите, чтобы SWAP все же остался в каком-то виде. Я не знаю как будет работать Linux без SWAP , не даром, при установке ОС, объязательные разделы: / и своп

Линукс без SWAP работает нормально, если есть около 2Гб Ram и комп используется как десктоп. Сам только что создал раздел свопа только ради ресурсоемкого приложения.

Amiro: Линукс без SWAP работает нормально, если есть около 2Гб Ram и комп используется как десктоп. Сам только что создал раздел свопа только ради ресурсоемкого приложения.

Ну, то что Linux работает без Swap – это точно, но как это скажется на производительность остается вопросом.

P.S. В вашем случае я бы создал скрипт, который создает swap и запускает ресурсоемкое приложение. После завершения работы этого приложение удаляется swap файл. И повесил бы его на кнопку запуска приложения.

Mut@NT
P.S. В вашем случае я бы создал скрипт, который создает swap и запускает ресурсоемкое приложение. После завершения работы этого приложение удаляется swap файл. И повесил бы его на кнопку запуска приложения.

Файл свапа на машине с 2-мя гигами оперативы размерами в 4 гига около двух минут создаеться, устанеш ждать загрузку своего приложения

Spec: Файл свапа на машине с 2-мя гигами оперативы размерами в 4 гига около двух минут создаеться, устанеш ждать загрузку своего приложения

Тут нет золотой середины. Всегда приходится чем-то жертвовать либо скоростью, либо быстротой ))

Mut@NT: P.S. В вашем случае я бы создал скрипт, который создает swap и запускает ресурсоемкое приложение. После завершения работы этого приложение удаляется swap файл. И повесил бы его на кнопку запуска приложения.

Вот только никакой гарантии что это будет всегда работать -нет.

Может найтись такая программа(не ваше ресурсоёмкое приложение, а иная) , которая при недостатке памяти сбрасывает данные на диск(если malloc возвращает NULL ), а если память есть, то хранит их в памяти. в результате после отработки вашего приложения для которого создавался своп, в нём может оказаться куча данных других приложений которые просто не влезут в память при вытеснении их из свопа. Что начнёт после этого происходить с системой – тема для отдельного разговора. Если своп у вас есть, то его можно только наращивать, но никак не уменьшать , чтоб это было безопасно

Вы правы. В статье отражено лишь то, что это в Linux возможно

Куча ошибок в тексте.
> или добавить строчка для автоматической
или добавить строчку для автоматической

> которая будет используется ядром
которая будет использоваться ядром

Прошу прощения за возможно дилетантское высказывание, просто я лучше знаю Solaris. По вопросу производительности и объёма SWAP , у меня опыт такой. SWAP хотят некоторые приложения, например Oracle, в то же время подкачка это всегда узкое место (если только диск не SSD ). По этому если есть возможность вообще без подкачки, то производительность максимальная, с другой стороны по опыту и рекомендациям вендоров при озу до 2Гб размер SWAP =озу, до 4Гб 50% озу, до 1Тб где то от 16 до 32Гб, свыше терабайта можно давать 64Гб. Опять же зависит от приложения, например SAP требует чтобы при 32Гб памяти SWAP был не менее 20Гб.

Значек # подразумевает что sudo не нужно, ошибка в # sudo dd if=/dev/zero of=/home/swap-tmp bs=1024 count=1024K; правильно: # dd if=/dev/zero of=/home/swap-tmp bs=1024K count=1024

Разбираемся с прямым и обратным порядком байтов

Проблемы с порядком байтов очень расстраивают, и я хочу избавить Вас от горя, которое довелось испытать мне. Вот ключевые тезы:

  • Проблема: Компьютеры, как и люди, говорят на разных языках. Одни записывают данные “слева направо” другие “справа налево”. При этом каждое устройство отлично считывает собственные данные — проблемы начинаются, когда один компьютер сохраняет данные, а другой пытается эти данные считать.
  • Решение: Принять некий общий формат (например, весь сетевой трафик передается в едином формате). Или всегда добавлять заголовок, описывающий формат хранения данных. Если считанный заголовок имеет обратный порядок, значит данные сохранены в другом формате и должны быть переконвертированы.

Числа и данные

Наиболее важная концепция заключается в понимании разницы между числами и данными, которые эти числа представляют. Число — это абстрактное понятия, как исчислитель чего-то. У Вас есть десять пальцев. Понятие “десять” не меняется, в зависимости от использованного представления: десять, 10, diez (испанский), ju (японский), 1010 (бинарное представление), Х (римские числа)… Все эти представления указывают на понятие “десяти”.

Илон Маск рекомендует:  Borland delphi 4 0 для начинающих создание элементов управления activex

Сравним это с данными. Данные — это физическое понятие, просто последовательность битов и байтов, хранящихся на компьютере. Данные не имеют неотъемлемого значения и должны быть интерпретированы тем, кто их считывает.

Данные — это как человеческое письмо, просто набор отметок на бумаге. Этим отметкам не присуще какое-либо значение. Если мы видим линию и круг (например, |O), то можно интерпретировать это как “десять”. Но это лишь предположение, что считанные символы представляют число. Это могут быть буквы “IO” — название спутника Юпитера. Или, возможно, имя греческой богини. Или аббревиатура для ввода/вывода. Или чьи-то инициалы. Или число 2 в бинарном представлении (“10”). Этот список предположений можно продолжить. Дело в том, что один фрагмент данных (|O) может быть интерпретировано по разному, и смысл остается не ясен, пока кто-то не уточнит намерения автора.

Компьютеры сталкиваются с такой же проблемой. Они хранят данные, а не абстрактные понятия, используя при этом 1 и 0. Позднее они считывают эти 1 и 0 и пытаются воссоздать абстрактные понятия из набора данных. В зависимости от сделанных допущений, эти 1 и 0 могут иметь абсолютно разное значение.

Почему так происходит? Ну, вообще-то нет такого правила, что компьютеры должны использовать один и тот же язык, так же, как нет такого правила и для людей. Каждый компьютер одного типа имеет внутреннюю совместимость (он может считывать свои собственные данные), но нет никакой гарантии, как именно интерпретирует эти данные компьютер другого типа.

Основные концепции:

  • Данные (биты и байты или отметки на бумаге) сами по себе не имеют смысла. Они должны быть интерпретированы в какое-то абстрактное понятие, например, число.
  • Как и люди, компьютеры имеют различные способы хранения одного и того же абстрактного понятия (например, мы можем различными способами сказать “10”).

Храним числа как данные

К счастью, большинство компьютеров хранят данные всего в нескольких форматах (хотя так было не всегда). Это дает нам общую отправную точку, что делает жизнь немного проще:

  • Бит имеет два состояния (включен или выключен, 1 или 0).
  • Байт — это последовательность из 8 бит. Крайний левый бит в байте является старшим. То есть двоичная последовательность 00001001 является десятичным числом девять. 00001001 = (2^3 + 2^0 = 8 + 1 = 9).
  • Биты нумеруются справа налево. Бит 0 является крайним правым и он наименьший. Бит 7 является крайним левым и он наибольший.



Мы можем использовать эти соглашения в качестве строительного блока для обмена данными. Если мы сохраняем и читаем данные по одному байту за раз, то этот подход будет работать на любом компьютере. Концепция байта одинаковая на всех машинах, понятие “байт 0” одинакова на всех машинах. Компьютеры также отлично понимают порядок, в котором Вы посылаете им байты — они понимают какой байт был прислан первым, вторым, третьим и т. д. “Байт 35” будет одним и тем же на всех машинах.

Так в чем же проблема — компьютеры отлично ладят с одиночными байтами, правда? Ну, все превосходно для однобайтных данных, таких как ASCII-символы. Однако, много данных используют для хранения несколько байтов, например, целые числа или числа с плавающей точкой. И нет никакого соглашения о том, в каком порядке должны хранится эти последовательности.

Пример с байтом

Рассмотрим последовательность из 4 байт. Назовем их W X Y и Z. Я избегаю наименований A B C D, потому что это шестнадцатеричные числа, что может немного запутывать. Итак, каждый байт имеет значение и состоит из 8 бит.

Например, W — это один байт со значением 0х12 в шестнадцатеричном виде или 00010010 в бинарном. Если W будет интерпретироваться как число, то это будет “18” в десятеричной системе (между прочим, ничто не указывает на то, что мы должны интерпретировать этот байт как число — это может быть ASCII-символ или что-то совсем иное). Вы все еще со мной? Мы имеем 4 байта, W X Y и Z, каждый с различным значением.

Понимаем указатели

Указатели являются ключевой частью программирования, особенно в языке С. Указатель представляет собой число, являющееся адресом в памяти. И это зависит только от нас (программистов), как интерпретировать данные по этому адресу.

В языке С, когда вы кастите (приводите) указатель к конкретному типу (такому как char * или int *), это говорит компьютеру, как именно интерпретировать данные по этому адресу. Например, давайте объявим:

Обратите внимание, что мы не можем получить из р данные, потому что мы не знаем их тип. р может указывать на цифру, букву, начало строки, Ваш гороскоп или изображение — мы просто не знаем, сколько байт нам нужно считать и как их интерпретировать.

Теперь предположим, что мы напишем:

Этот оператор говорит компьютеру, что р указывает на то же место, и данные по этому адресу нужно интерпретировать как один символ (1 байт). В этом случае, с будет указывать на память по адресу 0, или на байт W. Если мы выведем с, то получим значение, хранящееся в W, которое равно шестнадцатеричному 0x12 (помните, что W — это полный байт). Этот пример не зависит от типа компьютера — опять же, все компьютеры одинаково хорошо понимают, что же такое один байт (в прошлом это было не всегда так).

Этот пример полезен, он одинаково работает на все компьютерах — если у нас есть указатель на байт (char *, один байт), мы можем проходить по памяти, считывая по одному байту за раз. Мы можем обратиться к любому месту в памяти, и порядок хранения байт не будет иметь никакого значения — любой компьютер вернет нам одинаковую информацию.

Так в чем же проблема?

Проблемы начинаются, когда компьютер пытается считать несколько байт. Многие типы данных состоят больше чем из одного байта, например, длинные целые (long integers) или числа с плавающей точкой. Байт имеет только 256 значений и может хранить числа от 0 до 255.

Теперь начинаются проблемы — если Вы читаете многобайтные данные, то где находится старший байт?

  • Машины с порядком хранения от старшего к младшему (прямой порядок) хранят старший байт первым. Если посмотреть на набор байтов, то первый байт (младший адрес) считается старшим.
  • Машины с порядком хранения от младшего к старшему (обратный порядок) хранят младший байт первым. Если посмотреть на набор байт, то первый байт будет наименьшим.

Такое именование имеет смысл, правда? Тип хранения от старшего к младшему подразумевает, что запись начинается со старшего и заканчивается младшим (Между прочим, английский вариант названий от старшего к младшего (Big-endian) и от младшего к старшему (Little-endian) взяты из книги “Путешествия Гулливера”, где лилипуты спорили о том, следует ли разбивать яйцо на маленьком конце (little-end) или на большом (big-end)). Иногда дебаты компьютеров такие же осмысленные :)

Повторюсь, порядок следования байтов не имеет значения пока Вы работаете с одним байтом. Если у Вас есть один байт, то это просто данные, которые Вы считываете и есть только один вариант их интерпретации (опять таки, потому что между компьютерами согласовано понятие одного байта).

Теперь предположим, что у нас есть 4 байта (WXYZ), которые хранятся одинаково на машинах с обоими типами порядка записи байтов. То есть, ячейка памяти 0 соответствует W, ячейка 1 соответствует X и т. д.

Мы можем создать такое соглашение, помня, что понятие “байт” является машинно-независимым. Мы можем обойти память по одному байту за раз и установить необходимые значения. Это будет работать на любой машине.

Такой код будет работать на любой машине и успешно установит значение байт W, X, Y и Z расположенных на соответствующих позициях 0, 1, 2 и 3.

Интерпретация данных

Теперь давайте рассмотрим пример с многобайтными данными (наконец-то!). Короткая сводка: “short int” это 2-х байтовое число (16 бит), которое может иметь значение от 0 до 65535 (если оно беззнаковое). Давайте используем его в примере.

Итак, s это указатель на short int, и сейчас он указывает на позицию 0 (в которой хранится W). Что произойдет, когда мы считаем значение по указателю s?

  • Машина с прямым порядком хранения: Я думаю, short int состоит из двух байт, а значит я считаю их. Позиция s это адрес 0 (W или 0х12), а позиция s + 1 это адрес 1 (X или 0х34). Поскольку первый байт является старшим, то число должно быть следующим 256 * байт 0 + байт 1 или 256 * W + X, или же 0х1234. Я умножаю первый байт на 256 (2^8) потому что его нужно сдвинуть на 8 бит.
  • Машина с обратным порядком хранения: Я не знаю что курит мистер “От старшего к младшему”. Я соглашусь, что short int состоит из 2 байт и я считаю их точно также: позиция s со значение 0х12 и позиция s + 1 со значением 0х34. Но в моем мире первым является младший байт! И число должно быть байт 0 + 256 * байт 1 или 256 * X + W, или 0х3412.

Обратите внимание, что обе машины начинали с позиции s и читали память последовательно. Не никакой путаницы в том, что значит позиция 0 и позиция 1. Как и нет никакой путаницы в том, что являет собой тип short int.

Теперь Вы видите проблему? Машина с порядком хранения от старшего к младшему считает, что s = 0x1234, в то время как машина с порядком хранения от младшего к старшему думает, что s = 0x3412. Абсолютно одинаковые данные дают в результате два совершенно разных числа.

И еще один пример

Давайте для “веселья” рассмотрим еще один пример с 4 байтовым целым:

И опять мы задаемся вопросом: какое значение хранится по адресу i?

  • Машина с прямым порядком хранения: тип int состоит из 4 байт и первый байт является старшим. Считываю 4 байта (WXYZ) из которых старший W. Полученное число: 0х12345678.
  • Машина с обратным порядком хранения: несомненно, int состоит из 4 байт, но старшим является последний. Так же считываю 4 байта (WXYZ), но W будет расположен в конце — так как он является младшим. Полученное число: 0х78563412.

Одинаковые данные, но разный результат — это не очень приятная вещь.

Проблема NUXI

Проблему с порядком байт иногда называют проблемой NUXI: слово UNIX, сохраненное на машинах с порядком хранения от старшего к младшему, будет отображаться как NUXI на машинах с порядком от младшего к старшему.

Допустим, что мы собираемся сохранить 4 байта (U, N, I, и X), как два short int: UN и IX. Каждая буква занимает целый байт, как в случае с WXYZ. Для сохранения двух значений типа short int напишем следующий код:

Этот код не является специфичным для какой-то машины. Если мы сохраним значение “UN” на любой машине и считаем его обратно, то обратно получим тоже “UN”. Вопрос порядка следования байт не будет нас волновать, если мы сохраняем значение на одной машине, то должны получить это же значение при считывании.


Однако, если пройтись по памяти по одному байту за раз (используя трюк с char *), то порядок байт может различаться. На машине с прямым порядком хранения мы увидим:

Илон Маск рекомендует:  Всплывающая подсказка (простенькая)

Что имеет смысл. “U” является старшим байтом в “UN” и соответственно хранится первым. Такая же ситуация для “IX”, где “I” — это старший байт и хранится он первым.

На машине с обратным порядком хранения мы скорее всего увидим:

Но и это тоже имеет смысл. “N” является младшим байтом в “UN” и значит хранится он первым. Опять же, хотя байты хранятся в “обратном порядке” в памяти, машины с порядком хранения от младшего к старшему знают что это обратный порядок байт, и интерпретирует их правильно при чтении. Также, обратите внимание, что мы можем определять шестнадцатеричные числа, такие как 0x1234, на любой машине. Машина с обратным порядком хранения байтов знает, что Вы имеете в виду, когда пишите 0x1234 и не заставит Вас менять значения местами (когда шестнадцатеричное число отправляется на запись, машина понимает что к чему и меняет байты в памяти местами, скрывая это от глаз. Вот такой трюк.).

Рассмотренный нами сценарий называется проблемой “NUXI”, потому что последовательность “UNIX” интерпретируется как “NUXI” на машинах с различным порядком хранения байтов. Опять же, эта проблема возникает только при обмене данными — каждая машина имеет внутреннюю совместимость.

Обмен данными между машинами с различным порядком хранения байтов

Сейчас компьютеры соединены — прошли те времена, когда машинам приходилось беспокоиться только о чтении своих собственных данных. Машинам с различным порядком хранения байтов нужно как-то обмениваться данными и понимать друг друга. Как же они это делают?

Решение 1: Использовать общий формат

Самый простой подход состоит в согласовании с общим форматом для передачи данных по сети. Стандартным сетевым является порядок от старшего к младшему, но некоторые люди могут расстроиться, что не победил порядок от младшего к старшему, поэтому просто назовем его “сетевой порядок”.

Для конвертирования данных в соответствии с сетевым порядком хранения байтов, машины вызывают функцию hton() (host-to-network). На машинах с прямым порядком хранения эта функция не делает ничего, но мы не будем говорить здесь об этом (это может разозлить машины с обратным порядком хранения :) ).

Но важно использовать функцию hton() перед отсылкой данных даже если Вы работаете на машине с порядком хранения от старшего к младшему. Ваша программа может стать весьма популярной и будет скомпилирована на различных машинах, а Вы ведь стремитесь к переносимости своего кода (разве не так?).

Точно также существует функция ntoh() (network-to-host), которая используется для чтения данных из сети. Вы должны использовать ее, чтобы быть уверенными, что правильно интерпретируете сетевые данные в формат хоста. Вы должны знать тип данных, которые принимаете, чтобы расшифровать их правильно. Функции преобразования имеют следующий вид:

Помните, что один байт — это один байт и порядок не имеет значения.

Эти функции имеют критическое значение при выполнении низкоуровневых сетевых операций, таких как проверка контрольной суммы IP-пакетов. Если Вы не понимаете сути проблемы с порядком хранения байтов, то Ваша жизнь будет наполнена болью — поверьте мне на слово. Используйте функции преобразования и знайте, зачем они нужны.

Решение 2: Использования маркера последовательности байтов (Byte Order Mark — BOM)

Этот подход подразумевает использование некого магического числа, например 0xFEFF, перед каждым куском данных. Если Вы считали магическое число и его значение 0xFEFF, значит данные в том же формате, что и у Вашей машины и все хорошо. Если Вы считали магическое число и его значение 0xFFFE, это значит, что данные были записаны в формате, отличающемся от формата вашей машины и Вы должны будете преобразовать их.

Нужно отметить несколько пунктов. Во-первых, число не совсем магическое, как известно программисты часто используют этот термин для описания произвольно выбранных чисел (BOM может быть любой последовательностью различных байтов). Такая пометка называется маркером последовательности байтов потому что показывает в каком порядке данные были сохранены.

Во-вторых, BOM добавляет накладные расходы для всех передаваемых данных. Даже в случае передачи 2 байт информации Вы должны добавлять к ним 2 байта маркера BOM. Пугающе, не так ли?

Unicode использует BOM, когда сохраняет многобайтные данные (некоторые кодировки Unicode могут иметь по 2, 3 и даже 4 байта на символ). XML позволяет избежать этой путаницы, сохраняя данные сразу в UTF-8 по умолчанию, который сохраняет информацию Unicode по одному байту за раз. Почему это так круто?

Повторяю в 56-й раз — потому что проблема порядка хранения не имеет значения для единичных байт.

Опять же, в случае использования BOM может возникнуть другие проблемы. Что, если Вы забудете добавить BOM? Будете предполагать, что данные были отправлены в том же формате, что и Ваши? Прочитаете данные и, увидев что они “перевернуты” (что бы это не значило), попытаетесь преобразовать их? Что, если правильные данные случайно будут содержать неправильный BOM? Эти ситуации не очень приятные.

Почему вообще существует эта проблема? Нельзя ли просто договориться?

Ох, какой же это философский вопрос. Каждый порядок хранения байтов имеет свои преимущества. Машины с порядком следования от младшего к старшему позволяют читать младший байт первым, не считывая при этом остальные. Таким образом можно легко проверить является число нечетным или четным (последний бит 0), что очень здорово, если Вам необходима такая проверка. Машины с порядком от старшего к младшему хранят данные в памяти в привычном для человека виде (слева направо), что упрощает низкоуровневую отладку.

Так почему же все просто не договорятся об использовании одной из систем? Почему одни компьютеры пытаются быть отличными от других? Позвольте мне ответить вопросом на вопрос: почему не все люди говорят на одном языке? Почему в некоторых языках письменность слева направо, а у других справа налево?

Иногда системы развиваются независимо, а в последствии нуждаются во взаимодействии.

Поменять значения переменных без использования доп переменной.

Дубликаты не найдены

вот этот вариант я ждал

В моей первой среде программирования такое не канало. А если расстояние между кубиками было неизвестно, то еще и рекурсия применялась. 5 класс общеобразовательной школы.

В условиях ошибка. Правильное условие — без ЯВНОГО использования дополнительной переменной.

Первая ассоциация после второй картинки. Надеюсь, кто-то знает что это (к программированию отношения не имеет).

Если память не изменяет, это чит-код из Алладина на Сеге.

Это ближе к искусству, чем яйца, прибитые к мостовой

сокращенный вид моего кода #comment_56241488
но мне нравится)


Кстати, для вариант «предложенный С» не является корректным. Что если значение a + b > чем допустимо в integer ?

Всё норм, через переполнение туда-обратно пройдётся, делов-то. Ни один бит не потеряется.

Что если значения а и б вообще строковые?) или булевые)

А для этого, надо читать задание: «swap integers . «

Суть задачи не в том, чтобы поменять переменные местами, а в том чтобы сделать это с минимальным выделением мусора, желательно в регистре. Естественно, пистон, жаба и даже плюсы здесь сразу проигрывают.

чо, к пайтону типы еще не прикрутили? тогда нинужно.

Мне кажется, или в процах нет инструкции, для «обмена» значений переменных? А значит сама задача поставлена некорректно.

Ассемблер тоже компилятор, преобразующий «текст» в исполняющий код.

XCHG op1, op2 — обмен операндов.

Возможен обмен между регистром и ячейкой памяти или обмен между регистрами.

На флаги не влияет.

Т.е., хоть и без ведома программиста, но используется дополнительная переменная. А значит, условия нарушены.

регистры обменяются без дополнительной переменной

регистр и память обменяются без дополнительной переменной

а вот память — память командой xchg не обменять

а такая конструкция

без «ведома» сгенерируется только вспомогательным макросом например.

Ну в чем то ты прав — если переменные хранятся в регистрах (хотя бы одно из них), то все условия будут выполнены. Меня настораживает только то, что в условия задачи не сказано об этом, а значит подразумеваются «любые переменные», в т.ч. память — память.

Где то читал, что это типовая задача — поменять местами значение двух переменных. И истинно правильным решением будет создание буферной переменной, сколько бы об этом не спорили. Причем, не оговаривалось, что переменная будет именно числовая, подразумевался хоть пользовательский класс. Другое дело, что задачу об обмене значениями переменных перевели в «пространство адресов» (поменять местами куда ссылаются переменные), хоть об этом и не было явно сказано в условии.

А так да, согласен, XCHG выполняет поставленную задачу, при выполнении условия, что хотя бы одна переменная находится в регистре.

Поменяйте каждую пару бит в байте

Это был вопрос, заданный представителем NVIDIA на ярмарке карьеры:

Напишите небольшой эффективный код для замены каждой пары бит внутри байта; например, 10 11 01 10 должен стать 01 11 10 01 .

Есть ли более эффективный способ сделать это, чем прохождение цикла for через любой другой индекс? Мой код был небольшим, но я не могу придумать, насколько более «эффективный» он мог бы получить, чем цикл. Я предполагаю, что может быть способ использовать XOR, чтобы избежать цикла, но я не могу выясните это.

Вы можете использовать таблицу поиска с 256 выводами.

В качестве альтернативы ((x & 0x55) > 1) .

Что-то вроде этого должно работать

i >> 1 сдвигает все на 1 бит вправо, а & 01010101 оставляет только бит в четном положении.
Вторая часть касается нечетных позиций бит в том же fasion.

Как поменять местами биты в байте?

Доброго времени суток, прошу помощи. Необходимо в числе 120 поменять местами биты (0 и 1, 2 и 3, 4 и 7, 5 и 6) . Вообще не представляю как это можно сделать.

2 ответа 2

Если изначально число в al , то можно так:

На C/C++ это выглядит так:


Напишу алгоритм схематически, а уже Вы переводите его в целевой ассемблер.

Подобные перемещения реализуем так — выделяем бит, двигаем, прикладываем.

Так как я не знаю целевого ассемблера, буду писать на условном. Пусть в регистре A исходное число, B — результат, C — воспомогательный

и так продолжаем двигать остальные биты. Конечно, учитывая, что нужно обменять 0-1 и 2-3, их можно двигать одновременно, просто маска будет 0x5 и 0xA

Если в задаче нет ошибки и обменять нужно именно попарно биты, то это можно сделать кодом выше, просто применив маски 0x55 и 0xAA

mikele85 › Блог › [Tech] Создаем конвертер VBF to BIN

Те кто касался прошивок двигателя, а точнее PCM-модуля знаком с файлами прошивок в формате VBF. Вообще VBF файлы используют многие производители автомобилей: Volvo, Ford, Mazda, Land Rover и др. Однако, для загрузки прошивки сторонними загрузчиками/флешерами используется другой формат файла, а именно BIN. Многие загрузчики (kess, pcmflash, mmcflash и др.) работают именно с ним.

Как же преобразовать VBF-файл в BIN-файл? Какова структура VBF-файла?

Думаю, что некоторые из Вас задавалися этим вопросом. Скрывать тут особо нечего. Вся информация доступна в интернете, нужно лишь правильно задавать вопросы поисковой системе.

Если вбить в www.google.ru запрос: vbf file и перейти в отображение картинок, то одной из первых появится следующая картинка.

Как мы видим vbf файл состоит из двух частей:
1. Header — заголовок
2. Blocks — блоки данных

Илон Маск рекомендует:  Что такое код swfsprite >setframes

Где последние имеют следующую структуру (например, когда в vbf всего 3 блока):
[4 byte — address block1]
[4 byte — length block1]
[x byte — data block1]
[2 byte — CRC16 CCITT of block1]

[4 byte — address block3]
[4 byte — length block3]
[x byte — data block3]
[2 byte — CRC16 CCITT of block3]

Блоки следует один за другим.

Также поисковые системы выдают ещё интересную программу — VBF Tool.

На основе выше описанной информации была создана программа VBF Parser в среде Visual Studio на языке C#.

А как это было сделано смотрите в следующем видео.

Update 26.07.2020:
Про просьбе seregawoof выкладываю видео работы программы VBF Tool. Программа позволяет просматривать VBF-файлы, а также создавать свои.
Кстати, VBF расшифровывается как Versatile Binary Format = Универсальный Бинарный Формат

PS:
Сразу оговорюсь, что я не программист. Скорей любитель. Посему буду благодарен любой критике.

PPS:
Исходники проекта в открытый доступ выкладывать не буду.
Кому интересно — пишите в личку.

PPPS:
Цель поста — немного приоткрыть завесу тайны по теме VBF-файлов.
Как и везде VBF-файлы имеют некоторые нюансы. Например, блоки данных могут быть сжаты или зашифрованы. Об этом нам скажет параметр data_format_identifier в заголовочной части.

Swab попарно поменять байты

все что посвящено электронике и общению специалистов. реклама других ресурсов.

В помощь начинающему

вопросы начального уровня

International Forum

This is a special forum for English spoken people, read it first.

Образование в области электроники

все что касается образования, процесса обучения, студентам, преподавателям.

Обучающие видео-материалы и обмен опытом

Обсуждение вопросов создания видео-материалов

Cистемный уровень проектирования

    Последнее сообщение


Вопросы системного уровня проектирования

Применение MATLAB, Simulink, CoCentric, SPW, SystemC ESL, SoC

Математика и Физика

Операционные системы

Linux, Win, DOS, QNX, uCOS, eCOS, RTEMS и другие

Документация

оформление документации и все что с ней связано

Разработка цифровых, аналоговых, аналого-цифровых ИС

Электробезопасность и ЭМС

Обсуждение вопросов электробезопасности и целостности сигналов

Управление проектами

Управление жизненным циклом проектов, системы контроля версий и т.п.

Нейронные сети и машинное обучение (NN/ML)

Форум для обсуждения вопросов машинного обучения и нейронных сетей

Программируемая логика ПЛИС (FPGA,CPLD, PLD)

    Последнее сообщение

Среды разработки — обсуждаем САПРы

Quartus, MAX, Foundation, ISE, DXP, ActiveHDL и прочие.
возможности, удобства.

Работаем с ПЛИС, области применения, выбор

на чем сделать? почему не работает? кто подскажет?

Языки проектирования на ПЛИС (FPGA)

Verilog, VHDL, AHDL, SystemC, SystemVerilog и др.

Системы на ПЛИС — System on a Programmable Chip (SoPC)

разработка встраиваемых процессоров и периферии для ПЛИС

Цифровая обработка сигналов — ЦОС (DSP)

    Последнее сообщение

Сигнальные процессоры и их программирование — DSP

Обсуждение различных сигнальных (DSP) процессоров, возможностей, совместимости и связанных с этим тем.

Алгоритмы ЦОС (DSP)

Обсуждение вопросов разработки и применения (программирования) алгоритмов цифровой обработки сигналов.

Микроконтроллеры (MCs)

    Последнее сообщение

Cредства разработки для МК

FAQ, How-to, тонкости работы со средствами разработки

MSP430

Все остальные микроконтроллеры

и все что с ними связано

Отладочные платы

Вопросы, связанные с отладочными платами на базе МК: заказ, сборка, запуск

Печатные платы (PCB)

    Последнее сообщение

Разрабатываем ПП в САПР — PCB development

FAQ, вопросы проектирования в ORCAD, PCAD, Protel, Allegro, Spectra, DXP, SDD, WG и др.

Работаем с трассировкой

тонкости PCB дизайна, от Spectra и далее.

Изготовление ПП — PCB manufacturing

Фирмы, занимающиеся изготовлением, качество, цены, сроки

Сборка РЭУ


    Последнее сообщение

Пайка, монтаж, отладка, ремонт

вопросы сборки ПП, их отладки, различного рода ремонт

Корпуса

обсуждаем какие есть копруса, где делать и прочее

Вопросы надежности и испытаний

расчеты, методики, подбор компонентов

Аналоговая и цифровая техника, прикладная электроника

    Последнее сообщение

Вопросы аналоговой техники

пока помещаются в одном форуме

Цифровые схемы, высокоскоростные ЦС

High Speed Digital Design

Rf & Microwave Design

wireless технологии и не только

Метрология, датчики, измерительная техника

Все что связано с измерениями: измерительные приборы (осциллографы, анализаторы спектра и пр.), датчики, обработка результатов измерений, калибровка, технологии измерений и др.

АВТО электроника

особенности электроники любых транспортных средств: автомашин и мотоциклов, поездов, судов и самолетов, космических кораблей и летающих тарелок.

Умный дом

3D печать

3D принтеры, наборы, аксессуары, ПО

Робототехника

Модели, классификация, решения, научные исследования, варианты применения

Силовая Электроника — Power Electronics


    Последнее сообщение

Силовая Преобразовательная Техника

Источники питания электронной аппаратуры, импульсные и линейные регуляторы. Топологии AC-DC, DC-DC преобразователей (Forward, Flyback, Buck, Boost, Push-Pull, SEPIC, Cuk, Full-Bridge, Half-Bridge). Драйвера ключевых элементов, динамика, алгоритмы управления, защита. Синхронное выпрямление, коррекция коэффициента мощности (PFC)

Обратная Связь, Стабилизация, Регулирование, Компенсация

Организация обратных связей в цепях регулирования, выбор топологии, обеспечение стабильности, схемотехника, расчёт

Первичные и Вторичные Химические Источники Питания

Li-ion, Li-pol, литиевые, Ni-MH, Ni-Cd, свинцово-кислотные аккумуляторы. Солевые, щелочные (алкалиновые), литиевые первичные элементы. Применение, зарядные устройства, методы и алгоритмы заряда, условия эксплуатации. Системы бесперебойного и резервного питания

Высоковольтные Устройства — High-Voltage

Высоковольтные выпрямители, умножители напряжения, делители напряжения, высоковольтная развязка, изоляция, электрическая прочность. Высоковольтная наносекундная импульсная техника

Электрические машины, Электропривод и Управление

Электропривод постоянного тока, асинхронный электропривод, шаговый электропривод, сервопривод. Синхронные, асинхронные, вентильные электродвигатели, генераторы

Индукционный Нагрев — Induction Heating

Технологии, теория и практика индукционного нагрева

Системы Охлаждения, Тепловой Расчет – Cooling Systems

Охлаждение компонентов, систем, корпусов, расчёт параметров охладителей

Моделирование и Анализ Силовых Устройств – Power Supply Simulation

Моделирование силовых устройств в популярных САПР, самостоятельных симуляторах и специализированных программах. Анализ устойчивости источников питания, непрерывные модели устройств, модели компонентов

Компоненты Силовой Электроники — Parts for Power Supply Design

Силовые полупроводниковые приборы (MOSFET, BJT, IGBT, SCR, GTO, диоды). Силовые трансформаторы, дроссели, фильтры (проектирование, экранирование, изготовление), конденсаторы, разъемы, электромеханические изделия, датчики, микросхемы для ИП. Электротехнические и изоляционные материалы.

помогите составить текст программы на ассемблере для задачи «Поменять местами байты в 16-битном двоичном числе»

положим, число засунуто в регистр х (r26,r27), тремя способами меняем (типа такого https://otvet.mail.ru/question/170529783 ):

.include «m8535def.inc»
.cseg
.org 0x0000
rjmp start

.org 0x0020
start:
;запись в регитр x числа 1234h
ldi xl,low(0x1234)
ldi xh,high(0x1234)

;меняем местами через «пустое ведро»
mov r0,xl
mov xl,xh
mov xh,r0

;меняем местами ксором
eor xl,xh
eor xh,xl
eor xl,xh

;меняем местами сдвигом
ldi r16,8
m1:
clc
rol xl
rol xh
brcc m2
inc xl
m2:
dec r16
brne m1

Swab попарно поменять байты

Задача: PIC16, ASM.

Есть два байта информации (10-битный АЦП).

Нужно эти 10 бит сравнить с какими-то определёнными числами и сделать в программе соответствующее ветвление.

Раньше я работал с АЦП так: выбирал левое выравнивание и работал только с ADRESH, теряя таким образом 2 младших бита. Точность была не нужна.

Сейчас нужны все 10 бит. В связи с этим вопрос: как рассмотреть 2 байта информации как одно целое? В голову приходят какие-то топорные методы, для реализации которых нужно немало машинного времени. Может, есть какие-то красивые и эффективные решения?

Ну вот смотри. Для примера: надо сделать ветвление: если значение АЦП больше 450, то сделать А, если меньше — сделать B.

d’450′ = b’ 00000001 11000010 ‘

Что с точки зрения бинарной системы счисления и 8-битного асма означает, что число X, полученное в результате преобразования, меньше этого числа 450?

Старший байт должен быть меньше или равен 1-це.
Младший байт должен быть строго меньше 11000010.

Задача: PIC16, ASM.

Есть два байта информации (10-битный АЦП).

Нужно эти 10 бит сравнить с какими-то определёнными числами и сделать в программе соответствующее ветвление.

Раньше я работал с АЦП так: выбирал левое выравнивание и работал только с ADRESH, теряя таким образом 2 младших бита. Точность была не нужна.

Сейчас нужны все 10 бит. В связи с этим вопрос: как рассмотреть 2 байта информации как одно целое? В голову приходят какие-то топорные методы, для реализации которых нужно немало машинного времени. Может, есть какие-то красивые и эффективные решения?

А что за задача в общих чертах? Может это сравнивание двух 16 битных чисел и не нужно?

Задача чрезвычайно проста: на АЦП через делитель заведён выход импульсного преобразователя, на который поступает ШИМ от микроконтроллера. Нужно стабилизировать напряжение на выходе преобразователя на определённом уровне. Обратная связь, короче. Вот тут (http://www.microchip.su/showthread.php?t=11518+) я описал задачу. Можно было бы использовать компаратор и модуль VREF, но обработка данных от компаратора мне показалась чуть сложнее, чем от АЦП. Заодно вот возможность познакомиться с 16разрядными данными выпала, давно хотел разобраться.

Спасибо всем за советы, друзья. Прочитал статьи, многое понял, ещё больше пока не понял (особенно во 2-й :)), но основное усвоил. Сделал в итоге по методу, предложенному korsaj и tester, в Протеусе код работоспособен и отлично стабилизирует напряжение на выходе импульсника. И сравнение действительно занимает совсем немного времени. Осталось понять, почему реальная схема чудит :) а именно «стабилизирует» напряжение на выходе не тогда, когда на делителе 2 В (как указано в прошивке), а когда на нём 1,8 В. Подцеплял отдельно БП к АЦП, подавал напряжение им — всё равно порог в 1.8 В остался. Чудеса в решете :)

Если просто П-регулятор то можно и компаратор использовать. Он по быстрее будет чем АЦП PIC16 + обработка.

Алгоритм с компаратором мне кажется проще.
Таймером задаешь любую нужную частоту в прерывании(частота ШИМ).
В прерывании таймера врубаешь ключ. И ждешь пока напряжение на сенсоре не будет нарастать. Когда достигнет порога компаратор сработает.
В прерывании компаратора отрубаешь ключ.

Для компаратора требуется опорное напряжение которое можно создать с помощью его модуля напряжения или используя аппаратный ШИМ как ЦАП. Во втором случае имеем большое разрешение.

Вроде так. Делал как то раньше для стабилизации мощности обмоток шагового двигателя.

Ещё вопрос возник, тоже по двухбайтному числу.

Собственно есть двухбайтное число в пределах 0 — d’10 000′, мне нужно раскидать это число по разрядам. То есть узнать первую десятичную цифру числа, вторую, третью, четвёртую и пятую по отдельности. Делается это для вывода этих цифр на семисегментный индикатор. Как мне поступить? В голову не приходит совсем ничего. :(

Не совсем понятно. Я чтобы получить из числа десятки сотни и т.д. просто вычитал соответственно 10, 100 и т.д. сколько раз вычтишь (до заема) столько и десятков.
Гениально. Спасибо:)

А если задача стоит немного по-другому? Например, есть число 12345 — двенадцать тысяч триста сорок пять. Мне нужно разложить это число на пять: «1», «2», «3», «4» и «5». Как это сделать?:)

1. Вычисть 10000 до появления заема десятки тысяч сохр. остаток (12345-10000=2345 — это остаток)
2. Вычисть 1000 до появления заема тысячи сохр. остаток (2345-1000-1000=345 — это остаток после двух вычитаний)
3. Вычисть 100 до появления заема сотни сохр. остаток (345-100-100-100=45 — это остаток (3- выч.))
4. Вычисть 10 до появления заема десятк сохр. остаток (45-10-10-10-10=5 — это остаток (4- выч.))
5. Остаток после вычитания 10 до появления заема еденицы.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL