实验13
第一问:
-
问题:
编写程序并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。
以上中断例程安装完成后,对下面的程序进行单步跟踪,尤其注意观察int、iret指令执行前后CS、IP和栈中的状态。 -
中断例程如下:
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
-
测试程序
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
第二问:
-
问题
编写并安装int 7ch中断例程,功能为完成loop指令的功能。
参数:(cx)= 循环次数,(bx)= 位移。
以上中断例程安装好后,对下面的程序进行单步跟踪,尤其注意int,iret指令执行前后cs,ip的和栈中的状态。
在屏幕中间显示80个 “!”。 -
中断例程如下:
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
-
测试程序
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