x86汇编程序编译正常但无控制台输出问题排查
问题分析与修复
核心问题:64位Linux系统调用号错误
你编写的是64位x86汇编程序(使用了rax、rdi等64位寄存器),但误用了32位Linux的系统调用号:
- 32位下
write系统调用号是4,而64位Linux中write的系统调用号是1 - 错误的调用号会导致
syscall执行的不是预期的写操作,因此控制台无输出
次要问题:循环逻辑遗漏0的输出
你的循环判断cmp byte [count], 0; jg decr_loop表示当count大于0时才跳转循环,这会导致count减到0时不再进入循环,0不会被输出,不符合你“输出9到0”的预期,需要改成jge(大于等于0时跳转)。
修正后的代码
; ------------------------------------------------------------------------------ global _start ; ------------------------------------------------------------------------------ section .text ; Start of our code _start: mov byte [count], 9 decr_loop: ;; Print current count value mov rax, 1 ; 64位Linux系统调用号:write mov rdi, 1 ; 文件描述符:stdout mov rsi, count ; 要输出的变量地址 mov rdx, 1 ; 输出字节数 syscall ; 调用内核 ;; Print newline character mov rax, 1 ; 64位Linux系统调用号:write mov rdi, 1 ; 文件描述符:stdout mov rsi, newline; 换行符地址 mov rdx, 1 ; 输出字节数 syscall ; 调用内核 ;; Decrease the count dec byte [count] ;; Compare count to zero. Jump if greater or equal cmp byte [count], 0 jge decr_loop ; 大于等于0时继续循环,确保0被输出 ;; Exit program mov rax, 60 ; 64位Linux系统调用号:exit xor rdi, rdi ; 退出码0 syscall ; 调用内核 ; ------------------------------------------------------------------------------ section .data newline: db 10 ; 换行符ASCII码 count: db 9 ; 初始化count为9 ; ------------------------------------------------------------------------------
验证方法
编译运行:
nasm -f elf64 myprogram.asm -o myprogram.o ld myprogram.o -o myprogram ./myprogram
此时会逐行输出9、8、7……1、0,符合预期。
内容的提问来源于stack exchange,提问作者Osasikemwen Ogieva
相关产品推荐
相关产品推荐

