問題是從程式集 8086 中的字串中洗掉第一個出現的空格。我撰寫了一個測驗代碼,這顯然不起作用。我的想法如下:將 di 和 si 都設定為相同的字串。只要沒有找到任何字符,就保持 di 相同。一旦找到一個字符,就開始將 di 設定為之后的值。在這種情況下,“sometext mytext”應該在 8 次迭代后保持不變,然后“sometext mytext”->“sometextmmytext”->“sometextmyytext”->...->“sometextmytexxt”->“sometextmytext$$”
然后最后一個 $ 可以手動洗掉。
現在,我使用標志 CF 來了解是否找到了空間。但奇怪的是,CF 設定得比它應該設定的早,當我嘗試除錯代碼時,我看到 di 正在改變,而它仍然不應該改變。我是錯誤地除錯還是我的依賴于 CF 的代碼真的有問題?另外,如果我運行我發布的代碼,它會說“未找到”,這也很奇怪。這讓我覺得我的代碼邏輯完全有缺陷,但我不明白為什么。您能否解釋一下出了什么問題,并可能發布或提示更好的解決方案?我也嘗試過使用 lods/stos 來解決,但我也失敗了。提前致謝。
PS,您可以猜到我是組裝新手。也許在某些地方我的代碼太長了,但我可以讓它更短(我并沒有那么專注于這項任務,因為我仍在努力讓這段代碼作業)。此外,我可能正在糾正低效的代碼(即使我現在的首要任務是解決問題本身)。但是,歡迎任何建議。
編輯:我已經硬編碼了字串的長度,我知道可以從它的第一個位元組中檢索它,但我一開始試圖解決這個示例。
.model small
.stack 256
.data
a db "sometext mytext$"
b db 10,"found$"
c db 10,"not found$"
.code
entrr proc
push ax dx
mov ah,2
mov dl,10
int 21h
mov dl,13
int 21h
pop dx ax
ret
entrr endp
PRINT MACRO x
push ax
push dx
mov ah,09
mov dx,x
int 21h
pop dx
pop ax
ENDM
START:
mov ax,@data
mov ds,ax
mov bl, ' '
mov cl, '$'
xor ax,ax
xor cx,cx
clc
lea si, a
lea di, a
compare:
cmp cx, 15
je endstr
jnc check_for_space
jc setdi
inc cx
jmp compare
check_for_space:
cmp [si 1], bl
je found
inc di
inc si
inc cx
jmp compare
setdi:
mov bl,[si 1]
mov [di],bl
inc di
inc cx
jmp compare
found:
push di
lea di,b
PRINT di
pop di
stc
inc si
inc cx
jmp compare
endstr:
jnc notfound
jmp done
notfound:
lea si,c
PRINT si
jmp finish
done:
; print di
finish:
mov ax,4c00h
int 21h
END START
uj5u.com熱心網友回復:
compare: cmp cx, 15 je endstr jnc check_for_space jc setdi
罪魁禍首是cmp cx, 15回圈頂部的指令。cmp修改標志:
- 當
CXis 從 0 到 14 時,代碼顯然不會跳轉到endstr,但是因為會設定進位標志(暫存器中的值低于15),所以代碼會跳轉到setdi(你不想要的東西)。 - 當
CXfinally 變成 15 時,代碼確實會跳轉到endstr,但是因為相等還需要清空進位標志,所以endstr處的代碼會跳轉到notfound
下一個代碼應該給你一個想法:
mov bl, ' '
lea si, a ; Address of the string
mov di, si
mov cx, 15 ; Length of the string
Again:
cmp [si], bl
je IsSpace
inc di
inc si
dec cx
jnz Again
NotFound:
...
jmp Quit
Copy:
mov al, [si]
mov [di], al
inc di
IsSpace:
inc si
dec cx
jnz Copy
Found:
...
Quit:
...
我們不會跳到Copy回圈的頂部,因為它可能是在字串的最后一個位置找到了空格字符,我們通過dec cx轉零來識別這一事實。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/457484.html
上一篇:當結果對于暫存器來說很大時,進位和溢位標志的行為如何
下一篇:C中的行內匯編
