【发布时间】:2017-01-08 08:35:56
【问题描述】:
谁能解释为什么这段代码 sn-p 进入无限循环?
我认为这与 printf 函数有关。
q1: .asciz "Hello World\n"
.global main
main:
movq %rsp, %rbp
movq $3, %rcx
jmp bottom
loop:
movq $0, %rax
movq $q1, %rdi
call printf
bottom:
decq %rcx
cmpq $0, %rcx
jne loop
end:
movq $0, %rdi
call exit
【问题讨论】:
-
你在使用什么汇编程序....我不确定你在使用什么调用约定'陷入无限循环
-
我正在编译:as hello.s -o hello.o,然后:gcc -o power power.o
-
RCX 根据en.wikipedia.org/wiki/X86_calling_conventions 和ideone.com/fork/LKBgUL 销毁。推送 RCX 以保留它并稍后弹出以恢复它。
-
哦好的谢谢现在明白了
-
不要使用可以被破坏的 RCX,而是使用函数保留的非易失性寄存器之一(根据 System V 64 位 ABI)。同样
decq %rcx根据减1的结果设置Z标志。cmpq $0, %rcx是不必要的。如果针对 C 运行时进行编译(似乎是这种情况),则不需要调用 exit。将返回值放入eax并使用ret。您还可以利用 CPU 自动更新 32 位寄存器零扩展到整个 64 位寄存器这一事实。