我现在自己学习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$
我不明白为什么会出现这条额外的行。
答案 0 :(得分:0)
您的结果数据在要打印的字符串之前包含一个额外的换行符(10
):
result db 10, "%i / %i = %i.", 10, 0
^^
删除它将删除输出中的额外换行符。
您可以通过刷新缓冲区或从缓冲区中读取三个以上的字符来消除stdin中的更多字符来删除额外的shell行。按下输入数据的换行符也将存储在行的缓冲区中,如果代码未读取,则shell将作为空行读取。 (即如果你只是在没有输入任何其他内容的情况下按下进入shell,它将表现出与shell相同的行为。)
另外,我建议使用扩展的32位寄存器代替16位寄存器,因为你的变量是32位。