汇编程序无限循环问题排查求助
你的代码有两个关键问题导致无限循环:
错误使用RCX寄存器作为循环计数器
x86_64 Linux下执行syscall时,会自动把当前指令地址存入RCX,覆盖你之前设置的计数器值。每次打印后,RCX的数值已经不是你预期的递减结果,循环逻辑彻底混乱。循环判断逻辑完全颠倒
你写的cmp rcx, 0+jg konec,意思是「当RCX大于0时直接跳转到结束」,这和你想循环5次的逻辑完全相反。而且因为RCX被syscall破坏,后续即使RCX变成负数,也永远满足不了jg konec的跳转条件,直接陷入无限循环。
修正后的代码,把循环计数器换成不会被syscall修改的寄存器(比如RBX),同时修正判断逻辑:
.section .data zprava: .asciz "opakuji smycku\n" .section .text .global _start .intel_syntax noprefix _start: mov rbx, 5 ; 用RBX存循环次数,syscall不会修改这个寄存器 smycka: cmp rbx, 0 jle konec ; 当RBX<=0时退出循环 mov rax, 1 mov rdi, 1 lea rsi, [zprava] mov rdx, 17 syscall dec rbx ; 计数器减1 jmp smycka konec: mov rax, 60 xor rdi, rdi syscall
内容的提问来源于stack exchange,提问作者Rotter
相关产品推荐
相关产品推荐

