Режимы адресации на языке ассемблера (NASM IA-32)

поскольку веб-ресурсы на этом разрежены, я, в интересах будущих поисков, начну с перечисления режимов адреса для языка сборки IA-32 (NASM), а затем продолжу быстрый вопрос.

  1. регистр адресации
    • mov eax, ebx: копирует то, что находится в ebx в eax
    • mov esi, var: копирует адрес var (скажем 0x0040120e) в esi
  2. немедленная адресация (второй операнд является немедленным постоянный)
    • mov bx, 20: 16-битный регистр bx получает фактическое значение 20
  3. прямая адресация памяти (непосредственно загружается из памяти по указанному адресу)
    • mov ax, [1000h]: загружает 2-байтовый объект из байта по адресу 4096 (0x1000 в шестнадцатеричном формате) в 16-битный регистр под названием "ax"
    • mov [1000h], ax: память по адресу 1000h получает значение ax
  4. прямая адресация смещения (такая же, как 3, просто используя арифметику для изменения адреса)
    • mov al, [byte_tbl+2]
  5. Регистрация косвенная (доступ к памяти с помощью адресов, хранящихся в регистрах)
    • mov ax, [di]: копирует значение по адресу памяти, указанному di, в ax
    • mov dword [eax], var1: копирует значение в var1 в слот памяти, указанный eax

обратите внимание, что выше для NASM. Для MASM / TASM вы бы использовали " mov esi, Смещение фу", чтобы получить адрес, а "мову" Эси "foo" и "мову" Эси " [фу]" как бы получить значение (удостоверение к @Майкл).

Итак, на мой вопрос. Это относится к примеру в нижней части страницы 29 следующего учебника:http://www.tutorialspoint.com/assembly_programming/assembly_tutorial.pdf

он в основном перечисляет приведенный ниже код в качестве примера косвенной адресации памяти.

MY_TABLE TIMES 10 DW 0 ; Allocates 10 words (2 bytes) each initialized to 0 
MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX 
MOV [EBX], 110 ; MY_TABLE[0] = 110 
ADD EBX, 2 ; EBX = EBX +2 
MOV [EBX], 123 ; MY_TABLE[1] = 123 

мой вопросы:

  1. не должно ли "MOV EBX, [MY_TABLE] "на самом деле быть" MOV EBX, MY_TABLE", поскольку мы хотим поместить адрес таблицы в EBX, а не само значение?
  2. конечно, это MY_TABLE[2], который равен 123 в конце, а не MY_TABLE[1]?

2 ответов


  1. в синтаксисе NASM эта инструкция должна быть MOV EBX, MY_TABLE. Что?!--1--> будет делать, это загрузить первые 4 байта, расположенные в MY_TABLE на EBX. Другой альтернативой было бы использовать LEA, а в LEA EBX, [MY_TABLE].

  2. в этом случае учебник-это право. MY_TABLE определяется как массив слов. Слово на x86 составляет 2 байта, поэтому второй элемент MY_TABLE действительно расположен в MY_TABLE + 2.


этот учебник даже не является допустимым кодом NASM. Для ссылок на x86 руководства / ресурсы / руководства, которые не отстой, см. тег x86 wiki вот так.

MOV [EBX], 110 не будет собираться, потому что ни один операнд не подразумевает размер операнда. (Я думаю, что даже MASM не соберет его, но некоторые плохие ассемблеры, такие как emu8086, имеют размер операнда по умолчанию для таких инструкций.) mov word [ebx], 110 будет делать 16-битный магазине.

MOV EBX, [MY_TABLE] будет собрать но он загружает первые 2 слова из таблицы. mov ebx, MY_TABLE поместит адрес в реестр.