考虑以下简短程序。
int main(){
asm("movq 0x5F5E100, %rcx;"
"startofloop: ; "
"sub 0x1, %rcx; "
"jne startofloop; ");
}
这个程序编译得很好,但是当它运行时,会在最初的movq
指令上进行段错误。
我一定错过了一些明显的东西,但我希望有人可以为我指出。
我在Debian 8上运行,内核3.16.0-4-amd64,如果相关的话。
为了将来参考,这是编译器生成的内容。
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
#APP
# 2 "asm_fail.c" 1
movq 0x5F5E100, %rcx;startofloop: ; sub 0x1, %rcx; jne startofloop;
# 0 "" 2
#NO_APP
答案 0 :(得分:4)
事实证明,自从我写了asm以来已经太久了,我忘记了必须在AT& T语法中用$
作为立即值。我在仔细检查AT& T语法时找到了提醒here。
asm("movq $100000000, %rcx;"
"startofloop: ; "
"sub $0x1, %rcx; "
"jne startofloop; ");
movq 0x5F5E100, %rcx
(数字上没有$
)来自绝对地址0x5F5E100