我写了一个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
答案 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 ;只需单独添加变量,还可以添加在内存中跟随它们的字节!有时这是故意的(我真的怀疑这是这种情况!),但你需要确保你理解这一点。