我正在使用emu8086。我有一个问题要求我在从六进制输入转换后显示我们在七段显示器上看到的内容。我应该以hexa输入我的数据,如果它与七段表的六进制输入匹配,它会显示十进制数,例如。 3FH = 0,06H = 1.我正在使用数组来实现这个程序。以下是工作源程序:
ORG 100H
MOV AL,[1840H] ;input in this memory location
MOV CL,0AH ; initialize length counter
AGAIN: CMP AL,MSG+BX ; compare to check if the data matches
JE RESULT ; jump to RESULT if data matched
INC BX ; increase decimal output by 1 if data not matched
LOOP AGAIN
MOV [1841H],0FFH ; display FF if no data matched the array
HLT
MSG DB 3FH, 06H, 5BH, 4FH,66H, 6DH,7DH,07H,7FH,6FH ; my array with hexa inputs
RESULT: MOV [1841H],BL ; display data if matched
我有这个程序在工作。但是我尝试过把我的数组MSG DB 3FH ...切换到ORG 100H之后和MOV AL之前的位置,[1840H],运行程序会出现错误消息“未知的操作码被跳过:66,而不是8086指令 - 还不支持“。我找不到原因。
任何人都知道是什么原因,如果我要将数组保存在ORG 100H和MOV AL之间,[1840H],我能解决任何问题以使我的程序正常工作吗?
答案 0 :(得分:0)
通过在第一条指令前移动数据阵列MSG,您有效地要求emu8086执行它! MSG的第一个字节对应有效的8086指令(AAS,PUSH ES,POP BX和DEC DI),但第五个字节代表8086处理器中不可用的OPERAND OVERRIDE PREFIX!
要解决您的问题,请跳过MSG:
ORG 100H
jmp start
MSG DB 3FH, 06H, 5BH, 4FH,66H, 6DH,7DH,07H,7FH,6FH ; my array with hexa inputs
start:
MOV AL,[1840H] ;input in this memory location
MOV CL,0AH ; initialize length counter
AGAIN: CMP AL,MSG+BX ; compare to check if the data matches
JE RESULT ; jump to RESULT if data matched
INC BX ; increase decimal output by 1 if data not matched
LOOP AGAIN
MOV [1841H],0FFH ; display FF if no data matched the array
HLT
RESULT: MOV [1841H],BL ; display data if matched
让我感到困惑的是你使用方括号
你不应该写cmp al,[MSG+BX]
,因为你用p.e. mov AL,[1840H]
另外,LOOP使用CX作为计数器,而只初始化CL。