将控制台遮罩内容保存到阵列(程序集)中

时间:2017-05-11 17:12:32

标签: assembly dosbox

我正在学校(大会)开始一个新的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 )

ps:我真的很陌生,如果这个问题很荒谬,或者代码不好而效率低,那就很抱歉。

2 个答案:

答案 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