组装8086-A MOV指令几个小时后成为一个附加组件

时间:2017-10-27 21:31:09

标签: assembly emu8086

我的装配程序有问题。它需要计算存储在两个数组(长度为9)中的每个数据的乘法,并将结果存储到9x9矩阵中。以下是我编写的代码,但它一直工作到第6个周期......然后指令MOV AL,LIST [DI]神奇地成为ADD,最后程序显示这个“未知操作码跳过:63不是8086指令 - 还不支持。“有没有人可以帮助我?

LEN                 EQU     10
                    .MODEL small
                    .STACK
                    .DATA
LIST                DB      LEN 
DUP(0010b,0110b,0011b,1001b,1010b,0110b,0010b,0011b,0101b)
ADDED               DB      LEN-1 DUP(?)
TAB                 DW      LEN-1*LEN-1 DUP(?)
                    .CODE
                    .STARTUP

                    PUSHA
                    XOR BX,BX
                    XOR SI,SI 
                    XOR DI,DI
                    MOV CX,LEN-1 
external_c:         MOV AL,LIST[DI]
                    MOV DL,AL
                    PUSH DI 
                    PUSH CX
                    MOV CX,LEN-1 
                    XOR DI,DI
internal_c:         MUL ADDED[DI]
                    MOV TAB[BX][SI],AX  
                    MOV AL,DL
                    ADD SI,2 
                    INC DI
                    LOOP internal_c
                    ADD BX,18                       ;TAB is made of word, so 
                                                     I must do 2*num_rows
                    XOR SI,SI 
                    POP CX   
                    POP DI
                    INC DI
                    LOOP external_c

                    POPA
                    .EXIT
                    END   

1 个答案:

答案 0 :(得分:1)

看起来未正确设置TAB大小,导致覆盖。 对于TAB,请在LEN-1周围尝试此更改(添加括号):

TAB     DW      (LEN-1)*(LEN-1) DUP(?)

可能还有其他问题。对于MASM(来自Microsoft的ML.EXE),我需要进行此更改:

;   DUP(0010b,0110b,0011b,1001b,1010b,0110b,0010b,0011b,0101b)
    DB   0010b,0110b,0011b,1001b,1010b,0110b,0010b,0011b,0101b