Сохранить содержимое консоли Visor в массив (сборка)

Я начинаю новый язык в школе (Ассамблея), и мне нужно сделать работу для этого класса. Я работаю над DOSBox 0.74. Мне нужна функция для сохранения в массиве всего козырька содержимого консоли, но как я могу это сделать? Я попробовал это,

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 ответа

Решение

consoleText определение 80x27 байт (не 25x82!), и эти 13,10 бесполезны, так как вы перезапишете их mov consoleText[bx], dl, так что все, что вам нужно для хранения consoleText db 80*25 dup (?),

mov dl, es:[bx] может читать видео ОЗУ в текстовом режиме, если es установлен в 0B800h (не видно из вашего куска кода).

Но видеопамять в текстовом режиме в формате 80x25 (я думаю, в режиме 03h) использует два байта на символ, первый байт пары - это код расширенного ASCII, второй байт - это атрибут с цветами, см., Вероятно, https://en.wikipedia.org/wiki/VGA-compatible_text_mode и другие ресурсы. Таким образом, вы читаете только половину символов и половину цветов, чтобы прочитать только все символы, я думаю mov dl, es:[bx*2] будет работать в реальном режиме (или использовать si вместо bxв случае, если 16b реальный режим не может использовать bx*2 режим адресации).

Новая строка начинается в видеопамяти сразу после предыдущей строки, в видеопамяти нет 13,10, фактически это действительные глифы шрифтов (13 - музыкальная нота IIRC), поэтому первые 160 байтов в B800:0000 первая строка из 80 символов (с цветами), затем по адресу 160 (B800:00A0) вторая строка начинается немедленно.

Непонятно, как вы проверяете / распечатываете сохраненный контент, поэтому трудно сказать, что "не сработало". Используйте всегда отладчик, чтобы убедиться, что вы получаете значения, как ожидалось.

Для сохранения / восстановления полнотекстового режима VRAM вы, конечно, должны также сохранять цвета (таким образом, буфер размером 80*25*2 байта) и восстанавливать их таким образом, и это будет работать только тогда, когда запущенное приложение не изменит начало VRAM или другое Регистры управления VGA, влияющие на выход (т.е. только в чистом виде mov ax,3 int 10h государство). Также такое сохранение / восстановление не восстановит положение курсора BIOS и, возможно, другие переменные BIOS, поэтому, если вы действительно хотите сохранить "консоль", нужно сделать больше, чем просто скопировать содержимое VRAM.

Но в целом это выглядит как хорошая попытка, код прост и понятен, не беспокойтесь о производительности во время изучения основ. Но изучение того, как эффективно использовать отладчик, необходимо для вашего будущего (обучения на ассемблере).

Символы на экране бывают попарно: символ и цвет, поэтому вам нужно только удвоить переменный размер (и счетчик!):

.model small
.stack 100h
.data

some_text   db 'Stackru!',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  
Другие вопросы по тегам