【问题标题】:How can i solve error when drawing image in emu8086在emu8086中绘制图像时如何解决错误
【发布时间】: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 的情况下读取了那么多字节,因此看起来正确。

标签: assembly x86-16 emu8086


【解决方案1】:

...了解导致此错误的原因...

代码段被数据覆盖,随后ret 指令返回到不再包含emu8086 可以识别的有效指令的位置。

DS 段寄存器包含 0714h,而 CS 段寄存器包含 0715h,之后仅 16 个字节。 .Data 部分设置不正确。我怀疑roseFilehandle DW ?中的问号是罪魁祸首!

根据emu8086分配给roseData缓冲区的地址(8),我建议你重写.Data部分,如下:

.Data

roseWidth EQU 200
roseHeight EQU 195

roseFilename   DB 'rose.img', 0
roseData       DB roseWidth*roseHeight dup(0)
roseFilehandle DW 0

您可能还想将堆栈放大到更实际的大小:.Stack 256

为了与现有 BIOS 最大程度地兼容,您不应使用 BX 来循环图像数据,而是使用 SI 并设置 BH=0 以选择显示页面 0。

  mov  bh, 0
  mov  si, OFFSET roseData
drawLoop:

【讨论】:

    猜你喜欢
    • 2020-03-09
    • 2013-09-15
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多