assembly - x86-64 访问数组的元素
问题描述
嗨我是汇编语言的初学者,movl (%rdi,%r12), %r10d
和之间有区别movl (%rdi,%r12,4), %r10d
吗?我尝试了它们,它们似乎都在做同样的工作——将 %r12 位置的 %rdi 元素保存到 %r10d。第二个例子中的 4 真的有必要吗?
解决方案
是的,它们是不同的。
假设例如%rdi = 0x12340000
和%r12 = 8
。然后movl (%rdi,%r12), %r10d
添加%r12
to%rdi
以形成有效地址,因此您从 address 加载一个 32 位 dword 0x12340008
。4
是SIB寻址方式的尺度参数;它会导致%r12
在添加 to 之前乘以 4 %rdi
,因此movl (%rdi,%r12,4), %r10d
您可以从 address 加载一个 32 位 dword 0x12340020
。
请参阅GNU 手册:“如果未scale
指定,scale
则视为 1。”
如果您使用定义为的数组尝试它
int32_t foo[] = {1,3,5,7,9,11,13,15,17,19,21,23,25};
并%rdi
包含 的地址foo
,%r12 = 8
如上,然后movl (%rdi,%r12), %r10d
将加载%r10d
value 5
,但movl (%rdi,%r12,4), %r10d
将加载 value 17
。换句话说,这是一个问题,您是将%rdi
其视为字节数还是 32 位整数的计数。
如果它们在您的测试中似乎工作相同,那么您的测试有错误,或者两个不同的地址巧合包含相同的值,或者您%r12
的地址为零,或者您的汇编程序损坏(不太可能)。
推荐阅读
- java - 确定一个函数是否“可以覆盖”另一个函数
- javascript - 类和数组作为参数
- python - 如何打印列表中所有元素的第一个字母?
- javascript - 突出显示活跃的“药丸”
- c# - 使用 C# 更新 JSON 文件中存在的特定项目
- c - 试图让 UART 在 dsPIC33EV256GM102 上工作
- c# - 在服务器上处理的小型 API 调用与存储在内存中的大型数据拉取
- pytorch - PyTorch 错误张量 a (128) 的大小必须与非单维 0 处的张量 b (9) 的大小相匹配
- xcode - 是否有一个键盘快捷键可以在 Xcode 中最近访问的两个选项卡之间切换?
- angular - 如果我使用此代码是否可以安全地抵御 XSS 攻击?