【问题标题】:Assembly x86 NASM - Avoid read return key大会 x86 NASM - 避免读取返回键
【发布时间】:2014-04-12 21:46:27
【问题描述】:

我刚开始学习汇编,但没有找到任何有用的内容。

我正在创建一个读取用户输入的简单程序,基本上:

section .bss
    opA: resw 1
    opB: resw 1

section .text
    global _start

    inputA:
    mov EAX, 3
    mov EBX, 0
    mov ECX, opA
    mov EDX, 1
    int 80h

    inputB:
    mov EAX, 3
    mov EBX, 0
    mov ECX, opB
    mov EDX, 1
    int 80h

    /*terminate*/

问题是在我输入第一个值并按回车后,第二个 sys_read 被跳过(我相信它正在读取 '\n' 字符)。

所以我尝试比较 opB 是否存储了 '\n',如果是肯定的情况,我会跳回 'inputB:',如下所示:

cpm word[opA], '\n'
je inputB

但它不起作用!我该如何解决这个问题?

更简单,如何从变量中删除换行符?

【问题讨论】:

  • 你处理的是字节而不是单词。
  • 可以调整标准输入,这样它就不会等待“输入”......但我认为你还不想解决它。最简单的可能是将 2 放入 edx 并忽略换行(这假设讨厌的用户只输入一个字符并点击“回车”)。
  • 已修复 @Jester,但仍无法使其工作。@Frank 确实有效,但我需要从变量中删除 '\n'。有什么想法吗?
  • “删除”它在什么意义上? mov byte [ecx + eax - 1}, 0(在您的“int 80h”之后)将用零覆盖它。也许你想要什么?

标签: assembly x86 nasm line-breaks


【解决方案1】:

一种选择是刷新标准输入缓冲区:

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

另一个选项 - 与管道一起使用 - 是读取标准输入直到 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-04
    • 2012-05-02
    • 1970-01-01
    • 2015-03-09
    • 2020-11-12
    • 2016-11-06
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多