【问题标题】:What does mov(%edx, %ebx, 1), %al do?mov(%edx, %ebx, 1), %al 是做什么的?
【发布时间】:2014-07-04 06:53:58
【问题描述】:

我正在尝试建立一个二元炸弹实验室,第 5 阶段。这不是家庭作业,而是我自己在做的事情。

我发现回答了here 的类似问题,但我不明白答案,因为没有插入实际值。我试图弄清楚到底是什么,假设 %al 是目的地。我正在使用 gdb,并且 i r 命令显示 %ebx 保存我输入的字符串,即“设备”,而 %edx 有 0。这是做什么的?

【问题讨论】:

标签: assembly


【解决方案1】:

等效的 Intel 语法是 mov al, [edx+ebx*1]

换句话说,它从内存中的edx + ebx*1 形成的地址加载一个字节,并将该字节放入al 寄存器中。请注意,*1(或 AT&T 语法中的 , 1)是多余的;只写[edx+ebx](AT&T 语法中的(%edx, %ebx))就可以达到同样的效果。

在你的情况下,我想它正在从edx 指向的字符串中的ebx 位置读取一个字符。在这种情况下,将指令设置为 mov (%ebx, %edx), al 会更有意义,因为您通常缩放索引而不是基地址。但是由于这里的比例因子是 1,所以这并不重要。

【讨论】:

  • 实际上,您无法缩放基础。对于 Intel 和 AMD,您可以扩展的值是索引。另一个是base,它定义了使用的段寄存器。当然,如果 base 和 index 具有相同的默认段寄存器(如 edxebx 具有:ds)并且您使用 1 的比例,则差异仅在指令的编码中很明显。但如果其他是espebp 和其他例如。 eaxedxecxebx...,寄存器的顺序不仅会影响编码,还会影响结果,因为不同的默认段寄存器(ss/@ 987654341@).
  • @nrz:当然。但我是在用语义术语(即字符串地址)而不是指令编码来谈论基地址。可以写[base + index*scaling][index + base*scaling](其中baseindex 是寄存器),但只有其中一个真正有意义。
  • 感谢您的回复。
【解决方案2】:

也请看D(a, b, c)。 这表示a + b * c + D D 表示偏移量,a 表示基数,b 表示索引,c 表示缩放。 这里的重点是缩放必须是 1、2、4、8,因为它与 type

【讨论】:

    【解决方案3】:

    ()ed 指令用于计算内存地址。

    (a, b, c) 表示a + b * c。但要注意 c 的值,因为它必须是 1、2、4 和 8 之一。这是因为对齐问题。

    【讨论】:

    • 缩放索引寻址模式不需要对齐。它仅限于 2 的幂,因为它在机器代码中被编码为 2 位移位计数。 index << 0..3.
    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2016-02-09
    • 2018-11-14
    • 1970-01-01
    • 2011-02-22
    • 2012-05-21
    相关资源
    最近更新 更多