【发布时间】:2017-09-08 20:04:52
【问题描述】:
我是汇编新手,正在尝试迭代存储在内存中的字符串。我可以使用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] ; load first 4 characters of string=movl (%edx),%eax,还有更复杂的比如mov al,[arrayX+edi*8+esi]=movb arrayX(%esi, %edi, 8), %al -
也就是说,您似乎正在尝试猜测说明。请不要那样做,即使你可能会得到几次机会,迟早你会遇到一些事情,比如最常见的 SO 汇编问题“除法溢出”,因为人们期望
div %ebx来划分 eax/ ebx,虽然它没有。获取一些指令集参考指南,并获取一些 GAS/AT&T 汇编语法参考指南。并快速通过它们几次。 (并且 8086 模式下可能的内存寻址模式非常有限......而且你的lea string, %edx在 8086 上无效,这让我想知道......) -
@Ped7g 我实际上将其用作说明flint.cs.yale.edu/cs421/papers/x86-asm/asm.html#registers 的参考,我找不到类似
lw的东西,所以我问了这个问题。不过你是对的,我需要更好地理解寻址模式。 -
这就像要求我直接对你投反对票......在你的链接中,寄存器章节的正下方是“内存和寻址模式”,其中解释了该丑陋的 GAS 语法(对不起,我有偏见,我讨厌它)。在这两个标题下是“说明”,带有“数据移动说明”子章节……您甚至可以阅读,还是只是盲目地单击屏幕上的按钮? ...无论如何,相当完整的指令参考也位于:x86.renejeschke.de(并且有几个类似的页面)。 GAS 语法文档 => 要么官方 AS 文档,要么搜索,我不会。
-
知道了。我已经在做一些非常相似的事情,只是我使用了错误的操作后缀,我的错。我在这里超出了我的深度,因此为这个非常愚蠢的错误道歉。