这个写作是否正确?

时间:2016-12-09 17:24:42

标签: assembly x86-16 emu8086

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

当我点击模拟此代码时,它显示错误,如(18)错误参数LEA [DI],DIZI

有什么问题?

    .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 :(得分: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加到任何其他指令) )。

“string”intruction系列(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/