我是新来的汇编,并试图迭代存储在内存中的字符串。我可以使用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"
英特尔拥有内存访问的语法'[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
这就是说,它看起来像你正在尝试GUESS的指示。请不要这样做,即使你可能只有很少的时间用它,迟早你会碰到一些东西,比如最常见的SO装配问题“分裂溢出”,因为人们期望'div%ebx'能够分裂eax/ebx,而不是。获取一些指令集参考指南,并获取一些GAS/AT&T汇编语法参考指南。并快速通过他们几次。 (在8086模式下可能的内存寻址模式是非常有限的......你的'lea字符串,%edx'在8086上是无效的,这让我想知道......) – Ped7g
@ Ped7g我实际上使用它作为指令的参考http://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html#registers,我找不到像'lw'这样的问题,所以我问了这个问题。你是对的,但我需要更好地理解寻址模式。 – Bhargav