Arrays 使用索引寻址访问数组元素

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

在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 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