【发布时间】:2018-04-07 06:02:30
【问题描述】:
我正在尝试在 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 $3, %rcx
movw inArr(%rip, %rcx, 2), %di # load *((rcx * 2)+ rip + &inArray) into %di, isn't it?
movl $0x2000001, %eax # exit
syscall
在我看来movw inArr(%rip, %rcx, 2), %di 命令相当于%di = inArr[%rcx]。不幸的是,我在 GAS 中找不到任何带有数组的示例。
该代码有什么问题?我该如何处理数组的第 n 个元素?
【问题讨论】:
-
如果不需要位置无关的代码,可以使用
movzwl inArr( ,%rcx, 2), %edi。但你可能确实需要 PIC for OS X -
谢谢!这会产生以下错误
error: 32-bit absolute addressing is not supported in 64-bit mode。我找不到 OS X 的 PIC。你能澄清一下吗? -
PIC = 与位置无关的代码。您根本不能在 OS X 上的 x86-64 代码中使用 OS X 上的绝对寻址。 (Unlike Linux.)
标签: arrays assembly x86-64 gnu-assembler att