assembly - 了解汇编语言操作数形式

标签 assembly hex x86-64 addressing-mode

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/

相关文章:

assembly - 是否有用于将立即字节移动到直接内存位置(不使用寄存器)的 x86 操作码?

c++ - 二进制 PLC 通信的校验和

perl - 如何用Perl将指定格式的数据写入二进制文件?

assembly - 为什么在 64 位模式下使用 'DS:' 段覆盖是非法的?

c - 为什么编译器要在栈上腾出空间

c - x86 - 获取方向标志 (DF) 的当前状态

c - xv6 中的堆栈帧操作仅适用于 printf()?

c - Visual Studio - 在 64 位项目中编译 32 位代码

java - 在十六进制和 ascii 之间转换时丢失字符

c++ - C/C++ 在幕后按值返回结构