симметричное отображение

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Akimich
Сообщения: 6
Зарегистрирован: 06 июл 2010, 07:09

Формулировка задачи: Реализуйте с помощью логических операций симметричное отображение старшего байта слова на младший байт с потерей исходных значений. Искал в интернете и книгах , но не нашел что такое симметричное отображение байтов. Помогите пожалуйста, заранее спасибо.
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

было: 10100111 00000000
стало: 10100111 11100101
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Я понимаю такую формулировку, как преобразование битов старшего байта и формирование новых битов младшего байта таким образом, что 15 бит = 0 биту, 14 = 1, 13 = 2 и т.д. Таким образом получим симметрию относительно "границы" младшего и старшего байта :) Допустим в AH мы имеем некоторое значение, которое нужно симметрично отразить в AL.
Разумеется одним из самых быстрых и оптимальных методов реверса является составление 256-байтовой таблицы соответствия. Это выгодно, если реверс битов запускается очень часто. Вторым по популярности и простоте является метод сдвига ROL - ROR двух регистров. А если обязательно через логические операции, то примерно так:

Код: Выделить всё

...
xor al, al
test ah, 128
jz @bit6
or al, 1
@bit6: test ah, 64
jz @bit5
or al, 2
...
и так далее. В данном примере преобразование без потерь значения в AH. Надо заметить что используя только лишь логические операции невозможно выполнить данное преобразование. Понадобятся как минимум команды перемещения ну или хотя бы условного перехода, сдвига.

Для процессоров класса 386/486 можно использовать BT, но врядли это даст какой либо выигрыш.
В некоторых семействах процессоров (не х86) есть специальная команда SWAP, которая собственно только этим и занимается, что переворачивает байт задом наперед.
It's a long way to the top if you wanna rock'n'roll
Akimich
Сообщения: 6
Зарегистрирован: 06 июл 2010, 07:09

somewhere, спасибо за ваш исчерпывающий ответ :) Эту программу мне нужно сделать как ассемблерную вставку в C++,но она не работает

Код: Выделить всё

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;
error C2443: конфликт размеров операндов в строчке MOV rez,ax
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

1. Последовательность команд

Код: Выделить всё

xor al, al
or al, ah
эквивалентна команде mov 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
Akimich
Сообщения: 6
Зарегистрирован: 06 июл 2010, 07:09

Спасибо всем, разобрался с этой задачей.
Ra88
Сообщения: 1
Зарегистрирован: 26 сен 2010, 12:45

Операции сдвига являются логическими операциями :)
Ответить