симметричное отображение
Модератор: Andy
Формулировка задачи: Реализуйте с помощью логических операций симметричное отображение старшего байта слова на младший байт с потерей исходных значений. Искал в интернете и книгах , но не нашел что такое симметричное отображение байтов. Помогите пожалуйста, заранее спасибо.
-
- Сообщения: 270
- Зарегистрирован: 09 янв 2010, 04:14
- Контактная информация:
было: 10100111 00000000
стало: 10100111 11100101
стало: 10100111 11100101
Я понимаю такую формулировку, как преобразование битов старшего байта и формирование новых битов младшего байта таким образом, что 15 бит = 0 биту, 14 = 1, 13 = 2 и т.д. Таким образом получим симметрию относительно "границы" младшего и старшего байта
Допустим в AH мы имеем некоторое значение, которое нужно симметрично отразить в AL.
Разумеется одним из самых быстрых и оптимальных методов реверса является составление 256-байтовой таблицы соответствия. Это выгодно, если реверс битов запускается очень часто. Вторым по популярности и простоте является метод сдвига ROL - ROR двух регистров. А если обязательно через логические операции, то примерно так:
и так далее. В данном примере преобразование без потерь значения в AH. Надо заметить что используя только лишь логические операции невозможно выполнить данное преобразование. Понадобятся как минимум команды перемещения ну или хотя бы условного перехода, сдвига.
Для процессоров класса 386/486 можно использовать BT, но врядли это даст какой либо выигрыш.
В некоторых семействах процессоров (не х86) есть специальная команда SWAP, которая собственно только этим и занимается, что переворачивает байт задом наперед.

Разумеется одним из самых быстрых и оптимальных методов реверса является составление 256-байтовой таблицы соответствия. Это выгодно, если реверс битов запускается очень часто. Вторым по популярности и простоте является метод сдвига ROL - ROR двух регистров. А если обязательно через логические операции, то примерно так:
Код: Выделить всё
...
xor al, al
test ah, 128
jz @bit6
or al, 1
@bit6: test ah, 64
jz @bit5
or al, 2
...
Для процессоров класса 386/486 можно использовать BT, но врядли это даст какой либо выигрыш.
В некоторых семействах процессоров (не х86) есть специальная команда SWAP, которая собственно только этим и занимается, что переворачивает байт задом наперед.
It's a long way to the top if you wanna rock'n'roll
somewhere, спасибо за ваш исчерпывающий ответ
Эту программу мне нужно сделать как ассемблерную вставку в C++,но она не работает
error C2443: конфликт размеров операндов в строчке MOV rez,ax

Код: Выделить всё
void main(void)
{
setlocale(LC_ALL,"Russian"); //установка локали в русскую, чтобы работала кирилица
//инициализация целочисленных переменных
std::cout << "3-8. Реализуйте с помощью логических симметричное отображение старшего байта слова на младший байт с потерей исходных значений. "<< "\n";
unsigned char rez=0;
__asm
{
MOV ax,1234h
XOR al,al
or al,ah
ROR al,4
MOV rez,ax
}
std::cout << "При расчет на языке Assembler получилось: " <<rez;
getch();
return;
1. Последовательность команд
эквивалентна команде mov al, ah
2. ROR не является логической операцией - это операция сдвига
3. rez объявлен как unsigned char, значит он размером в байт. Следует использовать mov rez, al. С другой стороны нужно видеть оба байта, старший и младший. Тогда нужно делать rez типа int
Код: Выделить всё
xor al, al
or al, ah
2. ROR не является логической операцией - это операция сдвига
3. rez объявлен как unsigned char, значит он размером в байт. Следует использовать mov rez, al. С другой стороны нужно видеть оба байта, старший и младший. Тогда нужно делать rez типа int
It's a long way to the top if you wanna rock'n'roll
Спасибо всем, разобрался с этой задачей.
Операции сдвига являются логическими операциями 
