summaryrefslogtreecommitdiff
path: root/sem2/lab3/vdump.asm
diff options
context:
space:
mode:
Diffstat (limited to 'sem2/lab3/vdump.asm')
-rw-r--r--sem2/lab3/vdump.asm128
1 files changed, 128 insertions, 0 deletions
diff --git a/sem2/lab3/vdump.asm b/sem2/lab3/vdump.asm
new file mode 100644
index 0000000..c2f6f54
--- /dev/null
+++ b/sem2/lab3/vdump.asm
@@ -0,0 +1,128 @@
+.model small
+.stack 100h
+.data
+
+screenArr dw 1920 dup (0)
+
+.code
+.286
+
+printWord PROC NEAR
+
+ PUSH cx
+
+ MOV cx,2
+ MOV bh,al
+ SHR al,04
+
+ ; Переводим байт в соответствующий символ по таблице ASCII
+ printByte:
+ CMP al,09h
+ JBE l1
+ ADD al,37h
+ JMP l2
+ l1:
+ ADD al,30h
+ l2:
+ MOV es:[si],ax
+ MOV al,bh
+ AND al,00001111b
+ ADD si,2
+ LOOP printByte
+
+ ADD di,01h
+ POP cx
+
+ RET
+
+printWord ENDP
+
+clearScreen PROC NEAR
+
+ PUSHA
+
+ MOV cx,3840
+ MOV bx, OFFSET screenArr
+
+ saveScreen:
+ MOV dx, es:[si]
+ MOV word ptr [bx], dx
+ INC si
+ INC bx
+ LOOP saveScreen
+
+ MOV cx, 3840
+ MOV si, 0
+ MOV ah, 07h
+
+ fillScreen:
+ MOV al, 0
+ MOV es:[si], ax
+ ADD si, 2
+ LOOP fillScreen
+
+ POPA
+ RET
+
+clearScreen ENDP
+
+restoreScreen PROC NEAR
+
+ PUSHA
+
+ MOV bx, offset screenArr
+ MOV si, 0
+ MOV cx, 3840
+
+ restoreScreenLoop:
+ MOV dx, word ptr [bx]
+ MOV es:[si], dx
+ INC bx
+ INC si
+ LOOP restoreScreenLoop
+
+ POPA
+ RET
+
+restoreScreen ENDP
+
+start:
+ MOV ax,@DATA
+ MOV ds,ax
+
+ ; Записываем в регистр es адрес начала видеопамяти
+ MOV ax,0b800h
+ MOV es,ax
+
+ ; Обнуляем счётчики
+ MOV si,0
+ MOV di,0
+
+ ; Устанавливаем атрибут выводимых символов (белые символы, чёрный фон)
+ MOV ah,7h
+
+ ; Вычисляем размер программы
+ MOV cx,offset exit
+ SUB cx,offset start
+
+ ; Очистим экран
+ CALL clearScreen
+
+; Выводим значения дампа памяти
+printDump:
+ MOV al,cs:[di]
+ CALL printWord
+LOOP printDump
+
+; Приостанавливаем программу для того, чтобы прочитать дамп
+input:
+ MOV ah,07h
+ INT 21h
+
+exit:
+ CALL restoreScreen
+
+ MOV ax,4C00h
+ INT 21h
+
+END start