gpt4 book ai didi

组装 x86 NASM - 避免读取返回键

转载 作者:行者123 更新时间:2023-12-04 00:26:52 27 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

关于组装 x86 NASM - 避免读取返回键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23036509/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com