NASM编写的汇编程序无法正确打印输入数字,运行出现乱码如何解决
代码问题排查
你的代码存在以下几处错误,直接导致输出异常:
message_done字符串长度计算错误
定义message_done_length时你错误写成了message_done_length equ $-message,引用了起始的message标签,正确写法应为message_done_length equ $-message_done。当前错误逻辑得到的长度是从第一个字符串message的起始地址到当前地址的总长度,远大于message_done本身的实际长度,输出时会读取超出字符串本身的内存数据,这是乱码的核心来源。- read系统调用文件描述符错误
读取用户输入的read系统调用需要使用标准输入的文件描述符0(STDIN_FILENO),你的代码中写的是mov ebx, 2,2是标准错误的文件描述符,虽然部分环境下标准错误也可读,但不符合POSIX规范,可能导致部分环境下读取输入失败。 - 输入内容输出长度不合理
你输出用户输入的num时固定写了mov edx, 5,但read系统调用执行后会在eax寄存器中返回实际读取到的字节数,直接使用这个返回值作为输出长度即可,避免输出未使用的残留内存数据。 - 语法规范瑕疵
section .data:、section .bss:、section .text:后的冒号是非必要的,标准NASM语法中section声明不需要加冒号,部分汇编器可能会因此抛出警告或错误。
修正参考
section .data message: db "please enter a number: " message_length equ $-message message_done: db "you have entered the number " message_done_length equ $-message_done ; 修正长度计算 section .bss num resb 5 section .text global _start _start: ; 输出提示输入的信息 mov eax, 4 mov ebx, 1 mov ecx, message mov edx, message_length int 0x80 ; 读取用户输入 mov eax,3 mov ebx, 0 ; 修正为标准输入描述符0 mov ecx, num mov edx, 5 int 0x80 push eax ; 暂存实际读取的字节数 ; 输出结果提示 mov eax, 4 mov ebx, 1 mov ecx, message_done mov edx, message_done_length int 0x80 ; 输出用户输入的内容 mov eax, 4 mov ebx ,1 mov ecx, num pop edx ; 取出之前暂存的实际读取长度 int 0x80 ; 退出程序 mov eax, 1 mov ebx, 0 int 0x80
内容的提问来源于stack exchange,提问作者floatingCatsAndDogs
相关产品推荐
相关产品推荐

