summaryrefslogtreecommitdiff
path: root/sem2/lab3/vdump.asm
blob: c2f6f540a350b9bcf992bcf92253af1ad92949b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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