我正在为 64 位模式下的 x86-64 微处理器编写一个汇编程序,该程序在循环中调用函数 f 5 次,然后循环调用
puts
3 次以显示“hello
世界”。
为了汇编代码,我使用
gcc myfile.s -o myfile
,然后使用 ./myfile
运行它。
这是现在的代码:
.section .rodata
.LC0:
.ascii "hello world\0"
.text
.global main
.type main, @function
main:
pushq %rbp
movq %rsp, %rbp
movl $0, %ecx
main_loop:
cmpl $5, %ecx
jge main_end
call f
incl %ecx
jmp main_loop
main_end:
movq %rbp, %rsp
popq %rbp
ret
.global f
.type f, @function
f:
pushq %rbp
movq %rsp, %rbp
movl $0, %edx
f_loop:
cmpl $3, %edx
jge f_end
leaq .LC0(%rip), %rdi
call puts
incl %edx
jmp f_loop
f_end:
movq %rbp, %rsp
popq %rbp
ret
问题是我正在进入无限循环,并且“hello world”被无限打印。可能出了什么问题?循环计数器的寄存器是否在某处变为零,是其他原因吗?我对一般的汇编和具体的函数调用非常陌生,因此感谢任何帮助。
您的 RCX 和 RDX 寄存器不会在调用之间保留!请参阅 通过 linux x86-64 函数调用保留哪些寄存器。
您可以使用 RBX 代替 RDX:
f:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
movl $3, %ebx
f_loop:
leaq .LC0(%rip), %rdi
call puts
decl %ebx
jne f_loop
popq %rbx
popq %rbp
ret
以类似的方式修改main!