【问题标题】:How to load the contents of the memory address stored in a register in assembly?如何在汇编中加载存储在寄存器中的内存地址的内容?
【发布时间】: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),其中 offsetindex_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 文档,要么搜索,我不会。
  • 知道了。我已经在做一些非常相似的事情,只是我使用了错误的操作后缀,我的错。我在这里超出了我的深度,因此为这个非常愚蠢的错误道歉。

标签: assembly x86-16 emu8086


【解决方案1】:

"mov" 是您正在寻找的内容,具有间接寻址(根据您所处的模式,它有一些寄存器限制)

【讨论】:

  • 你能举个例子吗?我猜我在尝试执行 mov %edx, %eax 时做错了,因为这只是将内容移动到 eax 中,因此将大量数字移动到 eax 中,而不是内存地址的内容。
  • 对,你没有在那里使用间接寻址。您需要在 AT&T 语法中找到如何做到这一点。对于 AT&T 语法,我基本上是只读的。我非常讨厌它,所以现在只有英特尔语法像 MOV EAX,[EDX]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2015-09-25
  • 2019-06-20
相关资源
最近更新 更多