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
|