summaryrefslogtreecommitdiff
path: root/sem2/lab3
diff options
context:
space:
mode:
authorAndrew <saintruler@gmail.com>2020-10-22 21:03:24 +0400
committerAndrew <saintruler@gmail.com>2020-10-22 21:03:24 +0400
commit143f34d941f32e0808fc9344d4c4126ff530d64a (patch)
treec79fcf309ad00e52100c0da544d96d3cc6ab6617 /sem2/lab3
Добавил решения второго семестра
Diffstat (limited to 'sem2/lab3')
-rw-r--r--sem2/lab3/Dump.asm80
-rw-r--r--sem2/lab3/arr.asm36
-rw-r--r--sem2/lab3/draw.asm117
-rw-r--r--sem2/lab3/mydump.asm92
-rw-r--r--sem2/lab3/run.bat3
-rw-r--r--sem2/lab3/vdraw.asm59
-rw-r--r--sem2/lab3/vdraw2.asm68
-rw-r--r--sem2/lab3/vdump.asm128
8 files changed, 583 insertions, 0 deletions
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