AT&T GAS 汇编中的数组寻址。 RIP 的寄存器偏移量不起作用
Array addressing in AT&T GAS assembly. Register offset from RIP doesn't work
我正在尝试在 GNU 程序集中使用数组。在我看来,以下代码必须以值 3 退出。但它以 13 退出。
.section __DATA,__data
inArr:
.word 13, 2, 3, 4, 5, 6, 7, 8, 9, 10
outArr:
.fill 10, 2
.section __TEXT,__text
.globl _main
_main:
movq , %rcx
movw inArr(%rip, %rcx, 2), %di # load *((rcx * 2)+ rip + &inArray) into %di, isn't it?
movl [=10=]x2000001, %eax # exit
syscall
在我看来 movw inArr(%rip, %rcx, 2), %di
命令等同于 %di = inArr[%rcx]
。不幸的是,我在 GAS 中找不到任何带有数组的示例。
这段代码有什么问题?我该如何处理数组的第 n 个元素?
不存在索引 RIP 相对寻址模式这样的东西。你的汇编程序应该给出一个错误。改用这个:
lea inArr(%rip), %rdi
movzwl (%rdi, %rcx, 2), %edi
我正在尝试在 GNU 程序集中使用数组。在我看来,以下代码必须以值 3 退出。但它以 13 退出。
.section __DATA,__data
inArr:
.word 13, 2, 3, 4, 5, 6, 7, 8, 9, 10
outArr:
.fill 10, 2
.section __TEXT,__text
.globl _main
_main:
movq , %rcx
movw inArr(%rip, %rcx, 2), %di # load *((rcx * 2)+ rip + &inArray) into %di, isn't it?
movl [=10=]x2000001, %eax # exit
syscall
在我看来 movw inArr(%rip, %rcx, 2), %di
命令等同于 %di = inArr[%rcx]
。不幸的是,我在 GAS 中找不到任何带有数组的示例。
这段代码有什么问题?我该如何处理数组的第 n 个元素?
不存在索引 RIP 相对寻址模式这样的东西。你的汇编程序应该给出一个错误。改用这个:
lea inArr(%rip), %rdi
movzwl (%rdi, %rcx, 2), %edi