在汇编语言寻址模式(IA-32 NASM) [英] Addressing Modes in Assembly Language (IA-32 NASM)

查看:296
本文介绍了在汇编语言寻址模式(IA-32 NASM)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于在这个网上资源是稀少的,我会为未来搜索的好处,首先列出了IA-32汇编语言的寻址模式(NASM),然后跟进一个简单的问题。


  1. 寄存器寻址

    • MOV EAX,EBX:复制什么是EBX到EAX

    • MOV ESI,VAR:复制VAR的地址(比如0x0040120e)进入ESI


  2. 立即寻址(第二个操作数是一个立即数)

    • MOV BX,20:16位寄存器BX得到实际值20


  3. 直接内存寻址(通过指定地址从内存中直接加载)

    • MOV AX,[1000H]:在地址4096点(0x1000十六进制)加载从字节2个字节的对象到一个名为AX
    • 16位寄存器
    • MOV [1000H],斧:内存地址1000H得到斧头的价值


  4. 直接偏移量寻址(同3,只是用算术来修改地址)

    • MOV人,[byte_tbl + 2]


  5. (通过使用存储在寄存器地址访问内存)寄存器间接

    • MOV AX,[二]:在迪指定的内存地址拷贝值,到AX

    • MOV DWORD [EAX],VAR1:在VAR1值复制到由EAX指定内存插槽


请注意,上述为NASM。对于MASM / TASM你会使用MOV ESI,OFFSET富来获得地址,而MOV ESI,foo和MOV ESI,[富]都将获得价值(creds到@迈克尔)。

所以,到我的问题。这是在下面的教程29页的底部相对于一个例子:<一href=\"http://www.tutorialspoint.com/assembly_programming/assembly_tutorial.pdf\">http://www.tutorialspoint.com/assembly_programming/assembly_tutorial.pdf

基本上,它列出了下面code作为间接内存寻址的例子。

  MY_TABLE次,每次10 DW 0;分配10个字(2个字节),每个初始化为0
MOV EBX,[MY_TABLE]在EBX MY_TABLE的有效地址
MOV [EBX],110; MY_TABLE [0] = 110
ADD EBX,2; EBX = EBX +2
MOV [EBX],123; MY_TABLE [1] = 123

我的问题:


  1. 应该不是MOV EBX,[MY_TABLE]其实是MOV EBX,MY_TABLE,因为我们希望把EBX表的地址,而不是本身的价值?

  2. 肯定是MY_TABLE [2],等于123结尾,而不是MY_TABLE [1]?


解决方案

  1. 在NASM语法,该指令应 MOV EBX,MY_TABLE 。什么 MOV EBX,[MY_TABLE] 会做的是位于 MY_TABLE 前4个字节加载到 EBX 。另一种方法是使用 LEA ,如 LEA EBX,[MY_TABLE]


  2. 在这种情况下,本教程是正确的。 MY_TABLE 被定义为词的数组。在x86一个字为2个字节,因此 MY_TABLE 确实位于第二个元素MY_TABLE + 2


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

解决方案

  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.

这篇关于在汇编语言寻址模式(IA-32 NASM)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆