Linux上的NASM:使用sys_read在最后添加额外的行

时间:2016-03-20 22:14:06

标签: linux assembly nasm

我现在自己学习assmebler,我终于设法从终端读取输入并用它来计算。

我使用sys_read并且它工作得非常好但是当我使用它时终端的行为就像我在运行程序后按下回车(一行root@kali:~/ASM$)。使用scanf时不会发生这种情况。

这是我的代码:

sys_read  equ 3
sys_write equ 4
stdout    equ 1
stdin     equ 2

section .data
    prompt db "Enter two 1-digit numbers for an integer division.", 10, 0
    result db 10, "%i / %i = %i.", 10, 0

section .bss
    a resb 4
    b resb 4
    c resb 4

section .text
    extern printf
    global main

main:
    push ebp
    mov ebp, esp
    push ebx
    push esi
    push edi

    push prompt
    call printf

    mov eax, sys_read
    mov ebx, stdin
    mov ecx, a
    mov edx, 1
    int 80h

    sub dword [a], 0x30

    mov eax, sys_read
    mov ebx, stdin
    mov ecx, b
    mov edx, 1
    int 80h

    mov eax, sys_read
    mov ebx, stdin
    mov ecx, b
    mov edx, 1
    int 80h

    sub dword [b], 0x30

    mov dx, 0
    mov ax, [a]
    div dword [b]
    mov [c], ax
    push dword [c]
    push dword [b]
    push dword [a]
    push result
    call printf

    add esp, 40

    pop edi
    pop esi
    pop ebx
    mov esp, ebp
    pop ebp
    ret

这是我得到的输出:

root@kali:~/ASM$ ./div
Enter two 1-digit numbers for an integer division.
1 1

1 / 1 = 1.
root@kali:~/ASM$ 
root@kali:~/ASM$

我不明白为什么会出现这条额外的行。

1 个答案:

答案 0 :(得分:0)

您的结果数据在要打印的字符串之前包含一个额外的换行符(10):

result db 10, "%i / %i = %i.", 10, 0
          ^^

删除它将删除输出中的额外换行符。

您可以通过刷新缓冲区或从缓冲区中读取三个以上的字符来消除stdin中的更多字符来删除额外的shell行。按下输入数据的换行符也将存储在行的缓冲区中,如果代码未读取,则shell将作为空行读取。 (即如果你只是在没有输入任何其他内容的情况下按下进入shell,它将表现出与shell相同的行为。)

另外,我建议使用扩展的32位寄存器代替16位寄存器,因为你的变量是32位。