如何避免汇编中函数调用的无限循环?

问题描述 投票:0回答:1

我正在为 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”被无限打印。可能出了什么问题?循环计数器的寄存器是否在某处变为零,是其他原因吗?我对一般的汇编和具体的函数调用非常陌生,因此感谢任何帮助。

assembly x86-64 infinite-loop calling-convention method-call
1个回答
0
投票

您的 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

© www.soinside.com 2019 - 2024. All rights reserved.