Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Addressing Modes in Assembly Language (IA-32 NASM)

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.

  1. Register addressing
    • mov eax, ebx: Copies what is in ebx into eax
    • mov esi, var: Copies address of var (say 0x0040120e) into esi
  2. Immediate addressing (second operand is an immediate constant)
    • mov bx, 20: 16-bit register bx gets the actual value 20
  3. 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
  4. Direct offset addressing (same as 3, just using arithmetics to modify address)
    • mov al, [byte_tbl+2]
  5. 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:

  1. 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?
  2. Surely it is MY_TABLE[2] that is equal to 123 at the end, not MY_TABLE[1]?
like image 448
Magnus Avatar asked Dec 16 '13 10:12

Magnus


People also ask

What is IA-32 assembly language?

IA-32 (short for "Intel Architecture, 32-bit", sometimes also called i386) is the 32-bit version of the x86 instruction set architecture, designed by Intel and first implemented in the 80386 microprocessor in 1985.

How many addressing modes are in assembly language?

It copies the data of 2nd operand (source) into the 1st operand (destination). To access memory, segment registers are used along with general-purpose registers. There are seven addressing modes in 8086 processor. Now, we will discuss all of them in detail with example assembly instructions.


1 Answers

  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].

  2. 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.

like image 167
Michael Avatar answered Oct 07 '22 16:10

Michael