在x86_64中检索数据

时间:2012-02-20 00:54:07

标签: 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

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

编辑:我正在使用GNU Assembler / GCC

1 个答案:

答案 0 :(得分:5)

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

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

_main:
     movl    $0, %edi
     leaq    data_items(%rip), %rax
     movl    (%rax,%rdi,4), %eax

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