From 143f34d941f32e0808fc9344d4c4126ff530d64a Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 22 Oct 2020 21:03:24 +0400 Subject: =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D1=81=D0=B5=D0=BC=D0=B5=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sem2/lab3/vdump.asm | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 sem2/lab3/vdump.asm (limited to 'sem2/lab3/vdump.asm') 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 -- cgit v1.2.3