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/Dump.asm | 80 ++++++++++++++++++++++++++++++++ sem2/lab3/arr.asm | 36 +++++++++++++++ sem2/lab3/draw.asm | 117 ++++++++++++++++++++++++++++++++++++++++++++++ sem2/lab3/mydump.asm | 92 ++++++++++++++++++++++++++++++++++++ sem2/lab3/run.bat | 3 ++ sem2/lab3/vdraw.asm | 59 ++++++++++++++++++++++++ sem2/lab3/vdraw2.asm | 68 +++++++++++++++++++++++++++ sem2/lab3/vdump.asm | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 583 insertions(+) create mode 100644 sem2/lab3/Dump.asm create mode 100644 sem2/lab3/arr.asm create mode 100644 sem2/lab3/draw.asm create mode 100644 sem2/lab3/mydump.asm create mode 100644 sem2/lab3/run.bat create mode 100644 sem2/lab3/vdraw.asm create mode 100644 sem2/lab3/vdraw2.asm create mode 100644 sem2/lab3/vdump.asm (limited to 'sem2/lab3') diff --git a/sem2/lab3/Dump.asm b/sem2/lab3/Dump.asm new file mode 100644 index 0000000..93092f3 --- /dev/null +++ b/sem2/lab3/Dump.asm @@ -0,0 +1,80 @@ +;---------------------------------------- +OutChar macro char ; +local l1,l2,loopCX +push cx +mov cx,2 +mov bh,char +mov al,bh +shr al,04 + +loopCX: + 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 loopCX + +add di,01h +pop cx +endm +;---------------------------------------- +ClrScr macro ; +push ax +push bx +push cx +push dx +mov ah,06h ;AH 06 () +mov bh,07 ; (/) +mov cx,0000 ; +mov dx,184Fh ; +int 10h ; BIOS +pop dx +pop cx +pop bx +pop ax +endm +;---------------------------------------------- + +.model small +.stack 100h +.data +.code +start: +.486 +mov ax,@DATA +mov ds,ax + +mov ax,0b800h +mov es,ax ; es +mov si,0 ; +mov di,0 ; +mov ah,7h ; +mov cx,offset exit +sub cx,offset start ; - = !!! +ClrScr + +CXne0: + mov al,cs:[di] + OutChar al +loop Cxne0 + +; input: +; MOV dx,1900h +; INT 10h + + ; MOV ah,07h + ; INT 21h + + + +exit: +mov ax,4C00h +int 21h +END start diff --git a/sem2/lab3/arr.asm b/sem2/lab3/arr.asm new file mode 100644 index 0000000..a831fb3 --- /dev/null +++ b/sem2/lab3/arr.asm @@ -0,0 +1,36 @@ +.model small +.stack 100h +.data + +screenArr db 2000 dup (0) + +.code +.486 + +start: + MOV ax,@DATA + MOV ds,ax + + MOV cx, 40 + MOV bx, OFFSET screenArr + + ; MOV byte ptr [bx], 00h + ; INC bx + ; MOV byte ptr [bx], 00h + +lp: + MOV byte ptr [bx], 0 + inc bx +LOOP lp + +; input: +; MOV dx,1900h +; INT 10h + +; MOV ah,07h +; INT 21h + +exit: + MOV ax,4C00h + INT 21h +END start \ No newline at end of file diff --git a/sem2/lab3/draw.asm b/sem2/lab3/draw.asm new file mode 100644 index 0000000..7a3d30f --- /dev/null +++ b/sem2/lab3/draw.asm @@ -0,0 +1,117 @@ +.model small +.stack 100h +.data + +screenArr db 2000 dup (0) + +.code +.486 + +start: + MOV ax,@DATA + MOV ds,ax + + MOV ch,24 + MOV cl,80 + + MOV bx, offset screenArr + +lines: + MOV dh,24 + SUB dh,ch + + columns: + MOV dl,80 + SUB dl,cl + + ; Устанавливаем курсор + PUSH bx + MOV bx,00h + + MOV ah,02h + INT 10h + + POP bx + + ; Читаем символ + PUSH bx + MOV bx,00h + + MOV ah,08h + INT 10h + + POP bx + + ; Записываем прочитанные символ в массив + MOV byte ptr [bx],al + INC bx + + ; Пишем символ + PUSH bx + MOV bx,00h + + MOV ah,0Ah + MOV al,'a' + INT 10h + + POP bx + + DEC cl + JNZ columns + + + + DEC ch + JNZ lines + +input: + MOV dx,1900h + INT 10h + + MOV ah,07h + INT 21h + +MOV bx, OFFSET screenArr + +lines2: + MOV dh,24 + SUB dh,ch + + columns2: + MOV dl,80 + SUB dl,cl + + ; Устанавливаем курсор + PUSH bx + MOV bx,00h + + MOV ah,02h + INT 10h + + POP bx + + + ; Пишем символ + PUSH dx + MOV dh,[bx] + PUSH bx + + MOV bx,00h + MOV al,dh + INT 10h + + POP bx + POP dx + + INC bx + + DEC cl + JNZ columns2 + + DEC ch + JNZ lines2 + +exit: + MOV ax,4C00h + INT 21h +END start \ No newline at end of file diff --git a/sem2/lab3/mydump.asm b/sem2/lab3/mydump.asm new file mode 100644 index 0000000..490283b --- /dev/null +++ b/sem2/lab3/mydump.asm @@ -0,0 +1,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 diff --git a/sem2/lab3/run.bat b/sem2/lab3/run.bat new file mode 100644 index 0000000..fde0b9f --- /dev/null +++ b/sem2/lab3/run.bat @@ -0,0 +1,3 @@ +C:\TASM %1 +C:\TLINK %1 +%1.EXE \ No newline at end of file diff --git a/sem2/lab3/vdraw.asm b/sem2/lab3/vdraw.asm new file mode 100644 index 0000000..d751f28 --- /dev/null +++ b/sem2/lab3/vdraw.asm @@ -0,0 +1,59 @@ +.model small +.stack 100h +.data + +screenArr dw 1920 dup (0) + +.code +start: +.486 +mov ax,@DATA +mov ds,ax + +mov ax,0b800h +mov es,ax ;в es начало видеопамяти +mov si,0 ;смещение относительно начала видеопамяти +mov ah,7h ;атрибуты выводимых символов + +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 + +fillScreen: + mov al,0 + mov es:[si], ax + add si, 2 +loop fillScreen + +input: + MOV dx,1900h + INT 10h + + MOV ah,07h + INT 21h + +mov bx, offset screenArr +mov si, 0 +mov cx, 3840 + +restoreScreen: + mov dx, word ptr [bx] + mov es:[si], dx + inc bx + inc si +loop restoreScreen + +exit: + mov ax,4C00h + int 21h + +END start \ No newline at end of file diff --git a/sem2/lab3/vdraw2.asm b/sem2/lab3/vdraw2.asm new file mode 100644 index 0000000..4223179 --- /dev/null +++ b/sem2/lab3/vdraw2.asm @@ -0,0 +1,68 @@ +.model small +.stack 100h +.data + +screenArr dw 1920 dup (0) + +.code + +clearScreen PROC NEAR + + 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 + + fillScreen: + mov al,0 + mov es:[si], ax + add si, 2 + loop fillScreen + + ret + +clearScreen ENDP + +start: +.486 +mov ax,@DATA +mov ds,ax + +mov ax,0b800h +mov es,ax ;в es начало видеопамяти +mov si,0 ;смещение относительно начала видеопамяти +mov ah,7h ;атрибуты выводимых символов + +CALL clearScreen + +input: + MOV dx,1900h + INT 10h + + MOV ah,07h + INT 21h + +mov bx, offset screenArr +mov si, 0 +mov cx, 3840 + +restoreScreen: + mov dx, word ptr [bx] + mov es:[si], dx + inc bx + inc si +loop restoreScreen + +exit: + mov ax,4C00h + int 21h + +END start \ No newline at end of file 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