В чем разница между этими режимами адресации?
В чем разница между регистром, косвенным, базовым + смещением, двойным косвенным и относительным для ПК. Я не совсем уверен, что понимаю, как различать эти разные режимы адресации, учитывая их использование в некоторых ситуациях. Может кто-нибудь, пожалуйста, помогите мне распознать разницу между ними?
1 ответ
Синтаксически на уровне ассемблерного кода режим адресации определяется несколькими факторами...
- используемый код OP (например, некоторые операции используют неявно определенные регистры или режимы адресации)
- операнды: ссылки на регистры, память или непосредственные значения
- некоторые директивы, такие как байтовые директивы, как в
MOV DWORD PTR ...
Однако операнд (ы) и синтаксис, который их окружает, как правило, являются наиболее важными в отношении определения режима адресации. Это можно проиллюстрировать с помощью операции x86 MOV, поскольку такой же или очень похожий синтаксис применяется к другим операциям на процессорах семейства x86. Аналогичный синтаксис и правила применяются к другим процессорам, но, конечно, различия в архитектуре, такие как список и роли регистров, а также другие различия делают следующее относительно специфичным для x86.MOV
приводит к копированию данных, на которые ссылается его второй аргумент, в местоположение, указанное его первым аргументом. Существует множество возможных комбинаций в отношении характера этих ссылок:
MOV <reg>, <reg> ; register to register
MOV <reg>, <mem> ; memory to register
MOV <mem>, <reg> ; register to memory
MOV <reg>, <const> ; immediate value to register
MOV <mem>, <const> ; immediate value to memory
Кроме того, эти ссылки могут быть косвенными, когда соответствующий операнд находится в скобках. Например MOV WORD PTR [ebx], 99
переместит значение 99, выраженное как 16-битное целое число, в область памяти, указанную регистром EBX.
Кроме того, косвенная ячейка памяти в скобках может быть выражена в виде простого арифметического выражения, такого как MOV [esi+eax], dl
, Здесь байт в регистре DL копируется в область памяти, найденную путем добавления содержимого регистров ESI и EAX. Обратите внимание, что это не должно быть просто два регистра, это также могут быть выражения типа [esi + 8*ebx]
или же [esi - 16]
и т.п.
Имея это в виду, вот несколько примеров работы MOV в контексте:
MOV eax, [edx] ; Copies 4 bytes in memory at the address contained in EDX
; into EAX the size (4bytes) is implied by the size of EAX.
MOV [MyVar], ebx ; Copies the contents of EBX into the 4 bytes at memory address
; MyVar. (Assumes MyVar is a 32-bit constant).
MOV eax, [esi-4] ; Copies 4 bytes at memory address ESI -4 into EAX
MOV [esi+eax], bl ; Copies the contents of BL (one byte) into the byte at address
; ESI+EAX
MOV BYTE PTR [MyVar], 123 ; Copies the (decimal) value 123 coded as an 8 bits
; to the memory address contained by MyVar.
; Here the size directive (BYTE PTR) is necessary.