跳过未知操作码:66,不是8086指令-尚不支持 [英] Unknown opcode skipped: 66, not 8086 instruction - not supported yet
本文介绍了跳过未知操作码:66,不是8086指令-尚不支持的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用emu8086。我有一个问题,这个问题让我在从六进制输入转换后,在七个分段显示器上显示我们看到的内容。我应该用十六进制输入我的数据,如果它与七段表的十六进制输入相匹配,它会显示十进制数,例如。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]
之间,我可以修复任何东西来使我的程序工作吗?
推荐答案
通过将数据数组消息移到第一条指令前面,您有效地请求emu8086执行它!消息的第一个字节对应于有效的8086指令(AAS
、PUSH ES
、POP BX
和DEC DI
),但第五个字节表示操作数大小前缀,这在8086处理器中不可用!
要快速解决问题,只需跳过邮件:
ORG 100H
jmp start
MSG DB 3FH, 06H, 5BH, 4FH,66H, 6DH,7DH,07H,7FH,6FH
start:
但更好的做法是像最初那样将它放在代码后面,这样一开始就不会有问题了。让程序的第一条指令是jmp
是没有好处的,因为您可以直接将代码放在那里,除非您希望它位于二进制文件中的标准位置,这样其他东西就可以编辑文件。(.com
可执行文件没有元数据来告诉程序加载器入口点在哪里;它固定在文件的第一个字节IP=100h。)
一些观察结果
- 在
LOOP AGAIN
中,LOOP
指令依赖于整个CX
寄存器,而您只通过MOV CL,0AH
初始化其低8位。 - 您的代码还使用
BX
寄存器为数组编制索引,但您从未将BX
置零,因此无法确保程序运行正常。 - 在
MOV [1841H],0FFH
中,在将其立即写入内存位置时,您似乎依赖于emu8086缺省为字节大小。我建议始终按照您需要的大小进行调整,如mov byte ptr [1841h], 255
中所示。 - 让我困惑的是
CMP AL,MSG+BX
中没有方括号。
您不应该像在mov AL, [1840H]
、MOV [1841H],0FFH
和MOV [1841H],BL
中方括号一样使用cmp al, [MSG+BX]
吗? 有关MASM(emu8086是MASM风格的)中方括号用法的更多困惑(以及一些澄清),请阅读this Ross Ridge answer。
我的修订版程序:
ORG 256
jmp start
msg db 3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 07h, 7Fh, 6Fh
start:
mov al, [1840h]
xor bx, bx ; ArrayIndex (offset)
again:
cmp al, [msg+bx]
je result
inc bx
cmp bx, 10 ; NumberOfElements
jb again
mov bl, -1
result:
mov [1841h], bl ; display ARRAYINDEX if matched else display FF
hlt
相关/重复:
- Assembly (x86): <label> db 'string',0 does not get executed unless there's a jump instruction-在BIOS MBR引导扇区中出现相同错误
- Segmentation fault when using DB (define byte) inside a function-在现代操作系统下运行的x86-64代码中存在相同的错误。
这篇关于跳过未知操作码:66,不是8086指令-尚不支持的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文