Как сравнить строки в ассемблере?

Я просмотрел Как сравнить сборку двух строк, и я пытаясь сравнить символ за символом, пока символ не будет совпадать, и я не могу заставить свой код работать так, как я хочу.

Я делаю простую оболочку и начинаю с команды 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 для ввода и вывода.

Он выводит «Неизвестная команда» каждый раз, несмотря на ввод «помощи».


person icedvariables    schedule 12.04.2014    source источник
comment
Ваш parseInputLoop никогда не читает из каких-либо строк, поэтому он не выполняет сравнение строк. Весь код кажется слишком сложным. Просто сохраните входные символы в буфере, а затем используйте repe cmpsb для сравнения содержимого буфера с некоторой строкой.   -  person Michael    schedule 12.04.2014


Ответы (1)


mov bh, [bx]
mov bl, s_HELP_COMMAND

The first line loads a byte from... whatever bp pointed to. I suppose it's an entered character(?). The second line loads the low byte of the address (offset part of the address) of s_HELP_COMMAND. This does not seem useful.

Возможно, вы имели в виду mov bl, [s_HELP_COMMAND]. Это даст вам символ «h». Увеличение его даст вам «g», а не следующий символ в команде («e»).

Может быть еще одно осложнение. [bp] по умолчанию равно [ss:bp]. [bx] по умолчанию равно [ds:bx] Если только ss = ds (может быть правдой - вы не показываете эту часть), они не будут ссылаться на одно и то же место в памяти.

Я предлагаю вам переосмыслить всю вашу программу parseInput (и, возможно, предыдущие процедуры). Делайте меньшие шаги!

person Frank Kotler    schedule 12.04.2014