assembly - 理解汇编语言操作数形式
问题描述
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。)
推荐阅读
- polymer - 如何将聚合物元素的行为继承到聚合物 1.x 中的自定义元素
- android - JSONException 返回错误“搜索没有值”?
- ios - 从第一个 UIAlertController 打开第二个 UIAlertController
- git - 如何自动填充 Git 提交消息?
- php - 无法将 php 变量放入 php 数组中
- python - searchtweets API 中的关键错误
- tensorflow - 在 voc 数据集上运行 deeplab v3 的错误消息
- excel - Excel VBA 检测用户是否在树视图上选择父节点或子节点
- mysql - 在 SQL 场景中使用更新和插入查询时遇到问题
- python - VS 代码在没有时显示“问题”