阅读增加额外的行
我现在正在学习assmebler,而我终于设法从终端读取输入并计算出来。
  我使用sys_read作为它,它工作得很好,但是当我使用它时,终端的行为就像我在运行该程序(按root@kali:~/ASM$ )之后按Enter键一样。  这在使用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$
我不明白为什么会出现这个额外的行。
  结果数据在要打印的字符串之前包含一个额外的换行符( 10 ): 
result db 10, "%i / %i = %i.", 10, 0
          ^^
删除这将删除输出中的额外换行符。
您可以通过从标准输入消耗更多字符(通过刷新缓冲区或通过读取缓冲区中的三个以上字符)来移除额外的外壳行。 您输入数据的换行符也会存储在行的缓冲区中,如果未通过代码读取,则shell将以空行形式读取。 (也就是说,如果你只是在没有输入任何东西的情况下按下输入框,它将显示与shell相同的行为。)
另外,我建议使用扩展的32位寄存器来替代16位寄存器,因为您的变量是32位的。
链接地址: http://www.djcxy.com/p/15905.html