zoukankan      html  css  js  c++  java
  • 实验十六_编写包含多个功能子程序的中断例程

    安装一个新的int 7ch中断例程,为显示输出
    提供如下功能子程序:
    (1)清屏。
    (2)设置前景色。
    (3)设置背景色。
    (4)向上滚动一行。
    入口参数说明:
    (1)用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,
    3表示向上滚动一行:
    (2)对于2、3号功能,用al传送颜色值,(al)属于集合{0,1,2,3,4,5,6,7}

    分析:
    首先:搭建框架:
            
            int 7ch例程安装

            设置中断向量表
            
            程序返回
    int7:
            寄存器入栈

            入口地址直接定值,sub 1、2、3、4

            寄存器出栈
    int7end:nop

    其次:编写测试程序测试上述功能,前提是先加载int 7ch例程。
        可以直接在debug中通过设置al和ah的值然后掉用int 7ch来实现。

    补充:
    向上滚动代码实现分析:
            第n+1(n从1开始)行的字符一个个覆盖第n行的字符,反复循环,循环次数80*24(屏幕行数减一)

    完整程序如下:

    assume cs:code 
    code segment 
    start:  mov ax,cs 
            mov ds,ax 
            mov si,offset int7;ds:si指向源地址 
            mov ax,0 
            mov es,ax 
            mov di,200h;es:si指向目的地址 
            mov cx,offset int7end - offset int7 
            cld 
            rep movsb 
             
            mov es:[7CH*4],200h 
            mov es:[7CH*4+2],0 
    
            mov ax,4c00h 
            int 21h 
             
    int7:   push bx 
            jmp short begin 
            dw sub1-int7+200h, sub2-int7+200h, sub3-int7+200h, sub4-int7+200h;有无offset操作符皆可,这里为了程序看起来简洁,先略去 
      begin:cmp ah,3 
            ja int7ret 
            mov bl,ah 
            add bl,bl 
            mov bh,0 
    
            call cs:[bx+203h];push bx,jmp short begin占三个机器码 
             
    int7ret:POP bx 
            mov ax,4c00h 
            int 21h 
    ;---------------------------------------------------         
    sub1:   push ax 
            push cx 
            push es 
            push di 
             
            mov ax,0b800h 
            mov es,ax 
            mov di,0 
            mov cx,2000 
    sub1_s:mov byte ptr es:[di],' ' 
            add di,2 
            loop sub1_s 
             
            pop di 
            pop es 
            pop cx 
            pop ax 
            ret 
    ;---------------------------------------------------         
    sub2:   push ax 
            push cx 
            push es 
            push di 
    
            mov cx,0b800h 
            mov es,cx 
            mov di,1 
            mov cx,2000 
    sub2_s:and byte ptr es:[di],11111000B 
            or byte ptr es:[di],al 
            add di,2 
            loop sub2_s 
    
            pop di 
            pop es 
            pop cx 
            pop ax 
            ret 
    ;------------------------------------------------- 
    sub3:   push ax 
            push cx 
            push es 
            push di 
    
            mov cx,0b800h;注意这里不能用ax,因为al用来传递参数,当然也可以使用,不过要采取其他的手段,就显得麻烦了 
            mov es,cx 
            mov di,1 
            mov cl,4 
            shl al,cl 
            mov cx,2000 
    sub3_s:and byte ptr es:[di],10001111B 
            or byte ptr es:[di],al 
            add di,2 
            loop sub3_s 
    
            pop di 
            pop es 
            pop cx 
            pop ax 
            ret 
    ;---------------------------------------------------- 
    sub4:   push ax 
            push cx 
            push es 
            push di 
      
            mov ax,0b800h 
            mov es,ax 
            mov di,0 
            mov cx,80*24 
    sub4_s:mov al,es:[di+160] 
            mov es:[di],al 
            add di,2 
            loop sub4_s 
    
            pop di 
            pop es 
            pop cx 
            pop ax 
            ret 
    ;------------------------------------------------------ 
    int7end:nop 
    code ends 
    end start 


     

  • 相关阅读:
    Syntactic_sugar
    processor, memory, I/O
    he time that it takes to bring a block from disk into main memory
    How MySQL Uses Indexes CREATE INDEX SELECT COUNT(*)
    mysqli_multi_query($link, $wsql)
    UTC ISO 8601
    but this usually doesn’t gain you anything.
    SET GLOBAL slow_query_log=1
    SET GLOBAL long_query_time=0
    a read only variable
  • 原文地址:https://www.cnblogs.com/xpjiang/p/4524427.html
Copyright © 2011-2022 走看看