【问题标题】:Copy from VRAM using movsb?使用 movsb 从 VRAM 复制?
【发布时间】:2019-09-08 02:01:09
【问题描述】:

在 x86 asm 中,在 VGA 模式 13 中从 VRAM 复制到数组变量的正确、快速方法是什么?我可以使用 movsb 复制到 VRAM 没有问题,但是使用 movsb 从 VRAM 复制 会产生奇怪的结果,或者可以让我的程序崩溃。

我有一个测试程序在 VRAM 中创建一行,将该行从 VRAM 复制到一个变量,然后将该变量复制到 VRAM 中的另一个位置。该程序无法按原样运行 - 奇怪地将 count dw 320 更改为 count equ 320 使其运行。知道我做错了什么吗?我不认为更改 count 变量是可行的解决方法。

; assemble with A86
jmp main

vdata db 320 dup 14
vdata_backup db 320 dup 0

video_memory equ 0a000h
count dw 320

wait_for_key:
        mov ax, 0h
        int 016h
        ret

main:
        ; set up mode 13
        mov ax, 013h
        int 10h

        ; copy some data to VRAM
        ; create a line on the screen
        mov si, offset vdata
        mov es, video_memory
        mov di, 640
        mov cx, count
        rep movsb

        ; copy from VRAM to vdata_backup
        push ds
        mov ds, video_memory
        mov si, 640
        mov es, code
        mov di, offset vdata_backup
        mov cx, count
        rep movsb
        pop ds

        ; copy vdata_backup to different part of VRAM
        ; create a new line on the screen
        mov si, offset vdata_backup
        mov es, video_memory
        mov di, 3200
        mov cx, count
        rep movsb

        call wait_for_key

        ; set back to text mode
        mov ah, 0
        mov al, 3
        int 10h

        ; exit to dos
        mov ah, 4ch
        int 21h

【问题讨论】:

  • 顺便说一句,回到真正的 80386 和 80486 上,您确实想避免大量读取 VRAM,在许多 VGA 卡上,对 VRAM 的 write 已经比写入慢 5-10 倍进入常规 RAM(在具有良好缓存的卡上,它慢 1.5-3 倍),但 read 在具有良好缓存的卡上甚至比写入慢 3-5 倍,因为没有人期望进行多次读取。当您在常规内存中生成最终图像并仅复制到 VRAM 时,需要背景数据的图形效果通常会运行得更快,即使在当前 VRAM 缓冲区可能像模糊效果这样方便的情况下也是如此。

标签: assembly x86 dos x86-16 video-memory


【解决方案1】:

在代码部分从 VRAM 复制到 vdata_backup 你这样做:

push ds
mov ds, video_memory 
[snip]
mov cx, count

您已更改 DS,使其指向视频图形段 A000。那不是count 所在的段。 mov cx, count 隐式使用 DS 段,类似于使用 mov cx, [ds:count]。您从内存中的错误位置检索了count。简单的解决方法是在修改 DS 之前检索 count。代码可能如下所示:

push ds
mov cx, count
mov ds, video_memory 
[snip]

【讨论】:

  • 太好了,这很快就奏效了。谢谢你。这有助于我进一步了解 movsb 的工作原理。也许我所做的很奇怪,但我还没有找到关于更新 ds 寄存器的副作用的文本。
猜你喜欢
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
相关资源
最近更新 更多