一种选择是刷新标准输入缓冲区:
section .data
opA: db 0
opB: db 0
LF: db 10
section .text
global _start
_start:
inputA:
mov EAX, 3
mov EBX, 0
mov ECX, opA
mov EDX, 1
int 80h
mov eax,54 ; kernel function SYS_IOCTL
mov ebx,0 ; EBX=0: STDIN
mov ecx,0x540B ; ECX=0x540B: TCFLSH
xor edx, edx ; EDX=0: TCIFLUSH
int 0x80 ; sys_call
inputB:
mov EAX, 3
mov EBX, 0
mov ECX, opB
mov EDX, 1
int 80h
mov eax,54 ; kernel function SYS_IOCTL
mov ebx,0 ; EBX=0: STDIN
mov ecx,0x540B ; ECX=0x540B: TCFLSH
xor edx, edx ; EDX=0: TCIFLUSH
int 0x80 ; sys_call
print:
mov edx,3
mov ecx,opA
mov ebx,1
mov eax,4
int 0x80
exit:
mov eax, 1
mov ebx, 0
int 0x80
另一个选项(适用于管道)是读取 stdin 直到 EOF 或 LF:
section .data
opA: db 0
opB: db 0
LF: db 10
dummy: db 0
section .text
global _start
reads:
.1: ; Loop
mov eax,3 ; kernel function SYS_READ
mov ebx, 0 ; EBX=0: STDIN
mov ecx, dummy ; dummy buffer
mov edx, 1 ; number of bytes to read
int 0x80 ; sys_call
test eax, eax ; EOF?
jz .2 ; yes: ok
mov al,[dummy] ; no: fetched character
cmp al, 10 ; character == LF ?
jne .1 ; no -> loop (i.e. fetch next character)
.2
ret
_start:
inputA:
mov EAX, 3
mov EBX, 0
mov ECX, opA
mov EDX, 1
int 80h
call reads
inputB:
mov EAX, 3
mov EBX, 0
mov ECX, opB
mov EDX, 1
int 80h
call reads
print:
mov edx,3
mov ecx,opA
mov ebx,1
mov eax,4
int 0x80
exit:
mov eax, 1
mov ebx, 0
int 0x80