首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86-64访问数组的元素

x86-64访问数组的元素
EN

Stack Overflow用户
提问于 2020-10-19 21:41:05
回答 1查看 351关注 0票数 0

嗨,我是汇编语言的初学者,movl (%rdi,%r12), %r10dmovl (%rdi,%r12,4), %r10d有什么区别吗?我尝试了这两种方法,它们似乎都做了相同的工作--将%r12位置上的%rdi元素保存到%r10d。第二个例子中的4真的有必要吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-19 22:36:59

是的,它们是不同的。

例如,假设%rdi = 0x12340000%r12 = 8。然后movl (%rdi,%r12), %r10d%r12添加到%rdi中以形成有效地址,因此您可以从address 0x12340008加载32位dword。4是SIB寻址模式的缩放参数;它使%r12在添加到%rdi之前被乘以4,因此对于movl (%rdi,%r12,4), %r10d,您可以从address 0x12340020加载32位dword。

请参见GNU作为手册:“如果未指定scale,则将scale视为1。”

如果您尝试使用定义如下的数组

代码语言:javascript
复制
int32_t foo[] = {1,3,5,7,9,11,13,15,17,19,21,23,25};

%rdi包含foo的地址,与上面的%r12 = 8一样,然后movl (%rdi,%r12), %r10d将用值5加载%r10d,而movl (%rdi,%r12,4), %r10d将用值17加载%r10d。换句话说,这是一个问题,您是将%rdi视为字节计数,还是将32位ints计数。

如果它们在您的测试中显示为相同的工作方式,那么要么您的测试是错误的,要么这两个不同的地址碰巧包含相同的值,或者您的%r12为零,或者您的汇编程序坏了(不可能)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64435433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档