在x86_64中检索数据

Jum*_*hyn 2 assembly

如何从.long语句中检索数据?例如:

.data 
data_items:
    .long 3,67,34,222,45,75,54,34,44,33,22,11,66,0

.text

.globl _main
    _main:
         movl    $0, %edi
         movl    data_items(,%edi,4), %eax
Run Code Online (Sandbox Code Playgroud)

在x86_64中不允许出现大量关于绝对寻址的错误.我该如何访问这些数据?我对集会很新,所以如果我的术语令人困惑,我道歉.

编辑:我正在使用GNU汇编程序/ GCC

ugh*_*fhw 5

问题是您的数据位于数据段中,而您的代码位于文本段中.链接器设置为需要可重定位代码,这意味着您不能使用绝对地址,因为在运行时之前您无法知道绝对地址.

要使用可重定位代码,您需要data_items从指令指针作为偏移量进行访问rip.

_main:
     movl    $0, %edi
     leaq    data_items(%rip), %rax
     movl    (%rax,%rdi,4), %eax
Run Code Online (Sandbox Code Playgroud)

leaq指令获取data_items使用指令指针的偏移量的地址,该偏移量可以在链接时计算.然后该movl指令使用该地址作为加载数据的基础.请注意,我rdi在寻址中使用了.当你写入时edi,高32位rdi被自动清除,所以只要值为edi无符号,这将不加修改.您可以使用edieax,但这会截断使用超过32位的地址,并且编译的代码会更大,因为默认地址大小是64位.