[汇编语言] 实验13-编写、应用中断例程

一、编写并安装 int 7ch 中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。

  • 参数:(dh) = 行号,(dl) = 列号,(cl) = 颜色 ,ds:si 指向字符串首地址
  • 以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其观察 int、iret指令前后 CS、IP的栈中的状态。
assume cs:code

data segment
    db 'welcome to masm!', 0    
data ends 
 
code segment
    begin: 
        mov dh, 10
        mov dl, 10
        mov cl, 2
        mov ax, data
        mov ds, ax
        mov si, 0
        int 7ch   
        mov ax, 4c00h
        int 21h    

code ends
end begin

答案

assume cs:code

data segment
    db 'welcome to masm!', 0    
data ends 
 
code segment
    begin:
        // 安装 int 7ch中断例程对应的程序在 0000:0200H处
        mov ax, code
        mov ds, ax
        mov si, offset scstart
        mov ax, 0h
        mov es, ax
        mov di, 200h
        mov cx, offset scsend-offset scstart
        cld
        rep movsb
        
        // 设置中断向量表        
        mov ax, 0
        mov es, ax
        mov word ptr es:[7ch*4], 200h
        mov word ptr es:[7ch*4+2], 0h
        
        // 测试程序            
        mov dh, 10
        mov dl, 10
        mov cl, 2
        mov ax, data
        mov ds, ax
        mov si, 0
        int 7ch
        
        mov ax, 4c00h
        int 21h    
     
     // int 7ch 的中断例程  
     scstart:
        push dx 
        push cx
        push bx
        push ax
        
        // 设置要显示的位置
        mov ax, 0B800h
        mov es, ax
  
        mov al, 50 
        mul dh
        mov si, ax
        mov al, 4
        mul dl
        add si, ax
        
     s:
        // 循环遍历显示字符串        
        mov cl, [bx]
        mov ch, 0
        // 如果cx=0000 跳转至ok标号处
        jcxz ok   
        // 要显示的字符     
        mov es:[si], cl
        // 要显示的字符的属性
        mov es:[si+1], dl
              
        inc bx
        add si, 2
        jmp short s
     
     // 退出int 7ch的程序       
     ok:
        pop ax
        pop bx
        pop cx 
        pop dx
        iret 
             
     scsend: nop  
code ends
end begin

分析

  • 1、int 指令执行,CS、IP和栈中的状态

    [汇编语言] 实验13-编写、应用中断例程_第1张图片
    int 指令执行前CS、IP和栈中的状态

  • 2、int 指令执行 ,CS、IP和栈中的状态

    [汇编语言] 实验13-编写、应用中断例程_第2张图片
    int 指令执行后CS、IP和栈中的状态

    • a、栈 0710:FFFE的值为 0202,是当前标志寄存器的值
    • b、栈 0710:FFFC 的值为0712, 是当前CS寄存器的值
    • c、栈 0710:FFFA的值为0039,是当前IP寄存器的值
  • 3、iret指令执行,CS、IP和栈中的状态

    [汇编语言] 实验13-编写、应用中断例程_第3张图片
    iret指令执行前,CS、IP和栈中的状态

  • 4、iret指令执行,CS、IP和栈中的状态

    [汇编语言] 实验13-编写、应用中断例程_第4张图片
    iret指令执行后,CS、IP和栈中的状态

    * a、iret的指令过后,栈顶的数据被pop到 IP、CS、标志寄存器中。

二、编写并安装 int 7ch 中断例程,功能为完成loop指令的功能。

  • 参数:(cx) = 循环次数,(bx) = 位移
  • 以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int、ret执行前后CS、IP和栈中的状态。
  • 在屏幕中间显示80个!

你可能感兴趣的:([汇编语言] 实验13-编写、应用中断例程)