Сборка x86 NASM - Избегайте чтения ключа возврата
Я только начал изучать ассемблер, и я не нахожу полезного контента, который бы помог.
Я создаю простую программу, которая читает пользовательский ввод, в основном:
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*/
Проблема в том, что после того, как я ввел первое значение и нажал return, второй sys_read пропускается (я думаю, что он читает символ '\n').
Поэтому я попытался сравнить, если opB сохранил "\ n", и в положительном случае я возвращаюсь к "inputB:", вот так:
cpm word[opA], '\n'
je inputB
Но это не работает! Как я могу решить это?
Проще, как убрать разрыв строки из переменной?
1 ответ
Решение
Один из вариантов - очистить буфер stdin:
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