【问题标题】:Memory-Mapped Graphics Output内存映射图形输出
【发布时间】:2016-01-08 03:16:13
【问题描述】:

我正在探索使用内存映射图形绘制像素和线条。我在 Windows 的 Textpad 中使用 TASM。当我点击运行时,整个屏幕变成蓝色,就是这样,没有绘制像素。

.model small
.stack
.data  

saveMode db ?
xVal dw ?
yVal dw ?

.code
main proc
mov ax, @data
mov ds, ax

call SetVideoMode
call SetScreenBackground        
call Draw_Some_Pixels
call RestoreVideoMode


mov ax, 4c00h
int 21h
main endp

SetScreenBackground proc
    mov dx, 3c8h
    mov al, 0
    out dx, al

    mov dx, 3c9h
    mov al, 0
    out dx, al

    mov al, 0
    out dx, al
    mov al, 35
    out dx, al
    ret
SetScreenBackground endp 

SetVideoMode proc
    mov ah, 0fh
    int 10h
    mov saveMode, al

    mov ah, 0
    mov al, 13h
    int 10h

    push 0A00h
    pop es
    ret
SetVideoMode endp

RestoreVideoMode proc
    mov ah, 10h
    int 16h

    mov ah, 0
    mov al, saveMode
    int 10h
    ret
RestoreVideoMode endp

Draw_Some_Pixels proc
    mov dx, 3c8h
    mov al, 1
    out dx, al

    mov dx, 3c9h
    mov al, 63
    out dx, al
    mov al, 63
    out dx, al
    mov al, 63
    out dx, al

    mov xVal, 160
    mov yVal, 100

    mov ax, 320
    mul yVal
    add ax, xVal

    mov cx, 10
    mov di, ax

    DP1:
        mov BYTE PTR es:[di], 1

        add di, 5
    Loop DP1
    ret

Draw_Some_Pixels endp

【问题讨论】:

  • 我认为您正在使用的视频内存位于 a0000 。此代码 push 0A00h pop es 引用 a000 ((a00push A000h pop es ((a000a0000
  • @MichaelPetch: A000h 可以解释为标签。最好用 null 来装饰它:0A000h.
  • @rkhb :是一个错字。我快速输入了评论。

标签: assembly dos x86-16 tasm


【解决方案1】:

问题似乎与video mode 13h 关联的段有关。

设置视频模式后,下一步就是在屏幕上绘制一些东西。 VGA 内存位于物理地址 0xA0000

您的代码可以:

SetVideoMode proc
    mov ah, 0fh
    int 10h
    mov saveMode, al

    mov ah, 0
    mov al, 13h             ; Video mode 13h
    int 10h

    push 0A00h              ; Incorrect should be 0A000h
    pop es
    ret
SetVideoMode endp

视频模式 13h 将使用0A000h:0 的段:偏移量(ES:0 在您的情况下)解决。 0A000h:0 将是物理地址 (0A000h 0A0000h。

代码可以修改为:

    push 0A000h
    pop es

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2013-04-25
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    相关资源
    最近更新 更多