Вывод на экран. Перехват прерывания. - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д