如何比较汇编中的字符串?

时间:2014-04-12 17:47:13

标签: assembly compare user-input 16-bit real-mode

我已经查看了How to compare two strings assembly,我正在尝试逐个字符进行比较,直到角色不匹配为止我似乎无法将代码转到功能我想要它。

我制作了一个简单的shell,我从帮助命令开始:

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中断来实现输入和输出。

输出'未知命令'每次尽管进入'帮助'。

1 个答案:

答案 0 :(得分:0)

mov bh, [bx]
mov bl, s_HELP_COMMAND

mov bh, [bx] mov bl, s_HELP_COMMAND 第一行从......指向的加载一个字节。我想这是一个输入的角色(?)。第二行加载bp的地址的低字节(地址的偏移部分)。这似乎没用。

也许你打算s_HELP_COMMAND。这会给你角色'h'。增加它会给你'g',而不是命令中的下一个字符('e')。

可能还有一个并发症。 mov bl, [s_HELP_COMMAND]默认为[bp][ss:bp]默认为[bx]除非[ds:bx] = ss(可能是真的 - 您没有显示该部分),否则它们不会引用内存中的相同位置。

我建议你重新考虑整个ds例程(也许是之前的例程)。采取较小的步骤!