跳过未知操作码:66,不是8086指令-尚不支持跳过、尚不、指令、操作

2023-09-03 12:33:16 作者:此处省略七个字

我正在使用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]之前的位置,运行程序会给出错误消息

用Notepad 编译java后在命令提示符中却显示javac不是内存或外部命令

跳过未知操作码:66,不是8086指令-尚不支持。

我找不到原因。

任何人都知道原因是什么,如果我将数组保持在ORG 100HMOV AL,[1840H]之间,我可以修复任何东西来使我的程序工作吗?

推荐答案

通过将数据数组消息移到第一条指令前面,您有效地请求emu8086执行它!消息的第一个字节对应于有效的8086指令(AASPUSH ESPOP BXDEC 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],0FFHMOV [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代码中存在相同的错误。