首页 > 解决方案 > 使用 movsb 从 VRAM 复制?

问题描述

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

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

; 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

标签: assemblyx86dosx86-16video-memory

解决方案


从 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您已从内存中的错误位置检索到。简单的修复方法是在修改DScount之前进行检索。代码可能如下所示:

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

推荐阅读