错误:"跳过未知的操作码:32"

时间:2017-03-19 03:40:41

标签: variables assembly declaration x86-16 emu8086

我写了一个8086程序,据我所知它运行正常,但当它到达我声明变量的部分时,模拟器给了我一个错误。尝试运行第temp db 0x0F行时,模拟器会说:

  

跳过未知的操作码:32

     

不是8086指令 - 尚不支持。

这是我的完整计划:

org 100h
mov ah, temp ;put variables into registers
mov al, changed
mov dx, result
lea bx, temp ;get address of temp and put into bx
add dx, [bx] ;add value at the address in bx to result
lea bx, changed ;get address of changed and put into bx
add dx, [bx] ;add value at the address in bx to result
temp db 0x0F ;declare and initialize variables
changed db 32h
result dw 0

这对程序如何运作产生影响,我该如何解决?

编辑:sigjuice解决了这个问题,正如您在评论中看到的那样。这是正确运行的程序的最终版本:

.CODE
org 100h
mov ah, temp ;put variables into registers
mov al, changed
mov dx, result
lea bx, temp ;get address of temp and put into bx
add dx, [bx] ;add value at the address in bx to result
lea bx, changed ;get address of changed and put into bx
add dx, [bx] ;add value at the address in bx to result
.DATA
temp db 0x0F ;declare and initialize variables
changed db 32h
result dw 0

1 个答案:

答案 0 :(得分:1)

add dx, [bx] ;add value at the address in bx to result
temp db 0x0F ;declare and initialize variables

在程序的这一部分中,没有什么可以阻止CPU在 temp 标签上执行数据,就像它是一条指令一样。

尽管添加.CODE.DATA汇编程序指令(可能由@sigjuice建议)似乎可以解决问题,但这通常不是您在编写.COM可执行文件时使用的。它是一个.COM可执行文件,因为您使用了org 100h指令。

您的程序真正需要的是返回操作系统的方法。由于这是EMU8086,首选方法是使用DOS.TerminateWithReturncode函数。

add  dx, [bx]   ;add value at the address in bx to result
                ; Exit to the operating system
mov  ax, 4C00h  ;AH=4Ch function number, AL=0 exitcode (0 most often means OK)
int  21h        ;DOS system call
                ; Now beyond this point nothing gets executed inadvertently
temp db 0Fh     ;declare and initialize variables

我真的不建议只使用ret指令返回操作系统,因为这种方法要求SS:SP寄存器设置为程序启动时的寄存器。情况并非总是如此。最好使用不依赖于任何特定寄存器设置的DOS功能。

lea bx, temp ;get address of temp and put into bx
add dx, [bx] ;add value at the address in bx to result
lea bx, changed ;get address of changed and put into bx
add dx, [bx] ;add value at the address in bx to result

与您的原始问题无关,但作为奖励:

因为 temp 已更改都是字节大小变量,所以字大小添加内容为&#39 ;只需单独添加变量,还可以添加在内存中跟随它们的字节!有时这是故意的(我真的怀疑这是这种情况!),但你需要确保你理解这一点。