【发布时间】:2016-04-02 16:20:04
【问题描述】:
我编写了一个函数,旨在将 4 个字母的字符串与缓冲区中的前 4 个字母进行比较:
is_cmd:
; bx is the string address argument
push bx ; Push bx to stack
mov cx, [bx] ; and also move into cx
mov bx, BUFFER ; Reset BUFFER_INDEX
mov [BUFFER_INDEX], bx ; so it points to first 2 characters
mov bx, [BUFFER_INDEX]
cmp cx, [bx] ; Compare
jne is_cmd_no ; Jump if not equal
pop bx ; Retrive bx from stack
inc bx ; Move pointer to next 2 characters
mov cx, [bx] ; Move to cx
mov bx, [BUFFER_INDEX] ; Move BUFFER_INDEX into bx
inc bx ; and move to next 2 characters
cmp cx, [bx] ; Compare
jne is_cmd_no ; Jump if not equal
jmp is_cmd_yes ; Jump if equal both times
is_cmd_no:
mov ax, 1 ; Set ax to 1 so jz will not jump
ret
is_cmd_yes:
mov ax, 0 ; Set ax to 0 so jz will jump
ret
以下是它的用法示例:
mov bx, REBOOT_CMD
call is_cmd
or ax, ax
jz reboot_cmd
这里是所有变量:
REBOOT_CMD:
db "rset",0
BUFFER_INDEX:
dw BUFFER
BUFFER:
times 80 db 0
BUFFER_END:
但是,当字符串不相等时,它会导致模拟器 (BOCHS) 挂起。为什么?
【问题讨论】:
-
看看你的推送和弹出。比较后,你推但没有弹出。 (无关)
inc bx没有使其指向下一组 2 个字符。你需要add bx, 2这里。 -
没有必要使用[buffer_index],为什么不简单地将[bx]与[Buffer]和[bx+2]与[buffer+2]进行比较?