summaryrefslogtreecommitdiff
path: root/sem2/lab3/mydump.asm
blob: 490283bf09d8a0e31904cce18615d9ee1cb6c9f0 (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
; Макрос для вывода одного символа из дампа
PrintWord macro w
local l1,l2,printByte

    push cx

    mov cx,2
    mov bh,w
    mov al,bh
    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
endm


.model small
.stack 100h
.data

screenArr dw 1920 dup (0)

.code
.486

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


; Очистим экран
clearScreen:
    PUSH cx
    PUSH si

    MOV cx,4000 ; 80 * 25 * 2

    clearScr:
        MOV es:[si],0000h
        INC si
    LOOP clearScr

    POP si
    POP cx


; Выводим значения дампа памяти
printDump:
    mov al,cs:[di]
    PrintWord al
loop printDump

; Приостанавливаем программу для того, чтобы прочитать дамп
input:
    MOV ah,07h
    INT 21h

exit:
    mov ax,4C00h
    int 21h

END start