64位x86 Ubuntu环境下汇编代码换行打印异常求助
问题分析与解决方案
你的代码核心问题是print函数缺少ret指令,导致调用该函数后无法返回调用点,程序执行流程完全混乱:
- 第一次调用
print打印提示字符串时,执行完int 0x80后,程序不会回到_start的第28行,而是直接往下执行read函数的代码,接着进入quit函数退出程序——打印换行的代码(第29-31行)根本没机会执行,所以看不到换行。 - 移除第一个打印块后,直接调用
print打印换行时,执行完int 0x80后程序会继续执行read函数,此时SYS_READ会等待用户输入,而之前的换行已经输出到标准输出,所以你能看到换行,但这只是巧合,程序流程依然错误。
修正后的代码只需在print和read函数末尾添加ret指令,确保函数调用后能正确返回:
section .data queryUserNumber db 'Pick a number between 1 and 100:' queryUserNumberLength equ $ - queryUserNumber guessText db 'Is the number? ' guessTextLength equ $ - guessText newline db 10 newlineLength equ $ - newline ; SYSTEM CONSTANTS SYS_EXIT equ 1 SYS_WRITE equ 4 SYS_READ equ 0 STDOUT equ 1 STDIN equ 0 section .bss userNumber resb 4 guess resb 4 section .text global _start _start: mov ecx, queryUserNumber mov edx, queryUserNumberLength call print mov ecx, newline mov edx, newlineLength call print call quit print: mov eax, SYS_WRITE mov ebx, STDOUT int 0x80 ret ; 添加ret指令返回调用点 read: mov eax, SYS_READ mov ebx, STDIN int 0x80 ret ; 同样添加ret指令 quit: mov eax, SYS_EXIT xor ebx, ebx int 0x80
另外补充:你在64位Ubuntu系统中使用32位的int 0x80系统调用是可以正常运行的,但如果要编写原生64位汇编,建议使用syscall指令及对应的64位系统调用号(比如SYS_WRITE的64位调用号是1,SYS_EXIT是60),不过这不是当前问题的核心。
内容的提问来源于stack exchange,提问作者user29613085
相关产品推荐
相关产品推荐

