. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->内中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验12 编写0号中断的处理程序  疑问?  [待解决] 回复[ 5次 ]   点击[ 684次 ]  
leonmsi
[帖 主]   [ 发表时间:2007-10-23 21:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-10 19:41
有两个问题不明白,请教:
1、怎么样修改程序才能使“divide error”显示到-t(debug中调试发生0号中断时)下方。 
2、do0程序中代码
   do0start:mov ax,cs  ;cs改为0亦可,为什么不用0?
         mov ds,ax
         mov si,202h
   
完整源程序见下
  
   assume cs:code
   code segment
   start:mov ax,cs
         mov ds,ax
         mov si,offset do0
         mov ax,0
         mov es,ax
         mov di,200h

         mov cx,offset do0end-offset do0

         cld
         rep movsb
         mov ax,0
         mov es,ax
         mov word ptr es:[0*4],200h
         mov word ptr es:[0*4+2],0

         mov ax,4c00h
         int 21h

    do0: jmp short do0start
         db "divide error!"

do0start:mov ax,0
         mov ds,ax
         mov si,202h
         mov ax,0b800h
         mov es,ax
         mov di,12*160+36*2
         mov cx,0dh

       s:mov al,[si]
         mov es:[di],al
         inc si
         add di,2
         loop s

         mov ax,4c00h
         int 21h

 do0end:nop
 code ends
 end start
sunshine
[第1楼]   [ 回复时间:2007-10-24 10:47 ]   [引用]   [回复]   [ top ] 
荣誉值:106
信誉值:0
注册日期:2007-06-26 15:10
能把"divide error"显示出来就行了啊,不管什么地方
第二个问题,什么意思,它是在取cs段地址,为什么是0啊
sunshine
[第2楼]   [ 回复时间:2007-10-24 10:49 ]   [引用]   [回复]   [ top ] 
荣誉值:106
信誉值:0
注册日期:2007-06-26 15:10
do0start:mov ax,cs  ;cs改为0亦可,为什么不用0? 
?怎么会cs改为0亦可?
它要取当前段的地址,把当前段为传输数据的原地址.
cnhnyu
[第3楼]   [ 回复时间:2007-10-31 20:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-22 14:47
我写的,可以显示不固定长度字符串
assume cs:code

code segment
                start:
                        mov ax, cs
                        mov ds, ax
                        mov si, offset do0
                        mov ax, 0
                        mov es, ax
                        mov di, 200h
                        mov cx, offset do0end - offset do0
                        cld
                        rep movsb
                        
                        mov ax, 0
                        mov ds, ax
                        mov ds:[0], word ptr 200h
                        mov ds:[2], word ptr 0h                
                
                ; do0 - do0end 是需要装载的中断处理程序
                ; 该段程序被复制到0000:0200开始处的空间
                do0:jmp short do0start
        db 'divide error !!!', 0
                do0start:
                    mov ax, 0
                    mov ds, ax
                    mov si, 202h
                    mov ax, 0B800h
                    mov es, ax
                    xor di, di
                    mov ah, 10001100B
                ; do0loop 这个循环将中断处理程序开始的以0结束的一段字符串,复制到显存的13行30列的位置    
                do0loop:
                        mov al, ds:[si]
                        cmp al, 0
                        je next
                        mov es:[160*12+30*2+di], ax
                        inc si
                        add di, 2
                        jmp short do0loop
        
                next:    
                        mov ax, 4c00h
                        int 21h
                do0end:
                        nop
code ends

end start
xiaoer
[第4楼]   [ 回复时间:2007-11-25 12:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-19 19:09
0 号优先级远高于单步中断,故显示在前边。
那是因为在这个特定的条件下 CS 的值为 0 ,所以两者没多大的区别,只要能指向需要的地址就行了。
omycle
[第5楼]   [ 回复时间:2007-12-03 12:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-11-12 19:53
cs不能改为0
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved