assembly - 使用 movsb 从 VRAM 复制?
问题描述
在 x86 asm 中,在 VGA 模式 13 中从 VRAM 复制到数组变量的正确、快速方法是什么?我可以使用 movsb 复制到VRAM没有问题,但是使用movsb从VRAM复制会产生奇怪的结果,或者会使我的程序崩溃。
我有一个测试程序在 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
解决方案
在从 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]
推荐阅读
- python - 按时间箱/间隔计算并发用户会话
- javascript - 即使使用时区设置,两个日期之间的时间差也会返回错误
- google-sheets - 当行被移动并且上面的行发生变化时在上面添加列
- r - 如何在r中为回归线上方和下方的ggplot点着色?
- python - 尽管 Big-O 相同,为什么这两个函数的性能差异如此之大?
- arrays - How to sort list by sub list value in flutter?
- kubernetes-ingress - haproxy-ingress 多个后端规则
- google-apps-script - Google Apps 脚本“脚本属性”实际上是“项目属性”吗?正确的范围是多少?
- java - Web 应用程序监听服务器事件的最佳方式
- android - 了解android中的隐藏过程