# 实验13

实验13

第一问:

  1. 问题:
    编写程序并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
    参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。
    以上中断例程安装完成后,对下面的程序进行单步跟踪,尤其注意观察int、iret指令执行前后CS、IP和栈中的状态。

  2. 中断例程如下:

    assume cs:code
    code segment
    start:
    mov ax,cs
    mov ds,ax
    mov si,offset d7ch0
    mov ax,0
    mov es,ax
    mov ax,200h
    mov di,ax
    mov cx,offset d7ch0end-offset d7ch0
    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,4c00h
    int 21h
    
    d7ch0:
    push ax
    push dx
    push bx
    push cx
    push si
    push di
    push es
    
    mov al,160
    mul dh
    mov bx,ax
    mov al,2
    mul dl
    add ax,bx
    mov di,ax
    mov ax,0b800h
    mov es,ax
    mov bl,cl
    show:
    mov cl,ds:[si]
    mov ch,0
    jcxz ok
    mov ch,bl
    mov es:[di],cx
    inc si
    add di,2
    jmp show
    
    ok:
    pop es
    pop di
    pop si
    pop cx
    pop bx
    pop dx
    pop ax
    iret
    
    d7ch0end:
    nop
    
    code ends
    end start
    
  3. 测试程序

    assume cs:code
    
    data segment
    	db "welcome to masm! ",0
    data ends
    
    code segment
    
    start:
    	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 start	
    

第二问:

  1. 问题

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

  2. 中断例程如下:

    assume cs:code
    code segment
    start:
    mov ax,cs
    mov ds,ax
    mov si,offset lp
    mov ax,0
    mov es,ax
    mov di,200h
    mov cx,offset lpend-offset lp
    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,4c00h
    int 21h
    
    lp:
    push bp
    mov bp,sp
    dec cx
    jcxz lpret
    add [bp+2],bx; 因为push bp,所以要加2
    lpret:
    pop bp
    iret 
    lpend:
    nop
    
    code ends
    end start
    
  3. 测试程序

    assume cs:code
    code segment
    start:
    	mov ax,0b800h
    	mov es,ax
    	mov di,160*12
    	mov bx,offset s-offset se 				;设置从标号se到标号s的转移位移
    	mov cx,80
    s:
    	mov byte ptr es:[di],'!'
    	add di,2
    	int 7ch									;如果(cx)≠0,转移到标号s处
    se:
    	nop
    	mov ax,4c00h
    	int 21h
    code ends
    end start		
    
posted @ 2023-07-27 19:17  三年、  阅读(36)  评论(0)    收藏  举报