盲目嘗試修復代碼emu8086:
.MODEL SMALL
.STACK 64
.DATA
DIZI DB 'LDA#305A'
.CODE
ANA PROC FAR
MOV AX, @DATA
MOV ES, AX ; es for SCASB
CLD
MOV AL, '#'
MOV BH, '$'
MOV CX, 9
LEA DI, [DIZI]
REPNE SCASB ; should now work over correct ES:DI memory.
JNE CIK
MOV [ES:DI-1], BH ; try ES:[DI-1] in case of syntax err.
; ^^ needs now "ES:" prefix, because I don't set "DS"
CIK: MOV AH, 4CH
INT 21H
ANA ENDP
END ANA
另一種選擇是同時設置ds
和es
,像這樣:
ANA PROC FAR
MOV AX, @DATA
MOV DS, AX ; ds for default memory access
MOV ES, AX ; es for SCASB
...
... then modifying the char can be done without "ES:" prefix, using default "DS:"
JNE CIK
MOV [DI-1], BH
...
而且閱讀很重要您使用的指示的詳細說明。例如,SCASB非常特殊,它固定爲ES:DI
內存指針,並且不能被任何段前綴覆蓋(與80%其他指令相反,其可以從默認DS/SS加到其他任何指令的前綴)。
的「弦」按照壓家庭(其中SCASB所屬)是特別棘手,因爲源指針DS:SI可以被覆蓋,即:
MOVSB ; moves single byte from [DS:SI] to [ES:DI], ++SI, ++DI
SS:MOVSB ; moves single byte [SS:SI] to [ES:DI], ++SI, ++DI
通常以驗證對你的假設的任何指令的最簡單方法是要進入谷歌「x86 <name_of_instruction>
」,並尋找一些域名,你會認識到隨着時間的推移將原始的英特爾文檔轉換成HTML。像這樣的例子:http://x86.renejeschke.de/
請擴大「它不工作」。 –
刪除「DS:」,只留下DI。 –
@Jose Manuel AbarcaRodríguez它仍然以這種方式在字符串中顯示#符號。 – NoWeDoR