[英]Comparing strings in 8086 real mode
我編寫了一個函數,旨在將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)掛起。 為什么?
使用AX進行比較,無論如何它都已經改變了; 無需破壞其他任何東西; 並讓CPU執行“指針計算”,您可以從[BX + 2]中讀取,無需更改它
mov bx, REBOOT_CMD
call is_cmd
or ax, ax
jz reboot_cmd
is_cmd:
mov ax, [bx]
cmp ax, [BUFFER] ; [buffer] with [bx]
jne is_cmd_no
mov ax, [bx+2]
cmp ax, [BUFFER+2] ; [buffer+2] with [bx+2]
jne is_cmd_no
mov ax, 1 ; is_cmd_yes
ret
is_cmd_no:
xor ax, ax
ret
甚至更好,將其內聯到用例中
is_reboot:
mov ax, [REBOOT_CMD]
cmp ax, [BUFFER] ; [buffer] with "rs"
jne no_reboot
mov ax, [REBOOT_CMD+2]
cmp ax, [BUFFER+2] ; [buffer+2] with "et"
jz reboot_cmd
no_reboot:
注意:2個分支不同,第一個是“ jne”,第二個是“ jz”,用於重新啟動。 就像C中的“ AND”,如果第2部分的結果為TRUE,則僅對表達式的第2部分進行求值
如果您感到困惑,即使“ BUFFER db“ rset”,0“已過時,也可以將[BUFFER]與” rs“(即” s“ + 0x100 *” r“ = 0x7372)和[BUFFER + 2]與“ et”(=“ e” + 0x100 *“ t” = 0x7465):
is_reboot:
cmp word ptr [BUFFER],0x7372 ; [buffer] with "rs"
jne no_reboot
cmp word ptr [BUFFER+2],0x7465 ; [buffer+2] with "et"
jz reboot_cmd
no_reboot:
有關檢查是否為命令的建議。 請注意,我為匹配項分配了“ TRUE”值1,為不匹配結果分配了FALSE
值0。 如果您真的喜歡它,只需在下面的代碼中交換mov ax,1
和xor ax, ax
。 另請注意,沒有必要使用BUFFER_INDEX
。
is_cmd:
mov cx, [bx]
mov dx, [bx+2]
lea bx, BUFFER ; Reset BUFFER_INDEX to effective address of BUFFER
; -- mov [BUFFER_INDEX], bx ; so it points to first 2 characters
; -- mov bx, [BUFFER_INDEX] ; is redundant, because BX is already equal to BUFFER_INDEX
cmp cx, [bx] ; compare first two chars
je first_two_match
jmp is_cmd_no
first_two_match:
cmp dx, [bx+2] ; compare the second two chars
jne is_cmd_no
mov ax, 1 ; is_cmd_yes
ret
is_cmd_no:
xor ax, ax
ret
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.