2

我正在使用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...到 afterORG 100H和 before的位置MOV AL,[1840H],运行程序会给出错误消息

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

我找不到原因。

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

4

1 回答 1

6

通过将数据数组MSG移动到第一条指令的前面,您有效地要求 emu8086 执行它!MSG的第一个字节对应于有效的 8086 指令(、、、AAS和),PUSH ES但第五个字节表示操作数大小前缀,这在 8086 处理器中不可用!POP BXDEC DI

要快速解决您的问题,只需跳过MSG

  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寄存器,但您只通过 初始化了它的低 8 位MOV CL,0AH
  • 您的代码还使用BX寄存器来索引数组,但您从未归零BX,因此您无法确定程序是否可以正常运行。
  • MOV [1841H],0FFH中,当将此立即数写入内存位置时,您似乎依赖于 emu8086 默认为字节大小。我建议始终强加您需要的大小,例如在mov byte ptr [1841h], 255.
  • 让我感到困惑的是CMP AL,MSG+BX.
    你不应该像在,和cmp al, [MSG+BX]中使用方括号一样写吗?有关在 MASM(emu8086 是 MASM 样式)中使用方括号的更多困惑(和一些澄清),请阅读此 Ross Ridge 答案mov AL, [1840H]MOV [1841H],0FFHMOV [1841H],BL

我修改后的程序版本:

  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

相关/重复:

于 2014-10-05T14:50:15.620 回答