如何从.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
问题是您的数据位于数据段中,而您的代码位于文本段中.链接器设置为需要可重定位代码,这意味着您不能使用绝对地址,因为在运行时之前您无法知道绝对地址.
要使用可重定位代码,您需要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
无符号,这将不加修改.您可以使用edi
和eax
,但这会截断使用超过32位的地址,并且编译的代码会更大,因为默认地址大小是64位.