大学《汇编语言》(王爽) 实验十三 编写、应用中断例程

《汇编语言》书p262页(王爽)实验13 编写、应用中断例程

题目要求

一、实验任务书
  (1)编写并安装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
start:  mov dh, 10      ;所在行数:11行
        mov dl, 10      ;所在列数:11列
        mov cl, 2       ;字符属性
        mov ax, data
        mov ds, ax
        mov si, 0           ;入口参数ds:si指向字符串data
        int 7ch             ;调用9号子程序,显示字符串
       
        mov ax, 4c00H
        int 21H
code ends
end start    

  (2)编译并安装int 7ch中断例程,功能为完成loop指令的功能
  参数:(cx)=循环次数 (bx)=位移。
  以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int、iret指令执行前后CS、IP和栈中的状态。
在屏幕中间显示80个“!”。

assume cs:code
code segment
start:  mov ax, 0b800H
        mov es, ax
        mov di, 160*12
       
        mov bx, offset s – offset se
        mov cx, 80
    s:  mov byte ptr es:[di], '!'
        add di, 2
        int 7cH
    se: nop
 
        mov ax, 4c00H
        int 21H
code ends
end start

  (3)下面的程序,分别在第2、4、6、8行显示4句英文诗,补全程序。

assume cs:code
code segment
    s1: db 'Good,better,best,','$'
    s2: db 'Never let it rest,','$'
    s3: db 'Till good is better,','$'
    s4: db 'And better,best.','$'
    s: dw offset s1, offset s2, offset s3, offset s4
    row:  db 2, 4, 6, 8
start :
        mov ax, cs
        mov ds, ax               ;将ds也指向了cs段
        mov bx, offset s     ;(bx)=s标号地址
        mov si, offset row       ;(si)=row标号的地址。
        mov cx, 4                ;计数器置为4,4行字符串
ok:    ;在DOS窗口设置光标的位置, 
        mov bh,0             ;BIOS中的10h中断例程的入口参数设置,bh(页号)=0  
       mov dh, [si]             ;入口参数:dh(行号)=(si)
        mov dl, 0                ;入口参数:dl(列数)=0
        mov ah, 2                ;10h例程中的2号子程序,功能:设置光标位置。
        int 10h                  ;调用中断例程
       ;开始显示字符串。调用21h例程,9号子程序
        mov dx,[bx]              ;入口参数:dx=(bx),每个字符串的首地址。
        mov ah,9             ;dos系统中21h例程中的9号子程序
        int 21h                  ;调用中断例程,功能:显示字符串(以$结尾的)
        inc si                   ;si按字节定义的。每次增量是1个字节。
        add bx,2             ;bx是按照字定义的,每次增量是2个字节。
        loop ok
 
        mov ax,4c00h
        int 21h
 
code ends
end start    

算法思路

  1、先进行安装中断程序,再进行设置中断向量表,安装中断程序要注意设置指向以及传输的长度、方向,设置int 7ch中断,中断向量表指向为0:200h处。
  2、编写程序在屏幕中间显示80个“!”(该程序书上有),此程序中要注意es:di指向的显示空间位置,以及转移地址的计算,设置传输字符的类型和定义。

解题代码

(1)

  assume cs:code

code segment

start:      ;7cH中断例程的安装程序

            mov ax, cs

            mov ds, ax

            mov si, offset show_str ;将ds:si指向源地址(show_str的机器码)

            mov ax, 0000H

            mov es, ax

            mov di, 200H        ;将es:di指向目的地址(0:200H向量表中)

            mov cx, offset show_strend - offset show_str    ;设置传输长度

            cld             ;传输方向为正

            rep movsb       ;字节传输

            ;设置中断向量表,使7cH条目中断向量指向0000:200H

            mov ax, 0000H

            mov es, ax

            mov word ptr es:[7cH*4], 200H

            mov word ptr es:[7cH*4+2], 0000H

           

            mov ax, 4c00H

            int 21H

;-------

;装载的例程:7cH

;功能:int 7cH实现按行和列及字符属性显示字符串功能

;入口参数:入口参数:dh-行数、dl-列数、cl-字符属性,ds:si指向data字符串

;返回值:无

;-------   

show_str:   push dx

            push cx

            push si             ;将子程序用到的寄存器入栈

           

            mov ax, 0b800H

            mov es, ax          ;设置显示缓冲区内存段

           

            mov ax, 0           ;(ax)= 0,防止高位不为零

            mov al, 160         ;0a0H-   160字节/行

            mul dh              ;相对于0b800:0000第dh行偏移量

            mov bx, ax          ;将第(dh)行的偏移地址送入bx,bx代表行偏移

            mov ax, 0

            mov al, 2           ;列的标准偏移量是2个字节

            mul dl              ;同一行列的偏移量,尽量使用乘法,(al)=列偏移

            add bx, ax          ;最终获得偏移地址(bx)=506H

            mov di,0            ;将di作为每个字符的偏移量

            mov al, cl          ;将字符属性写入al中

            mov ch, 0           ;将cx高8位设置为0

           

    show:   mov cl, ds:[si]     ;将字符串单个字符读入cl中

            jcxz ok             ;判断字符串是否为零。

            mov es:[bx+di+0], cl    ;在显示缓冲区中写入字符

            mov es:[bx+di+1], al    ;在显示缓冲区中写入字符属性

            add di, 2

            inc si

            jmp short show

   

        ok: pop si              ;字符串字符为0,结尾

            pop dx

            pop cx              ;恢复寄存器

            iret               

 

show_strend:nop             ;代码段结尾,便于计算7cH例程的长度。   

code ends

end start

(2)

assume cs:code
code segment
    start:  mov ax,cs
           mov ds,ax
           mov si,offset lp         ;设置ds:si指向源地址lp
           mov ax,0
           mov es,ax
           mov di,200h
           mov cx,offset le - offset lp   ;设置cx为传输长度        
           cld                      ;传输长度为正
           rep movsb
;先进行安装中断程序,再进行设置中断向量表           
           mov ax,0
           mov es,ax
           mov word ptr es:[7ch*4],200h   
           mov word ptr es:[7ch*4+2],0
          
           mov ax,0b800h
           mov es,ax
           mov di,160*12           ;设置es:di指向的显示空间位置
           mov bx,offset s- offset se   ;设置从标号se到标号s的转移地址
           mov cx,80               ;设置cx为字符串长度,即循环次数
        s:  mov byte ptr es:[di],'!'    ;设置要传输的字节,并定义为!
           add di,2
           int 7ch                  ;如果(cx)≠0,转移到标号s处
       se:  nop
           mov ax,4c00h
           int 21h
       lp:  push bp                       
           mov bp,sp                     
           dec cx                        
           jcxz lpret
           add [bp+2],bx
    lpret:  pop bp
           iret            
       le:  nop
code ends
end start

(3)

    assume cs:code
    code segment
    	s1:	db 'Good, better, best,','$'
    	s2:	db 'Never let it rest,', '$'
    	s3:	db 'Till good is better,', '$'
    	s4:	db 'And better, best.', '$'
    	s:	dw offset s1, offset s2, offset s3, offset s4
    	row: db 2, 4, 6, 8
    	start:mov ax, cs
    		  mov ds, ax
    		  mov bx, offset s
    		  mov si, offset row	;行数索引
    		  mov cx, 4				;共需要4行数据
    	   ok:mov bh, 0				;第0页
    		  mov dh, [si]			;第几行
    		  mov dl, 0				;第几列
    		  mov ah, 2				;置光标功能
    		  int 10h				;调用10h号中断处理程序的2号子程序
    		  
    		  mov dx, [bx]			;在光标处显示字符串
    		  mov ah, 9				;调用21h号中断处理程序的9号子程序
    		  int 21h
    		  
    		  inc si				
    		  add bx, 2				;dw定义字型数据,增量为2
    		  loop ok
    		  mov ax, 4c00h
    		  int 21h
    code ends
    end start

实验结果截图

(2)
大学《汇编语言》(王爽) 实验十三 编写、应用中断例程(3)
大学《汇编语言》(王爽) 实验十三 编写、应用中断例程

上一篇:汇编语言中将数据、代码、栈放入不同的段


下一篇:实验4 汇编应用编程和c语言程序反汇编分析