. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->INT指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  习题二,为什么不能正常调用,很奇怪  [已解决] 回复[ 4次 ]   点击[ 610次 ]  
jhszcn
[帖 主]   [ 发表时间:2008-04-06 09:49 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
中断例程
===========================
===========================
;安装7ch中断,完成loop功能(cx=循环变量,bx=位移)
assume cs:code

code segment
start:
                mov ax,cx
                mov ds,ax                                                        ;设ds
                mov si,offset do7c                                        ;设si
                mov ax,20h                
                mov es,ax                                                        ;设es
                mov di,0h                                                        ;设di
                mov cx,offset do7cEnd - offset do7c        ;设cx
                cld                                                                 ;设df
                rep movsb                                                        ;安装
;============================================================================                
                mov ax,0
                mov es,ax
                mov es:[7ch*4],word ptr 0
                mov es:[7ch*4+2],word ptr 20h                ;设中断向量
                
                mov ax,4c00h
                int 21h                                                ;回dos
;============================================================================
do7c:
        
                push bp
;==========================================================
                mov bp,sp                        ;完成loop功能(参数cx=循环次数,bx=位移量)
                dec cx                                ;loop先自减一再判断是否为0
                jcxz ok                                ;为零退出
                add [bp+2],bx                ;不为零用位移+ss中压入的ip位置传入ip
        ok:        pop bp
                iret                                ;回到调用处
do7cEnd:        
                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
                        mov cx,80
                s:        mov byte ptr es:[di],'!'
                        add di,2
                        int 7ch
                        ;loop s
                se:        nop
                        mov ax,4c00h
                        int 21h
code ends
end start

;调用7ch后,程序跳到了别的地方,不知道为什么,中断向量没有错,但0:200的指令不知道为什么出的来很奇怪,请大家帮我看一下
younggay
[第1楼]   [ 回复时间:2008-04-06 10:58 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
mov ax,cs  你写成了mov ax,cx了。
害我折腾了半个小时。在debug反复看了好几遍过程才发现ds的地址跟cs地址不一样。晕了!!
younggay
[第2楼]   [ 回复时间:2008-04-06 11:01 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
一误笔成千古恨啊!
wdm曾经在你的博客里说过了,0:200H和20:0H是没有理由不一样的。
要不咱们的汇编都得重新学习啦。呵呵
jhszcn
[第3楼]   [ 回复时间:2008-04-06 11:25 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
为什么偶总是这么粗心。55555555555555555555
jhszcn
[第4楼]   [ 回复时间:2008-04-06 11:26 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
此贴由 贴主 于 [ 2008-04-06 11:26 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(younggay):6分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved