我正在尝试自学如何在NASM上用X86编写Assembly。我正在尝试编写一个具有单个整数值的程序,然后在退出之前将其打印回标准输出。
我的代码:
section .data
prompt: db "Enter a number: ", 0
str_length: equ $ - prompt
section .bss
the_number: resw 1
section .text
global _start
_start:
mov eax, 4 ; pass sys_write
mov ebx, 1 ; pass stdout
mov edx, str_length ; pass number of bytes for prompt
mov ecx, prompt ; pass prompt string
int 80h
mov eax, 3 ; sys_read
mov ebx, 0 ; stdin
mov edx, 1 ; number of bytes
mov ecx, [the_number] ; pass input of the_number
int 80h
mov eax, 4
mov ebx, 1
mov edx, 1
mov ecx, [the_number]
int 80h
mov eax, 1 ; exit
mov ebx, 0 ; status 0
int 80h
从那里开始组装nasm -felf -o input.o input.asm
和链接ld -m elf_i386 -o input input.o
。
我运行测试并输入一个整数,然后按Enter键,程序退出,Bash尝试执行作为命令输入的数字。我什至echo
处于退出状态并返回0。
这是一种奇怪的行为。
答案 0 :(得分:3)
读取调用失败,并且不读取任何输入。当您的程序退出时,该输入仍在等待在TTY(该程序的stdin)上读取,此时bash会读取该输入。
您应该检查系统调用的返回状态。如果系统调用返回时EAX为负数,则为错误代码。例如,在这种情况下,EAX包含-14,即EFAULT(“错误地址”)。
读取失败的原因是您传递了无效的指针作为缓冲区地址。您需要加载the_number
的地址,而不是其值。使用mov ecx, the_number
。