Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/2256: Рейтинг темы: голосов - 2256, средняя оценка - 4.63
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16379 / 7691 / 1080
Регистрация: 11.11.2010
Сообщений: 13,771
10.11.2013, 18:54  [ТС]
ГЛАВА 7
КОМАНДЫ ПЕРЕДАЧИ ДАННЫХ
(часть 2/2)


Команда LEA
(Загрузка эффективного адреса = "Load Effective Address")
Синтаксис команды: LEA <DEST>,<SRC>
LEA <DEST>,[<Base>+<Index>*<Scale>+<смещение>]
где <Scale>1,2,4 или 8
Возможные варианты команды:
lea r(16/32/64), mem
Семантика команды: получить в регистр DEST эффективный адрес (смещение) операнда SRC.
Алгоритм работы: алгоритм работы команды зависит от действующего режима адресации (use 16/use 32 или use 64):
  • если use 16, то в регистр DEST загружается 16-битное значение смещения операнда SRC ;
  • если use 32, то в регистр DEST загружается 32-битное значение смещения операнда SRC;
  • если use 64, то в регистр DEST загружается 64-битное значение смещения операнда SRC.
Псевдокод команды LEA:
IF OperandSize = 16 and AddressSize = 16
THEN DEST <-- EffectiveAddress(SRC); 16-битная адресация
ELSE IF OperandSize = 16 и AddressSize = 32
THEN temp<-- EffectiveAddress(SRC); 32-битная адресация
DEST <-- temp[0:15]; 16-битная адресация
ENDIF;
ELSE IF OperandSize = 32 и AddressSize = 16
THEN temp<-- EffectiveAddress(SRC); 16-битная адресация
DEST <-- ZeroExtend(temp); 32-битная адресация
ENDIF;
ELSE IF OperandSize = 32 и AddressSize = 32
THEN DEST <-- EffectiveAddress(SRC); 32-битная адресация
ENDIF;
ELSE IF OperandSize = 16 и AddressSize = 64
THEN temp<-- EffectiveAddress(SRC); 64-битная адресация
DEST <-- temp[0:15]; 16-битная адресация
ENDIF;
ELSE IF OperandSize = 32 и AddressSize = 64
THEN temp<-- EffectiveAddress(SRC); 64-битная адресация
DEST <-- temp[0:31]; 16-битная адресация
ENDIF;
ELSE IF OperandSize = 64 и AddressSize = 64
THEN DEST<-- EffectiveAddress(SRC); 64- битная адресация
ENDIF;
ENDIF;
Применение: код эквивалентной команды mov ebx, offset adr короче кода lea ebx, adr
Символическое представление инструкцииМашинный код инструкцииАссемблерные команды
mov ebx, offset adr BBF9004000 mov ebx,0004000F9h
lea ebx, adr 8D1DF9004000 lea ebx,[004000F9h]
Использование команды lea
Для сложения lea eax,[eax+ebx]=add eax,ebx
Для инкремента lea eax,[eax+1]
Для декремента lea eax,[eax-1]
Для умножения на 2 lea eax,[eax+eax] или lea eax,[eax*2]
Для умножения на 3 lea eax,[eax+eax*2]
Для умножения на 4 lea eax,[eax*4]
Для умножения на 5 lea eax,[eax+eax*4]
Для умножения на 6 lea ecx,[eax*2] / lea eax,[ecx+ecx*2]
Для умножения на 7 lea ecx,[eax+eax*2] / lea eax,[ecx+eax*4]
Для умножения на 8 lea eax,[eax*8]
Для умножения на 9 lea eax,[eax+eax*8]
Команда lea eax,[ebx] эквивалент mov eax,ebx
Команда XCHG
(Обмен ="EXCHANGE operands")
В программах на языке ассемблера приходится довольно часто переставлять местами какие-то две величины, и хотя такую перестановку можно организовать с помощью двух команд MOV с сохранением значения в промежуточной ячейке памяти, в процессор введена специальная команда для этого.
Синтаксис команды: XCHG <SRC>,<DEST>
Семантика команды: обмен значений между двумя регистрами или между регистром и ячейкой памяти.
Алгоритм работы: обмен содержимым операнда SRC и операнда DEST.
Псевдокод команды:
TEMP<--DEST
DEST<-- SRC
SRC <--TEMP
Возможные варианты команды:
xchg reg, mem/reg
Применение: команду XCHG можно использовать для выполнения операции обмена двух операндов с целью изменения порядка следования байт, слов, двойных слов или их временного сохранения в регистре или памяти. Альтернативой является использование для этой цели стека или промежуточной ячейки памяти.
Assembler
1
2
3
4
5
;поменять порядок следования байт в ячейке памяти
H1 DW 0F85Ch ;напрямую командой XCHG нельзя, но
MOV AX,H1 ;можно для этой цели использовать
XCHG AH,AL ;промежуточный регистр AX
MOV H1,AX ;[H1]=5CF8h
Команду XCHG можно заменить на XOR или на PUSH/POP, или на MOV с использованием промежуточного регистра или промежуточной ячейки памяти.
Эквиваленты команды XCHG EAX,EBX
MOV [TEMP],EAX XOR EAX,EBX PUSH EAX
MOV EAX,EBX XOR EBX,EAX PUSH EBX
MOV EBX,[TEMP] XOR EAX,EBX POP EAX
  POP EBX
Команда обмена байтов BSWAP
(обмен байтами "BYTE SWAPING")
Синтаксис команды: BSWAP <DEST>
Возможные варианты команды:
bswap reg(16/32/64)
Семантика команды: команда BSWAP изменяет порядок следования байтов в 32-разрядных регистрах, конвертируя значения из вида машинного представления (младшая часть, старшая часть) в обычное представление (старшая часть, младшая часть) и наоборот. Можно использовать для примитивного шифрования.
Псевдокод команды BSWAP:
TEMP<--DEST
IF 64-bit mode AND OperandSize = 64
THEN
DEST[7:0]<--TEMP[63:56]
DEST[15:8]<--TEMP[55:48]
DEST[23:16]<--TEMP[47:40]
DEST[31:24]<--TEMP[39:32]
DEST[39:32]<--TEMP[31:24]
DEST[47:40]<--TEMP[23:16]
DEST[55:48]<--TEMP[15:8]
DEST[63:56]<--TEMP[7:0]
ELSE
DEST[7:0]<--TEMP[31:24]
DEST[15:8]<--TEMP[23:16]
DEST[23:16]<--TEMP[15:8]
DEST[31:24]<--TEMP[7:0]
ENDIF;
Assembler
1
2
mov eax,12345678h
bswap eax ;eax=78563412h
увеличим третий байт регистра EAX на единицу (не сам регистр)
Assembler
1
2
3
4
mov eax,87654321h
bswap eax;eax=21436587h
inc al
bswap eax;eax=88654321h
Использование BSWAP с 16-разрядными регистрами дает неожиданные результаты
Assembler
1
2
mov eax,12345678h
bswap ax;eax = 12340000h
при этой команде содержимое старшей части регистра ЕАХ недоступно (хотя процессор старшую часть регистра всёравно должен видеть) и поэтому происходит обнуление регистра АХ.
Оператор указания типа (PTR)
По команде MOV можно переслать как байт и слово, так и двойное слово. А как узнать, что именно – байт или слово – пересылает команда? Не может ли получиться так, что мы хотели переслать слово, а оказалось, что команда пересылает байт? Размер пересылаемой величины обычно определяется по типу операндов, указанных в команде MOV.
Пример:
Assembler
1
2
3
4
5
6
X DB ? ;TYPE X = BYTE
Y DW ? ;TYPE Y = WORD
MOV BH,0 ;пересылка байта
MOV X,0;пересылка байта (X описан как имя байтовой переменной)
MOV ESI,0 ;пересылка двойного слова
MOV Y,0 ;пересылка слова (Y описан как имя переменной-слова)
Обратите внимание, что по второму операнду (0) нельзя определить, какого он размера: ноль может быть и байтом (00h), и словом (0000h), и двойным словом (00000000h).
Если можно определить размеры обоих операторов, тогда эти размеры должны совпадать (либо байты, либо слова, либо двойные слова), иначе ассемблер зафиксирует ошибку.
Пример:
Assembler
1
2
3
4
5
MOV DI,ES ;пересылка слова
MOV CH,X ;пересылка байта
MOV ESI,AX ;ошибка (ESI регистр размером в двойное
;слово, AX регистр размером в слово)
MOV BH,300;ошибка – BH байтовый регистр, а 300 не может быть байтом
Оператор переопределения типа PTR (от POINTER, указатель) применяется для переопределения или уточнения типа метки или переменной, определяемой выражением. Оператор переопределения типа PTR записывается следующим образом:
<тип> PTR <выражение>
Тип может принимать одно из следующих значений: BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR, а выражение может быть константным или адресным. Оператор PTR используется с атрибутами BYTE, WORD, DWORD и т.д. для локальной отмены определенных типов (DB, DW и т.д.) или с атрибутами NEAR, FAR для отмены значения дистанции по умолчанию.
Если указано константное выражение, то оператор говорит о том, что значение этого выражения (число) должно рассматриваться языком ассемблера как величина указанного типа (размера); например, BYTE PTR 0 – это ноль как байт, а WORD PTR 0 – это ноль как слово.
Если же указано адресное выражение, то оператор показывает, что адрес, являющийся значением выражения, должен восприниматься языком ассемблера как адрес ячейки указанного типа (размера); например, WORD PTR A – адрес A обозначает слово (байты с адресами A и A+1). В данном случае оператор PTR относится к адресным выражениям.
Контрольные вопросы и упражнения
  1. Верны ли приведённые ниже команды:
    1. mov ax, –4;
    2. mov ax,bl;
    3. mov ax,1000h;
    4. mov dl,ax;
    5. mov [1000h],–16;
    6. mov ax,ax;
    7. mov ds,ax;
    8. mov bl,al;
    9. mov ds,1000h;
    10. mov ip,cx?
  2. Пусть базовая единица информации компьютера содержит 12 бит, а в командах 3 бита задают режим каждого адреса, 4 бита – адрес каждого регистра, 24 бита – каждый адрес памяти и 8 бит – каждый адрес ввода/вывода. Определите:
    1. количество режимов адресации;
    2. число регистров;
    3. емкость и адресное пространство памяти;
    4. число адресов ввода/вывода;
    5. диапазон целых чисел с одинарной точностью в дополнительном коде;
    6. диапазон целых чисел с двойной точностью;
    7. диапазон двоично-десятичных упакованных чисел;
    8. примерный диапазон вещественных чисел с плавающей запятой, если для порядка отведено 12 бит и он представлен в двоичном дополнительном коде;
    9. примерную точность в значащих разрядах, если для мантиссы отведено 24 бита.
Миниатюры
Электронный учебник   Электронный учебник  
0
Закрытая тема Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru