Addressing Modes in Assembly Language (IA

As the web-resources on this is sparse, I will, for the benefit of future searches, begin by listing the address modes for IA-32 Assembly Language (NASM) and then follow up with a quick question.

  • Register addressing
  • mov eax, ebx: Copies what is in ebx into eax
  • mov esi, var: Copies address of var (say 0x0040120e) into esi
  • Immediate addressing (second operand is an immediate constant)
  • mov bx, 20: 16-bit register bx gets the actual value 20
  • Direct memory addressing (directly loads from memory through a specified address)
  • mov ax, [1000h]: loads a 2-byte object from the byte at address 4096 (0x1000 in hexadecimal) into a 16-bit register called 'ax'
  • mov [1000h], ax: memory at address 1000h gets the value of ax
  • Direct offset addressing (same as 3, just using arithmetics to modify address)
  • mov al, [byte_tbl+2]
  • Register indirect (accessing memory by using addresses stored in registers)
  • mov ax, [di]: copies value at memory address specified by di, into ax
  • mov dword [eax], var1: copies value in var1 into the memory slot specified by eax
  • Please note that the above is for NASM. For MASM/TASM you'd use "mov esi, OFFSET foo" to get the address, while "mov esi, foo" and "mov esi, [foo]" both would get the value (creds to @Michael).

    So, onto my question. It is in in relation to an example at the bottom of page 29 of the following tutorial: http://www.tutorialspoint.com/assembly_programming/assembly_tutorial.pdf

    It basically lists the below code as an example of indirect memory addressing.

    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 
    

    My questions:

  • Should not "MOV EBX, [MY_TABLE]" in fact be "MOV EBX, MY_TABLE", as we want to put the address of the table in EBX, not the value itself?
  • Surely it is MY_TABLE[2] that is equal to 123 at the end, not MY_TABLE[1]?

  • In NASM syntax, that instruction should be MOV EBX, MY_TABLE . What MOV EBX, [MY_TABLE] would do is load the first 4 bytes located at MY_TABLE into EBX . Another alternative would be to use LEA , as in LEA EBX, [MY_TABLE] .

  • In this case the tutorial is right. MY_TABLE is defined as an array of words. A word on the x86 is 2 bytes, so the second element of MY_TABLE is indeed located at MY_TABLE + 2 .


  • That tutorial is not even valid NASM code. For links to x86 guides / resources / manuals that don't suck, see the x86 tag wiki here on SO.

    MOV [EBX], 110 won't assemble because neither operand implies an operand-size. (I think even MASM won't assemble it, but some bad assemblers like emu8086 have a default operand size for instructions like this.) mov word [ebx], 110 would do a 16-bit store.

    MOV EBX, [MY_TABLE] will assemble but it loads the first 2 words from the table. mov ebx, MY_TABLE will put the address into a register.

    链接地址: http://www.djcxy.com/p/89844.html

    上一篇: 如何确定计算机是否装配有XT / AT键盘?

    下一篇: 汇编语言寻址模式(IA