Modos de endereçamento na Linguagem de montagem (IA-32 NASM)

Como os recursos da web sobre isso são escassos, começarei, para o benefício de futuras pesquisas, listando os modos de endereço para o IA-32 Assembly Language (NASM) e depois seguirei com uma pergunta rápida.

  1. 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
  2. endereçamento imediato (o segundo operando é uma constante imediata)
    • mov bx, 20: 16-bit o registo bx recebe o valor real 20
  3. 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
  4. endereçamento em offset directo (igual a 3, apenas usando aritmética para modificar endereço)
    • mov al, [byte_tbl+2]
  5. 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.pdf

ele 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:

  1. 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?
  2. certamente é MY_TABLE[2] que é igual a 123 no final, não MY_TABLE[1]?
Author: Magnus, 2013-12-16

2 answers

  1. Na sintaxe NASM, essa instrução deve ser MOV EBX, MY_TABLE. O que MOV EBX, [MY_TABLE] faria era carregar os primeiros 4 bytes localizados em MY_TABLE em EBX. Outra alternativa seria usar LEA, como em LEA EBX, [MY_TABLE].

  2. 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 de MY_TABLE está realmente localizado em MY_TABLE + 2.

 5
Author: Michael, 2013-12-16 11:15:34

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.

 0
Author: Peter Cordes, 2017-11-29 20:41:21