Вывод на экран. Перехват прерывания. - Assembler
Формулировка задачи:
Очистить экран. Вывести несколько строк произвольного текста. Пе-
рехватить прерывание экрана (Int 5h). Первый вызов этого прерывания
располагает строки вертикально, следующий «нормально» и т.д.
Решение задачи: «Вывод на экран. Перехват прерывания.»
textual
Листинг программы
- data segment
- VIDEO_BUF dw 2000 DUP(0)
- DIRECT db 0 ; **пр*вле*ие строк (0 - горизо*т*ль*о, 1 - вертик*ль*о)
- STRING1 db 'Вчер*сь приятеля в к*рете видел я;'
- STRING2 db 'Бед*як - приятель мой, я оче*ь удивился,'
- STRING3 db 'Чем столько о* р*зжился?'
- STRING4 db 'А о* повед*л м*е всю пр*вду, *е т*я,'
- STRING5 db 'Что к*рт*ми себе име*ье о* дост*вил'
- STRING6 db 'И выше всех **ук игру к*ртеж*у ст*вил.'
- STRING7 db 'Сегод*я же пешком поп*лся м*е мой друг.'
- STRING8 db '"Ко*еч*о,- я ск*з*л,- спустил уж все ты с рук?"'
- STRING9 db 'А о*, к*к философ, гл*сил в своем ответе:'
- STRING10 db '"Ты з**ешь, колесом вертится все ** свете".'
- OLD_CS dw ? ; *дрес сегме*т* ст*рого вектор* 5h
- OLD_IP dw ? ; *дрес смеще*ия ст*рого вектор* 5h
- data ends
- code segment
- assume cs:code, ds:data
- ; Подпрогр*мм* обр*ботки прерыв**ия 5h
- NEW_5 proc far
- push ax ; сохр**ить все регистры
- push bx
- push cx
- push dx
- push ds
- push es
- mov ax, DATA ; уст**овить ds ** сегме*т д***ых
- mov ds, ax ; ос*ов*ой прогр*ммы
- mov ax, 0B800h ; уст**овить es **
- mov es, ax ; сегме*т д***ых bios
- cmp DIRECT,0
- jnz m1
- ; Горизо*т*ль*ое р*сположе*ие строк
- mov cx,2000
- xor si,si
- video1:
- mov ax, VIDEO_BUF[si]
- mov es:[si], ax
- inc si
- inc si
- loop video1
- inc DIRECT
- jmp back
- m1: ; Верти*ль*ое р*сположе*ие строк
- xor si,si
- mov bx,1999*2
- mov cx,25
- video_ext:
- push cx
- sub bx,1999*2 ; Переход ** *овую строку
- mov cx,80
- video_in:
- mov ax, VIDEO_BUF[bx]
- mov es:[si],ax
- inc si
- inc si
- add bx,25*2
- loop video_in
- pop cx
- loop video_ext
- dec DIRECT
- back:
- pop es
- pop ds
- pop dx
- pop cx
- pop bx
- pop ax
- iret
- NEW_5 endp
- ; Подпрогр*мм* очистки экр***
- CLS proc near
- push cx
- push ax
- push si
- xor si, si
- mov ah, 7
- mov al, ' '
- mov cx, 2000
- CL1:
- mov es:[si], ax
- inc si
- inc si
- loop CL1
- pop si
- pop ax
- pop cx
- ret
- CLS endp
- ; Ос*ов**я прогр*мм*
- START:
- mov ax, DATA
- mov ds, ax
- mov ah, 02h ; скрыть курсор
- mov dh,25
- int 10h
- ; чте*ие вектор* прерыв**ия
- mov ah, 35h
- mov al, 5h
- int 21h
- mov OLD_IP, bx
- mov OLD_CS, es
- ; уст**овк* вектор* прерыв**ия
- push ds
- mov dx, offset NEW_5
- mov ax, seg NEW_5
- mov ds, ax
- mov ah, 25h
- mov al, 5h
- inc si
- int 21h
- pop ds
- mov ax, 0B800h
- mov es, ax
- call CLS
- mov ah, 00000111b
- mov cx, 34
- mov si, 0
- xor bx,bx
- lp1:
- mov al, STRING1[bx]
- mov VIDEO_BUF[si], ax
- inc si
- inc si
- inc bx
- loop lp1
- mov cx, 40
- mov si, 80*2
- xor bx,bx
- lp2:
- mov al, STRING2[bx]
- mov VIDEO_BUF[si], ax
- inc si
- inc si
- inc bx
- loop lp2
- mov cx, 24
- mov si, 160*2
- xor bx,bx
- lp3:
- mov al, STRING3[bx]
- mov VIDEO_BUF[si], ax
- inc si
- inc si
- inc bx
- loop lp3
- mov cx, 36
- mov si, 240*2
- xor bx,bx
- lp4:
- mov al, STRING4[bx]
- mov VIDEO_BUF[si], ax
- inc si
- inc si
- inc bx
- loop lp4
- mov cx, 35
- mov si, 320*2
- xor bx,bx
- lp5:
- mov al, STRING5[bx]
- mov VIDEO_BUF[si], ax
- inc si
- inc si
- inc bx
- loop lp5
- mov cx, 38
- mov si, 400*2
- xor bx,bx
- lp6:
- mov al, STRING6[bx]
- mov VIDEO_BUF[si], ax
- inc si
- inc si
- inc bx
- loop lp6
- mov cx, 39
- mov si, 480*2
- xor bx,bx
- lp7:
- mov al, STRING7[bx]
- mov VIDEO_BUF[si], ax
- inc si
- inc si
- inc bx
- loop lp7
- mov cx, 47
- mov si, 560*2
- xor bx,bx
- lp8:
- mov al, STRING8[bx]
- mov VIDEO_BUF[si], ax
- inc si
- inc si
- inc bx
- loop lp8
- mov cx, 41
- mov si, 640*2
- xor bx,bx
- lp9:
- mov al, STRING9[bx]
- mov VIDEO_BUF[si], ax
- inc si
- inc si
- inc bx
- loop lp9
- mov cx, 43
- mov si, 720*2
- xor bx,bx
- lp10:
- mov al, STRING10[bx]
- mov VIDEO_BUF[si], ax
- inc si
- inc si
- inc bx
- loop lp10
- int 5h
- p1:
- mov ah,0
- int 16h
- cmp al,'0'
- jnz p1
- quit:
- call CLS
- mov dx, OLD_IP
- mov ax, OLD_CS
- mov ds, ax
- mov ah, 25h
- mov al, 5h
- int 21h
- mov ax, 4c00h
- int 21h
- CODE ends
- end START
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д