.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