2016-12-09 37 views
0

我学习汇编语言的一本书定义了下面的例子,将#符号改为$符号。但是,当我在emu8086中尝试这个时,它不起作用。这篇文章是否正确?

当我点击效仿这一代码它显示我像(18)错误的参数LEA [二]错误,笛子

问题是什么?

.MODEL SMALL 
    .STACK 64 

    .DATA 
    DIZI DB 'LDA#305A' 

    .CODE 
    ANA PROC FAR 
     MOV AX, @DATA 
     MOV DS, AX 
     CLD 
     MOV AL, '#' 
     MOV BH, '$' 
     MOV CX, 9 
     LEA DS:DI, DIZI 
     REPNE SCASB 
     JNE CIK 
     MOV BYTE PTR[DI-1], BH 

    CIK: MOV AH, 4CH 
     INT 21H   

    ANA ENDP 
     END ANA 
+1

请扩大“它不工作”。 –

+0

删除“DS:”,只留下DI。 –

+0

@Jose Manuel AbarcaRodríguez它仍然以这种方式在字符串中显示#符号。 – NoWeDoR

回答

1

盲目尝试修复代码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 

另一种选择是同时设置dses,像这样:

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/

+0

我没注意你的评论。它必须有ES:[DI-1]。谢谢! – NoWeDoR

+0

@NoWeDoR我现在习惯了NASM语法,其中段前缀放在'[]'里面。一旦你对于指令可以做什么以及它们*可能会看起来怎么样更加舒服,你就会开始忽略这些微小的语法差异,并且当有人会建议你时,你将能够正确地修复它们。其他汇编语法的意外。 (所生成的机器代码当然是同一个,所以如果您将通过调试器进行反汇编,您将得到一种更加不同的语法,这次是反汇编使用的语法) – Ped7g

+0

“...将[DS:SI ]到[ES:DI],++ SI,++ DI ...“通常这些符号表示* pre-increment *,但所有字符串基元只允许*后递增*和*后递减* –