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(%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。)
关于assembly - 了解汇编语言操作数形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68140365/