В чем разница между этими режимами адресации?

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

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.
Другие вопросы по тегам