【问题标题】:Understanding assembly language operand forms理解汇编语言操作数形式
【发布时间】:2021-09-09 09:37:49
【问题描述】:
Address    Value            Register     Value
0x100      0xFF             %rax         0x100
0x104      0xAB             %rcx         0x1
0x108      0x13             %rdx         0x3
0x10C      0x11


Fill in the following table showing the values for the indicated operands:

Operand           Value    //Solutions at the end of the chapter
%rax              _____    //0x100
0x104             _____    //0xAB
$0x108            _____    //0x108
(%rax)            _____    //0xFF
4(%rax)           _____    //0xAB
9(%rax, %rdx)     _____    //0x11
260(%rcx, %rdx)   _____    //0x13
0xFC(,%rcx,4)     _____    //0xFF
(%rax, %rdx,4)    _____    //0x11

我在这个网站上发现了一个类似的问题,但我仍然不明白 9(%rax, %rdx) 是如何工作的。我以为应该是 9+100+3 = 112 找到地址 0x112 的值,但是没有给我们地址 0x112?在我在这里发现的类似问题中:Hard time understanding assembly language 似乎使用 260(%rcx, %rdx) 我们需要将值转换为十六进制?但这不适用于 9(%rax, %rdx)。 与 (%rax, %rdx,4) 相同。我仍然得到 112。这如何导致地址 0x10C 得到 0x11 的值?

【问题讨论】:

  • 9+3 decimal 是 12,十六进制的 12 是 (0x)C NOT 0x12(它应该是 18,而 9+3 不是 18)。 rax 是 0x100 而不是 100 dec,并且 0x100 + 0xC = 0x10C。同样,3 * 4 是 12 dec = 0xC。 12 月 260 日 = 0x104。

标签: assembly hex x86-64 addressing-mode


【解决方案1】:

9(%rax, %rdx)

  • %rax 的值为 0x100
  • %rdx 的值为 0x3

虽然你的答案应该是9 + %rax + %rdx 的内存内容是正确的,但在这种情况下,9 是十进制的,而 0x100 和 0x3 是十六进制的。您需要将值转换为十六进制或十进制以添加它们,然后再转换回十六进制的地址。

  • 十进制的0x3是3
  • 3 + 9 = 12(十进制)
  • 十六进制的12是0xC
  • 0x100 + 0xC = 0x10C

所以看看内存在那个地址,因为9(%rax, %rdx)是内存操作数的AT&T寻址模式语法。 (LEA 指令会将地址本身放入目的地,但任何其他用法都会引用那里的内存。)

(9 = 0x9 所以十六进制加法会更直接,
只要你知道 0x3 + 0x9 = 0xc 而不是 0x12。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多