终端自动从程序输入命令输入

时间:2020-09-07 06:15:01

标签: linux assembly terminal nasm

我正在尝试自学如何在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。

这是一种奇怪的行为。

1 个答案:

答案 0 :(得分:3)

读取调用失败,并且不读取任何输入。当您的程序退出时,该输入仍在等待在TTY(该程序的stdin)上读取,此时bash会读取该输入。

您应该检查系统调用的返回状态。如果系统调用返回时EAX为负数,则为错误代码。例如,在这种情况下,EAX包含-14,即EFAULT(“错误地址”)。

读取失败的原因是您传递了无效的指针作为缓冲区地址。您需要加载the_number的地址,而不是其值。使用mov ecx, the_number