В x86 asm, каков правильный и быстрый способ копирования из VRAM в переменную массива в режиме VGA 13? Я могу без проблем скопировать в VRAM с помощью movsb, но копирование из VRAM с помощью movsb приводит к странным результатам или может сбой моей программы.
У меня есть тестовая программа для создания строки в 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