Вывод на экран. Перехват прерывания. - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.429 из 5
Похожие ответы