这样写对吗?

Is this writing correct?

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

当我点击模拟这段代码时,它显示了一个错误,如 (18) wrong parameters 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

盲目修复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" 指令族(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

通常,根据您的假设验证任何指令的最简单方法是输入 google“x86 <name_of_instruction>”并查找一些域名,您会随着时间的推移识别出包含原始英特尔文档的转换进入 HTML。例如这个:http://x86.renejeschke.de/