首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用movsb从VRAM复制?

使用movsb从VRAM复制?
EN

Stack Overflow用户
提问于 2019-09-08 02:01:09
回答 1查看 160关注 0票数 2

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

我有一个测试程序来在VRAM中创建一行,将这一行从VRAM复制到一个变量,然后将该变量复制到VRAM中的另一个位置。这个程序不能正常工作--奇怪的是,将dw 320计数改为equ 320使其工作。知道我做错什么了吗?我不认为改变计数变量是一个可行的解决办法。

代码语言:javascript
复制
; 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-08 02:56:04

在从VRAM到vdata_backup的代码副本一节中,可以这样做:

代码语言:javascript
复制
push ds
mov ds, video_memory 
[snip]
mov cx, count

您已经更改了DS,因此它指向视频图形段A000。这不是count所在的段。mov cx, count隐式地使用DS段,类似于执行mov cx, [ds:count]。您从内存中的错误位置检索到了count。简单的修复方法是在修改DS之前检索count。代码看起来可能如下:

代码语言:javascript
复制
push ds
mov cx, count
mov ds, video_memory 
[snip]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57838662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档