2017-09-08 70 views
-1

我是新来的汇编,并试图迭代存储在内存中的字符串。我可以使用lea(加载有效地址)指令得到字符串的地址,但我现在想使用存储在寄存器中的那个地址。如何加载存储在程序集寄存器中的内存地址的内容?

有模lw其可以使用如下:

lea string, %edx  ; Load effective address of string into edx 
lw %edx, %eax  ; Load eax with the value stored where edx points 

... 
string: 
    .string "Hello" 
+1

英特尔拥有内存访问的语法'[address]',可以应用于几乎所有的基本指令,'mov'在您的情况下只是为了获取值,还有基本的算术工作。但是当你使用gas/AT&T语法时,它是不同的,所以内存引用是'offset(r_base,r_index,index_scale_factor)',其中'offset'和'index_scale_factor'是数字(或符号)。所以'mov eax,[edx];加载string' ='movl(%edx),%eax'的前4个字符,以及像'mov al,[arrayX + edi * 8 + esi]'= movb arrayX(%esi,%edi,8 ),%al' – Ped7g

+0

这就是说,它看起来像你正在尝试GUESS的指示。请不要这样做,即使你可能只有很少的时间用它,迟早你会碰到一些东西,比如最常见的SO装配问题“分裂溢出”,因为人们期望'div%ebx'能够分裂eax/ebx,而不是。获取一些指令集参考指南,并获取一些GAS/AT&T汇编语法参考指南。并快速通过他们几次。 (在8086模式下可能的内存寻址模式是非常有限的......你的'lea字符串,%edx'在8086上是无效的,这让我想知道......) – Ped7g

+0

@ Ped7g我实际上使用它作为指令的参考http://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html#registers,我找不到像'lw'这样的问题,所以我问了这个问题。你是对的,但我需要更好地理解寻址模式。 – Bhargav

回答

1

“MOV”是你在找什么,用间接寻址(其基于哪个模式寄存器的一些限制你”重新进入)

+0

你能举个例子吗?我猜测我在尝试执行'mov%edx,%eax'时做错了什么,因为它只是将内容移到eax中,而不是内存地址的内容。 – Bhargav

+0

对,你没有在那里使用间接寻址。你需要在AT&T语法中找到如何做到这一点。对于AT&T语法,我基本上是只读的。我讨厌激情,所以现在只使用英特尔语法,如MOV EAX,[EDX] –

相关问题