Режимы адресации на языке ассемблера (NASM IA-32)
поскольку веб-ресурсы на этом разрежены, я, в интересах будущих поисков, начну с перечисления режимов адреса для языка сборки IA-32 (NASM), а затем продолжу быстрый вопрос.
- регистр адресации
- mov eax, ebx: копирует то, что находится в ebx в eax
- mov esi, var: копирует адрес var (скажем 0x0040120e) в esi
- немедленная адресация (второй операнд является немедленным постоянный)
- mov bx, 20: 16-битный регистр bx получает фактическое значение 20
- прямая адресация памяти (непосредственно загружается из памяти по указанному адресу)
- mov ax, [1000h]: загружает 2-байтовый объект из байта по адресу 4096 (0x1000 в шестнадцатеричном формате) в 16-битный регистр под названием "ax"
- mov [1000h], ax: память по адресу 1000h получает значение ax
- прямая адресация смещения (такая же, как 3, просто используя арифметику для изменения адреса)
- mov al, [byte_tbl+2]
- Регистрация косвенная (доступ к памяти с помощью адресов, хранящихся в регистрах)
- 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
мой вопросы:
- не должно ли "MOV EBX, [MY_TABLE] "на самом деле быть" MOV EBX, MY_TABLE", поскольку мы хотим поместить адрес таблицы в EBX, а не само значение?
- конечно, это MY_TABLE[2], который равен 123 в конце, а не MY_TABLE[1]?
2 ответов
в синтаксисе NASM эта инструкция должна быть
MOV EBX, MY_TABLE
. Что?!--1--> будет делать, это загрузить первые 4 байта, расположенные вMY_TABLE
наEBX
. Другой альтернативой было бы использоватьLEA
, а вLEA EBX, [MY_TABLE]
.в этом случае учебник-это право.
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
поместит адрес в реестр.