王爽《汇编语言》实验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
start:  mov dh,10
        mov dl,10
        mov cl,2h
        mov ax,data
        mov ds,ax
        mov si,0
        int 7ch
        
        mov ax,4c00h
        int 21h
        
code ends
end start
上面这个程序我把它命名为test.exe
ok,叙述下我的问题吧。 我在安装好自己写的int 7ch中断例程后,运行了上面这个test.exe程序,可是不显示字符串。
如图(有图有真相,= =!汗颜,怎么发图啊??我发个附件看看。)
 
					
				
			我很奇怪,检查了中断例程和test.exe的源码后也没有发现问题。 然后我就开debug一步步跟踪。发现字符会一个个显示,颜色也会显示正确。调试结束,我又运行了test.exe 发现这下可以显示字符串"welcome to masm!"了。后来我发现,我必须在运行test.exe之前运行一下debug才可以正常显示字符串。
下面是截图
 
					
				
			 
					
				
			 
					
				
			好吧,这下我更加纠结了,到底哪里出错了呢??是我的代码错了,还是那个操作有问题。为什么非要运行debug。难道是因为不是真正的实模式?
我是在VMware Workstation中xp sp3虚拟机中运行的。
下面是我写的int 7ch 中断例程,我命名为install7c.exe 各位有空帮忙看看,多谢多谢!!!

 程序代码:
程序代码:assume cs:code
        code segment
         ;>>>>>>>>>>>>>>>>>
         ;安装程序,将int 7ch中断例程安装到0:200处
         ;>>>>>>>>>>>>>>>>>
start:  mov ax,0h
        mov es,ax
        mov ax,200h
        mov di,ax
        
        mov ax,cs
        mov ds,ax
        mov si,offset s0
        
        mov cx,offset ed - offset s0
        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
        
    
        
        ;dh=行号 dl=列号 cl=颜色 ds:si指向字符串
  s0:   push ax
        push dx
        push es
        push di
        mov ax,0b800h 
        mov es,ax
        ;>>>>>>>>>>>>>>>>>>>>>>>>>>
        ;设置di= dh*160+dl*2 但是di是16位的 dh,dl是8位的不可以直接传输
        ;>>>>>>>>>>>>>>>>>>>>>>>>>> 
        mov al,160
        mul dh
        mov di,ax
        
        mov al,2
        mul dl
        add di,ax                        ;di=dh*160+dl*2
        ;>>>>>>>>>>>>>>>>>>>>>>>>>>>
        
    s:  cmp byte ptr [si],0
        je cn                            ;如果到字符串尾则停止复制
        
        mov al,[si]
        mov es:[di],al                   ;显示字符
        mov es:[di+1],cl                 ;设置颜色属性
        
        inc si
        add di,2        
        jmp s
        
    cn: pop di
        pop es
        pop dx
        pop ax        
        iret
    
    ed: nop
        code ends
end start 
        [ 本帖最后由 mxd000000 于 2013-10-11 20:06 编辑 ]

 
											





 
	    

