Arrays 使用索引寻址访问数组元素
在x86_64中,访问数组元素的正确方法是什么?例如,以下是我到目前为止所做的:Arrays 使用索引寻址访问数组元素,arrays,assembly,x86-64,att,addressing-mode,Arrays,Assembly,X86 64,Att,Addressing Mode,在x86_64中,访问数组元素的正确方法是什么?例如,以下是我到目前为止所做的: my_array: .word 20,25,30,35 .globl _start _start: movq $0, %rdi # should we use rdi for the offset? movz my_array(,%rdi,2), $r13 # how to move two bytes in r13 and zero-pad the re
my_array: .word 20,25,30,35
.globl _start
_start:
movq $0, %rdi # should we use rdi for the offset?
movz my_array(,%rdi,2), $r13 # how to move two bytes in r13 and zero-pad the rest?
add $6, %rdi # move to next index position for my_array[3]
movz my_array(,%rdi,2), $r14 # how to move two bytes in r14 and zero-pad the rest?
基本上,我尝试在伪代码中执行以下操作:
%r13 = my_array[0] # (20)
%r14 = my_array[3] # (35)
这太草率了,我敢肯定这样做是不对的(更不用说
movz
的大小不正确,我很难弄清楚。那么,使用索引寻址模式做这件事的正确方法是什么?如果没有像movzw
这样的源操作数大小,就永远不要使用movz
。另外,$r14
不是寄存器名,我想你的意思是说,它将无法汇编。)%r14
。此外,不需要add
指令,如果您有已知的常量偏移量,请使用my_数组+6(,%rdi,2)
。(或者更好,只需my_数组(%rip)
和my_数组+6(%rip)
,用于两个已知常量索引)。如果需要示例,请编译一个C函数,该函数接受一个arg并使用它为全局数组编制索引,返回值。请查看asm输出。@PeterCordes感谢您的反馈。我在godbolt上这样做了,但他们没有为数组使用索引寻址,我正在尝试学习:。他们只是一次添加一个数组元素。Rea请更仔细地阅读我的评论,并阅读链接的答案:一个接受arg并使用它来索引数组的函数。您刚刚编写了一个main
,其中所有内容都是编译时常量,因此编译器当然不会将0
放入寄存器并与其索引。AT&t语法中的re:movzx:请参阅。上的公认答案这个问题使用的是movzxb
;不要这样做,这是AT&t和英特尔助记符的巫毒混合体。另外,如果你在网站上搜索,看看哪个应该是第一个热门:stackoverflow.com movzbl
永远不要在没有movzw
这样的源操作数大小的情况下使用movz
。而且,$r14
不是寄存器名d将无法汇编,我想你的意思是%r14
。此外,add
指令是不必要的,如果你有一个已知的常量偏移量,请使用my_数组+6(,%rdi,2)
(或者更好,只需my_数组(%rip)
和my_数组+6(%rip)
(两个已知常量索引)。如果需要示例,请编译一个C函数,该函数接受一个arg并使用它为全局数组编制索引,返回值。请查看asm输出。@PeterCordes感谢您的反馈。我在godbolt上这样做了,但他们没有为数组使用索引寻址,我正在尝试学习:。他们只是一次添加一个数组元素。Rea请更仔细地阅读我的评论,并阅读链接的答案:一个接受arg并使用它来索引数组的函数。您刚刚编写了一个main
,其中所有内容都是编译时常量,因此编译器当然不会将0
放入寄存器并与其索引。AT&t语法中的re:movzx:请参阅。上的公认答案这个问题使用了movzxb
;不要这样做,那是AT&t和英特尔助记符的巫毒混合体。如果你在网站上搜索:stackoverflow.com movzbl