. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->INT指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于调用中断程序时,push指令的疑问  [已解决] 回复[ 3次 ]   点击[ 546次 ]  
xiaolaopo
[帖 主]   [ 发表时间:2008-06-11 10:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-04-13 09:39
assume cs:code

data segment

        db "welcome to masm!",0

data ends

code segment

start:

        mov ax,cs

        mov ds,ax

        mov si,offset no7c

        mov ax,0

        mov es,ax

        mov di,200h

        mov cx,offset no7cend-offset no7c

        cld

        rep movsb                        ;此9句为安装中断例程

 

        mov word ptr es:[7ch*4],200h

        mov word ptr es:[7ch*4+2],0      ;此2句为设置中断向量

 

        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

 

no7c:   push ax       ;定义中断例程[开始]

        push bx

        push di

        mov bx,0b800h

        mov es,bx

 

        mov al,160d

        mul dh

        mov di,ax

        mov al,2        ;此6句为确定符合题意的显存的偏移地址,

        mul dl          ;不可用"mov di,160*dh+2*dl"试图达到此6句指令的功能。

        add di,ax

 

        mov bl,cl

again:  mov cx,[si]

        jcxz no7cret

        mov es:[di],cl

        mov es:[di+1],bl

        inc si

        add di,2

        jmp short again

no7cret:        pop di

                pop bx

                pop ax

                iret

no7cend:        nop                ;定义中断例程[结束]

 

code ends

end start
提问:no7c开始处, push ax      

        push bx

        push di是对程序安装时和和下面调用 程序时都用到的ax,bx,和di进行一下保存把,但是调用程序时用到了es,但是由于程序安装时没有用到这个寄存器,所以就不用保存了吗,不知道我的理解对吗,希望指点
还有就是,程序已经安装完了 这时候就算调用程序的时候改变了ax,bx,和di的值也应该没什么问题,我调试的时候去掉了,也能成功运行,不知道着三句写上后,有什么好处,指点下
mouse
[第1楼]   [ 回复时间:2008-06-12 10:05 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
安装程序,是把下面的两个标号之间的代码拷贝到了内存中,并设置了中断向量表,这样我们就可以利用中断调用这段程序,实际就是把下面这段程序当作子程序调用。
offset no7c
   ...
   ...
no7cend 

---------
提问:no7c开始处, 
   push ax     
   push bx 
   push di
是对程序安装时和和下面调用 程序时都用到的ax,bx,和di进行一下保存把,
===========
这里安装程序的offset no7c-no7cend之间的代码,不管是保存现场,还是实现的功能,都和安装程序没有关系,对安装程序来说只是一段字符,一段二进制信息。 
之所以这里有保存寄存器及后面的pop操作,是为了这个中断的可移植性。
我们不知道将要调用这个中断的程序是什么样的,用了什么寄存器,为了不让程序因为执行了这个中断而影响调用此中断的程序,我们在中断程序里面会对使用的程序保存和结尾进行还原。

还有就是,程序已经安装完了 这时候就算调用程序的时候改变了ax,bx,和di的值也应该没什么问题,我调试的时候去掉了,也能成功运行,不知道着三句写上后,有什么好处,指点下
----------
假如调用这个中断的程序,在调用之前给ax设置了一个值,并希望执行完中断后用,那么你去掉中断程序中的保存寄存器的步骤,肯定会报错了吧:)
xiaolaopo
[第2楼]   [ 回复时间:2008-06-12 10:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-04-13 09:39
谢谢   你太厉害了  很透彻
xiaolaopo
[第3楼]   [ 回复时间:2008-06-12 10:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-04-13 09:39
此贴由 贴主 于 [ 2008-06-12 10:12 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved