如何从.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
答案 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
中的值无符号,这将无需修改。您可以使用edi
和eax
,但这会截断使用超过32位的地址,并且由于默认地址大小为64位,编译后的代码会更大。