Modos de endereçamento na Linguagem de montagem (IA-32 NASM)
- endereçamento do registo
- mov eax, ebx: copia o que está no ebx para eax
- mov esi, var: Copies address of var (say 0x0040120e) into esi
- endereçamento imediato (o segundo operando é uma constante imediata)
- mov bx, 20: 16-bit o registo bx recebe o valor real 20
- endereçamento directo da memória (carregamentos directos da memória através de um endereço especificado)
- mov ax, [1000h]: carrega um objecto de 2 bytes do byte no endereço 4096 (0x1000 em hexadecimal) para um registo de 16 bits chamado 'ax'
- mov [1000h], AX: memory at address 1000h gets the value of ax
- endereçamento em offset directo (igual a 3, apenas usando aritmética para modificar endereço)
- mov al, [byte_tbl+2]
- registar indirectamente (aceder à memória utilizando endereços armazenados em registos)
- mov ax, [di]: copies value at memory address specified by di, into ax
- mov dword [eax], var1: valor das cópias no var1 para a ranhura de memória especificada por eax
por favor, note que o acima é para NASM. Para MASM / TASM você usaria "mov esi, OFFSET foo" para obter o endereço, enquanto "mov esi, foo "e" mov esi, [foo] " ambos obteriam o valor (creds para @Miguel).
Então, para a minha pergunta. É em relação a um exemplo no final da Página 29 do seguinte tutorial: http://www.tutorialspoint.com/assembly_programming/assembly_tutorial.pdfele basicamente lista o código abaixo como um exemplo de endereçamento indireto de memória.
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
As minhas perguntas:
- não deve "MOV EBX, [MY_TABLE]" de fato ser "MOV EBX, MY_TABLE", pois queremos colocar o endereço da tabela no EBX, não o valor sozinho?
- certamente é MY_TABLE[2] que é igual a 123 no final, não MY_TABLE[1]?
2 answers
Na sintaxe NASM, essa instrução deve ser
MOV EBX, MY_TABLE
. O queMOV EBX, [MY_TABLE]
faria era carregar os primeiros 4 bytes localizados emMY_TABLE
emEBX
. Outra alternativa seria usarLEA
, como emLEA EBX, [MY_TABLE]
.Neste caso, o tutorial está certo.
MY_TABLE
é definido como um conjunto de palavras. Uma palavra sobre o x86 é 2 bytes, então o segundo elemento deMY_TABLE
está realmente localizado emMY_TABLE + 2
.
Esse tutorial nem sequer é um código NASM válido. Para links para guias / recursos / manuais do x86 que não são uma porcaria, veja A etiqueta do x86 wiki aqui.
MOV [EBX], 110
não se reúne porque nenhum dos dois operadores implica um tamanho de operando . (Eu acho que até o MASM não vai montá-lo, mas alguns montadores ruins como o emu8086 têm um tamanho de operando padrão para instruções como esta. Faria uma loja de 16 bits.
MOV EBX, [MY_TABLE]
vai montar, mas carrega as duas primeiras palavras de tabela. mov ebx, MY_TABLE
Vou colocar a morada num registo.