Assembly x86 NASM - Avoid read return key

倾然丶 夕夏残阳落幕 提交于 2019-12-01 21:10:24

One option is to flush the stdin buffer:

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

Another option - which works with pipes - is to read stdin until EOF or 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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!