我已经查看了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中断来实现输入和输出。
输出'未知命令'每次尽管进入'帮助'。
答案 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
例程(也许是之前的例程)。采取较小的步骤!