我正在学校(大会)开始一个新的langange,我需要为那个班级做一个工作。我正在使用DOSBox 0.74。 我需要一个函数来保存所有Console内容遮罩的数组,但是我该怎么做呢? 我试过这个,
salva_ecran proc
xor bx,bx
mov cx,25*80
salva:
mov dl, es:[bx]
mov consoleText[bx], dl
inc bx
cmp bx, cx
jb salva
ret
salva_ecran endp
但它没有用。我的变量是consoleText db 80 dup ( 25 dup (?),13,10 )
。
答案 0 :(得分:1)
consoleText
定义是80x27字节(不是25x82!),而那些13,10是无用的,因为你将用mov consoleText[bx], dl
覆盖它们,所以你需要的所有存储空间都是{{1 }}
consoleText db 80*25 dup (?)
设置为mov dl, es:[bx]
,则 es
可能会读取文字模式的视频内存(从您的代码中看不到)。
但80x25的文本模式视频RAM(我认为模式03h)确实每个字符使用两个字节,对的第一个字节是扩展ASCII码,第二个字节是带颜色的属性,请参阅https://en.wikipedia.org/wiki/VGA-compatible_text_mode和其他资源。因此,您只阅读一半字符和一半颜色,只读取我认为0B800h
可以在实模式下工作的所有字符(或使用mov dl, es:[bx*2]
代替si
,以防情况16b真实模式无法使用bx
寻址模式。)
新行在视频内存中开始,在前一行之后,视频RAM中没有13,10,实际上那些是有效的字体字形(13是音符IIRC),所以bx*2
的前160字节是第一行80个字符(带颜色),然后是地址160(B800:0000
),第二行立即开始。
目前尚不清楚如何验证/打印存储的内容,因此很难说什么是"没有工作"。使用始终调试器来验证您是否按预期获得了值。
要保存/恢复全文模式VRAM,你当然应该存储颜色(所以80 * 25 * 2字节的缓冲区),然后像那样恢复它们,这只有在正在运行的应用程序不会改变VRAM的开头时才有效或其他VGA控制寄存器,影响输出(即仅在原始B800:00A0
状态)。此类存储/恢复也不会恢复BIOS光标位置以及可能还有其他BIOS变量,因此如果您想真正保存"控制台",还有其他更多工作要做,而不仅仅是复制VRAM内容。 / p>
但总的来说这看起来很不错,代码很简单,恰到好处,在学习基础知识的同时不用担心性能问题。但是,学习如何有效地使用调试器对于您的未来(大会学习)至关重要。
答案 1 :(得分:0)
屏幕上的字符成对出现:字符和颜色,因此您只需要将变量大小加倍(和计数器!):
.model small
.stack 100h
.data
some_text db 'StackOverflow!',13,10,'$'
consoleText db 80*25*2 dup(?) ;◄■■ * 2
.code
mov ax, @data
mov ds, ax
mov ax, 0b800h
mov es, ax
mov ah, 9
lea dx, some_text
int 21h
call salva_ecran
mov ax, 4c00h
int 21h
salva_ecran proc
xor bx,bx
mov cx,25*80 * 2 ;◄■■ * 2
salva:
mov dl, es:[bx]
mov consoleText[bx], dl
inc bx
cmp bx, cx
jb salva
ret
salva_ecran endp