Я просмотрел Как сравнить сборку двух строк, и я пытаясь сравнить символ за символом, пока символ не будет совпадать, и я не могу заставить свой код работать так, как я хочу.
Я делаю простую оболочку и начинаю с команды help:
parseInput:
mov ah, 0x0e
mov bh, [bx]
mov bl, s_HELP_COMMAND
parseInputLoop:
cmp bh, bl
jne parseInputReturn
cmp bh, 0
je parseInputEqual
mov al, bh
int 0x10
mov al, bl
int 0x10
call newLine
inc bh
inc bl
jmp parseInputLoop
parseInputEqual:
mov bx, s_HELP_OUTPUT
call printStr
parseInputReturn:
mov bx, s_UNKNOWN_COMMAND
call printStr
call newLine
ret
s_HELP_COMMAND: db 'help', 0
s_HELP_OUTPUT: db 'help - list commands.', 0
s_UNKNOWN_COMMAND: db 'Unknown command. Type "help" to see all commands', 0
Он считывает строку, введенную пользователем, из стека. Вот код ввода пользователя:
inputLoop:
call getKeyPress ; wait for the user to press a key
cmp bx, 0xD ; 0xD = 13 = ASCII code for enter
je inputLoopExit ; exit the inputLoop if the pressed key
; is enter
call printChar ; print the pressed key so the user can
; see what they've typed
push bx ; push the pressed key onto the stack so
; that it can be parsed later
jmp inputLoop
inputLoopExit:
call newLine
push 0 ; put 0 onto the stack
mov bx, bp ; store the start of the stack in bx so
; that parseInput can read the inputed
; string
call parseInput
Он использует прерывания BIOS для ввода и вывода.
Он выводит «Неизвестная команда» каждый раз, несмотря на ввод «помощи».
parseInputLoop
никогда не читает из каких-либо строк, поэтому он не выполняет сравнение строк. Весь код кажется слишком сложным. Просто сохраните входные символы в буфере, а затем используйтеrepe cmpsb
для сравнения содержимого буфера с некоторой строкой. - person Michael   schedule 12.04.2014