无法打印 NASM 中的数字
Cannot print a number in NASM
我刚开始学习汇编程序(出于业余爱好),我制作了这个从用户那里获取数字并打印出来的小程序:
section .data:
message: db "please enter a number: " ;define message to "please enter a number"
message_length equ $-message ;define message_length to $-message the lenght of the message
message_done: db "you have entered the number " ;define message_done to "you have entered the number "
message_done_length equ $-message ;define message_done_length to the $-message_done the length of message_done
section .bss:
num resb 5 ;num will store the input the user will give
section .text:
global _start
_start:
mov eax, 4 ;set the next syscall to write
mov ebx, 1 ;set the fd to stdout
mov ecx, message ;set the output to message
mov edx, message_length ;set edx to the length of the message
int 0x80 ;syscall
mov eax,3 ;set the next syscall to read
mov ebx, 2 ;set the fd to stdout
mov ecx, num ;set the output to be num
mov edx, 5 ;set edx to the length of the num
int 0x80 ;syscall
mov eax, 4 ;set the syscall to write
mov ebx, 1 ;set the fd to stout
mov ecx, message_done ;set the output to the message
mov edx, message_done_length ;set edx to the message_done_length
int 0x80 ;syscall
mov eax, 4 ;set the syscall to write
mov ebx ,1 ;set the fd to stdout
mov ecx, num ;set the output to num
mov edx, 5 ;the length of the message
int 0x80 ;syscall
mov eax, 1 ;set the syscall to exit
mov ebx, 0 ;retrun 0 for sucsess
int 0x80 ; syscall
当我 运行 并输入一个数字并按回车键时,我得到了这个:
please enter a number: you have entered the number ����
我是不是做错了什么?
三个错误:
section .data:
这会组成一个名为 .data:
的部分,它与 .data
不同。放下冒号。部分指令不是标签。同样的问题出现在所有其他 section
指令中。
message_done: db "you have entered the number "
message_done_length equ $-message
应该是$-message_done
。就目前而言,您正在写入太多字节。这可能是您在消息后看到垃圾的原因。
mov eax,3 ;set the next syscall to read
mov ebx, 2 ;set the fd to stdout
mov ecx, num ;set the output to be num
mov edx, 5 ;set edx to the length of the num
int 0x80 ;syscall
您希望 fd 是 stdin (0),您的注释是 stdout,而文件描述符 2 实际上是 stderr。做到mov ebx, 0
。当您从终端 运行 程序时,它可能会按原样工作,因为那时文件描述符 0、1 和 2 都在终端上打开并且都是可读写的,但是如果您使用输入,它会出现异常重定向。
我刚开始学习汇编程序(出于业余爱好),我制作了这个从用户那里获取数字并打印出来的小程序:
section .data:
message: db "please enter a number: " ;define message to "please enter a number"
message_length equ $-message ;define message_length to $-message the lenght of the message
message_done: db "you have entered the number " ;define message_done to "you have entered the number "
message_done_length equ $-message ;define message_done_length to the $-message_done the length of message_done
section .bss:
num resb 5 ;num will store the input the user will give
section .text:
global _start
_start:
mov eax, 4 ;set the next syscall to write
mov ebx, 1 ;set the fd to stdout
mov ecx, message ;set the output to message
mov edx, message_length ;set edx to the length of the message
int 0x80 ;syscall
mov eax,3 ;set the next syscall to read
mov ebx, 2 ;set the fd to stdout
mov ecx, num ;set the output to be num
mov edx, 5 ;set edx to the length of the num
int 0x80 ;syscall
mov eax, 4 ;set the syscall to write
mov ebx, 1 ;set the fd to stout
mov ecx, message_done ;set the output to the message
mov edx, message_done_length ;set edx to the message_done_length
int 0x80 ;syscall
mov eax, 4 ;set the syscall to write
mov ebx ,1 ;set the fd to stdout
mov ecx, num ;set the output to num
mov edx, 5 ;the length of the message
int 0x80 ;syscall
mov eax, 1 ;set the syscall to exit
mov ebx, 0 ;retrun 0 for sucsess
int 0x80 ; syscall
当我 运行 并输入一个数字并按回车键时,我得到了这个:
please enter a number: you have entered the number ����
我是不是做错了什么?
三个错误:
section .data:
这会组成一个名为 .data:
的部分,它与 .data
不同。放下冒号。部分指令不是标签。同样的问题出现在所有其他 section
指令中。
message_done: db "you have entered the number "
message_done_length equ $-message
应该是$-message_done
。就目前而言,您正在写入太多字节。这可能是您在消息后看到垃圾的原因。
mov eax,3 ;set the next syscall to read
mov ebx, 2 ;set the fd to stdout
mov ecx, num ;set the output to be num
mov edx, 5 ;set edx to the length of the num
int 0x80 ;syscall
您希望 fd 是 stdin (0),您的注释是 stdout,而文件描述符 2 实际上是 stderr。做到mov ebx, 0
。当您从终端 运行 程序时,它可能会按原样工作,因为那时文件描述符 0、1 和 2 都在终端上打开并且都是可读写的,但是如果您使用输入,它会出现异常重定向。