【发布时间】:2022-06-10 19:58:19
【问题描述】:
我有用于绘制 img 文件的 8086 代码。我可以在dosbox中使用它,但是当它在emu8086中运行时,我得到了这个错误
unknown opcode skipped:0F
not 8086 instruction - not supported yet.
运行 ret 命令后 readdata 函数出现此错误。我试图了解导致此错误的原因,但我不能。我只想知道怎么解决。
这是我尝试绘制的图像:drivelink
.Model Small
.Stack 64
.Data
roseWidth EQU 200
roseHeight EQU 195
roseFilename DB 'rose.img', 0
roseFilehandle DW ?
roseData DB roseWidth*roseHeight dup(0)
.Code
MAIN PROC FAR
MOV AX , @DATA
MOV DS , AX
MOV AH, 0
MOV AL, 13h
INT 10h
CALL OpenFile
CALL ReadData
LEA BX , roseData ; BL contains index at the current drawn pixel
MOV CX,0
MOV DX,0
MOV AH,0ch
; Drawing loop
drawLoop:
MOV AL,[BX]
INT 10h
INC CX
INC BX
CMP CX,roseWidth
JNE drawLoop
MOV CX , 0
INC DX
CMP DX , roseHeight
JNE drawLoop
; Press any key to exit
MOV AH , 0
INT 16h
call CloseFile
;Change to Text MODE
MOV AH,0
MOV AL,03h
INT 10h
; return control to operating system
MOV AH , 4ch
INT 21H
MAIN ENDP
OpenFile PROC
; Open file
MOV AH, 3Dh
MOV AL, 0 ; read only
LEA DX, roseFilename
INT 21h
; you should check carry flag to make sure it worked correctly
; carry = 0 -> successful , file handle -> AX
; carry = 1 -> failed , AX -> error code
MOV [roseFilehandle], AX
RET
OpenFile ENDP
ReadData PROC
MOV AH,3Fh
MOV BX, [roseFilehandle]
MOV CX,roseWidth*roseHeight ; number of bytes to read
LEA DX, roseData
INT 21h
RET; ERROR OCCURS HERE
ReadData ENDP
CloseFile PROC
MOV AH, 3Eh
MOV BX, [roseFilehandle]
INT 21h
RET
CloseFile ENDP
END MAIN
【问题讨论】:
-
听起来你破坏了堆栈。验证返回地址未被覆盖。您似乎分配了足够大的缓冲区并在正确设置
DS的情况下读取了那么多字节,因此看起来正确。