. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->内中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  求0号中断正确的代码  [待解决] 回复[ 9次 ]   点击[ 673次 ]  
thedaydreamwang
[帖 主]   [ 发表时间:2010-02-19 03:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
看了N多的代码竟没有看到正确的,求高人发正确的代码!!
  第12章王爽老题的代码是怎么样的???
coolman
[第1楼]   [ 回复时间:2010-02-19 13:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-02-02 15:08
我的,你看看^_^

assume cs:code
code         segment
START:                                  ;安装中断处理程序到特定的内存中(0000:200-0000:02FF)。
        mov ax,cs
        mov ds,ax
        mov si,offset do0                ;设置ds:si指向源址。
        mov ax,0
        mov es,ax
        mov di,200h                     ;设置es:di指向目的地址。
        mov cx,offset enddo0-offset do0 ;计算中断处理程序的长度,并设置循环次数。
        cld                             ;设置正向增长
        rep movsb        
                                        ;设置中断向量表。
        mov word ptr es:[0*4],offset startdo0-offset do0+200h        
        mov word ptr es:[0*4+2],0h                                
        
                                        ;安装设置完毕返回dos。
        mov ax,4c00h
        int 21h 
do0:                                        ;中断处理程序的起始位置。
        db 'Overflow!',0                  ;定义中断处理程序中要输出的字符串。          
startdo0:                                    ;0号中断处理程序真正指令起始位置。
        mov ax,0
        mov ds,ax
        mov si,200h                     ;ds:si指向输出字符串。
        mov ax,0b800h
        mov es,ax
        mov di,160*12+36*2              ;es:di指示在屏幕中央输出字符串。
    s:  mov ch,0
        mov cl,[si]
        jcxz ok
        mov ch,2h
        mov es:[di],cx
        inc si
        inc di
        inc di
        loop s
   ok: 
                                               ;中断处理程序结束并返回dos。
        mov ax,4c00h
        int 21h
enddo0: nop                                  ;空指令,标记中断处理程序结束位置。
code        ends
end START
coolman
[第2楼]   [ 回复时间:2010-02-19 14:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-02-02 15:08
测试很简单:
c:\>debug
-a
mov ax,1000
mov bh,1
div bh
-t
......
coolman
[第3楼]   [ 回复时间:2010-02-19 14:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-02-02 15:08
不过我的程序还有可以完善的地方,我在中断处理程序中没有对寄存器原值进行现场保护,从这点说有点不符合中断处理程序设计规范。因为具体到这个程序,不会对结果产生不利影响,所以就偷懒了^.^
thedaydreamwang
[第4楼]   [ 回复时间:2010-02-19 21:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
嗯我来试试!!
thedaydreamwang
[第5楼]   [ 回复时间:2010-02-19 22:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
C:\>debug32 c:\aa.exe
Debug32 - Version 1.0 - Copyright (C) Larson Computing 1994

CPU = 686, Virtual 8086 Mode, Id/Step = 067A, A20 enabled
-r
AX=0000  BX=0000  CX=0058  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=2186  ES=2186  SS=2196  CS=2196  IP=0000  NV UP DI PL NZ NA PO NC
2196:0000 8CC8             MOV     AX,CS
-u
2196:0002 8ED8             MOV     DS,AX
2196:0004 BE2800           MOV     SI,0028h
2196:0007 B80000           MOV     AX,0000h
2196:000A 8EC0             MOV     ES,AX
2196:000C BF0002           MOV     DI,0200h
2196:000F B92F00           MOV     CX,002Fh
2196:0012 FC               CLD
2196:0013 F3               REPZ
2196:0014 A4               MOVSB
2196:0015 26C70600000A02   MOV     Word Ptr ES:[0000],020Ah
2196:001C 26C70602000000   MOV     Word Ptr ES:[0002],0000h
2196:0023 B8004C           MOV     AX,4C00h
2196:0026 CD21             INT     21h
-u
2196:0028 4F               DEC     DI
2196:0029 7665             JBE     Short 0090
2196:002B 7266             JB      Short 0093
2196:002D 6C               INSB
2196:002E 6F               OUTSW
2196:002F 7721             JA      Short 0052
2196:0031 00B80000         ADD     [BX+SI+0000],BH
2196:0035 8ED8             MOV     DS,AX
2196:0037 BE0002           MOV     SI,0200h
2196:003A B800B8           MOV     AX,0B800h
2196:003D 8EC0             MOV     ES,AX
2196:003F BFC807           MOV     DI,07C8h
-u
2196:0042 B500             MOV     CH,00h
2196:0044 8A0C             MOV     CL,[SI]
2196:0046 E30A             JCXZ    0052
2196:0048 B502             MOV     CH,02h
2196:004A 26890D           MOV     ES:[DI],CX
2196:004D 46               INC     SI
2196:004E 47               INC     DI
2196:004F 47               INC     DI
2196:0050 E2F0             LOOP    0042
2196:0052 B8004C           MOV     AX,4C00h
2196:0055 CD21             INT     21h
2196:0057 90               NOP
-u
2196:0058 0000             ADD     [BX+SI],AL
2196:005A 0000             ADD     [BX+SI],AL
2196:005C 0000             ADD     [BX+SI],AL
2196:005E 0000             ADD     [BX+SI],AL
2196:0060 0000             ADD     [BX+SI],AL
2196:0062 0000             ADD     [BX+SI],AL
2196:0064 0000             ADD     [BX+SI],AL

下需是执行的情况

C:\>debug32 c:\aa.exe
Debug32 - Version 1.0 - Copyright (C) Larson Computing 1994


C:\>aa.exe

C:\>debug32 c:\aa.exe
Debug32 - Version 1.0 - Copyright (C) Larson Computing 1994


C:\>aa.exe

C:\>debug
'DEBUG' is not recognized as an internal or external command,
operable program or batch file.

C:\>debug32
Debug32 - Version 1.0 - Copyright (C) Larson Computing 1994

CPU = 686, Virtual 8086 Mode, Id/Step = 067A, A20 enabled
-d 0:0
0000:0000 D0 5A 64 06 8B 01 70 00-96 5D 64 06 8B 01 70 00  PZd...p..]d...p.
0000:0010 8B 01 70 00 B9 06 10 02-40 07 10 02 FF 03 10 02  ..p.9...@.......
0000:0020 46 07 10 02 0A 04 10 02-3A 00 A3 03 54 00 A3 03  F.......:.#.T.#.
0000:0030 6E 00 A3 03 88 00 A3 03-A2 00 A3 03 FF 03 10 02  n.#...#.".#.....
0000:0040 A9 08 10 02 A4 09 10 02-AA 09 10 02 5D 04 10 02  )...$...*...]...
0000:0050 B0 09 10 02 B9 5E 64 06-C4 09 10 02 8B 05 10 02  0...9^d.D.......
0000:0060 0E 0C 10 02 14 0C 10 02-1F 0C 10 02 AD 06 10 02  ............-...
0000:0070 AD 06 10 02 A4 F0 00 F0-37 05 10 02 60 BC 00 C0  -...$p.p7...`<.@

-d 0000:200
0000:0200 4F 76 65 72 66 6C 6F 77-21 00 B8 00 00 8E D8 BE  Overflow!.8...X>
0000:0210 00 02 B8 00 B8 8E C0 BF-C8 07 B5 00 8A 0C E3 0A  ..8.8.@?H.5...c.
0000:0220 B5 02 26 89 0D 46 47 47-E2 F0 B8 00 4C CD 21 00  5.&..FGGbp8.LM!.
0000:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
***Duplicate Line(s)***
0000:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
安装成功了可是向量表 0号中断还是指向0664:5aD0
安理说安装程序应该替换掉原来的0号中断啊,这样算不算没有安装成功呢???
qinjuan1188
[第6楼]   [ 回复时间:2010-06-15 18:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-05-10 21:04
assume cs:codesg
codesg segment
begin: 
mov ax,cs 
mov ds,ax
mov si,offset s
mov ax,0
mov es,ax
mov di,200h
mov cx,offset s3-offset s
cld
rep movsb
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0
mov ax,4c00h
int 21h
s:
jmp short s2
db 'divideerror!'
s2:
mov ax,0b800h
mov es,ax
mov di,07c8h
mov ax,0
mov ds,ax
mov si,202h
mov ah,0ah
mov cx,12
s4:
mov al,ds:[si]
mov es:[di],ax
inc si
add di,2
loop s4
mov ax,4c00h
int 21h
s3:nop
codesg ends
end begin
masmaster
[第7楼]   [ 回复时间:2010-06-20 10:44 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
我的,你看看^_^

assume cs:code
code         segment
START:                                  ;安装中断处理程序到特定的内存中(0000:200-0000:02FF)。
        mov ax,cs
        mov ds,ax
        mov si,offset do0                ;设置ds:si指向源址。
        mov ax,0
        mov es,ax
        mov di,200h                     ;设置es:di指向目的地址。
        mov cx,offset enddo0-offset do0 ;计算中断处理程序的长度,并设置循环次数。
        cld                             ;设置正向增长
        rep movsb        
                                        ;设置中断向量表。
        mov word ptr es:[0*4],offset startdo0-offset do0+200h        
        mov word ptr es:[0*4+2],0h                                
        
                                        ;安装设置完毕返回dos。
        mov ax,4c00h
        int 21h 
do0:                                        ;中断处理程序的起始位置。
        db 'Overflow!',0                  ;定义中断处理程序中要输出的字符串。          
startdo0:                                    ;0号中断处理程序真正指令起始位置。
        mov ax,0
        mov ds,ax
        mov si,200h                     ;ds:si指向输出字符串。
        mov ax,0b800h
        mov es,ax
        mov di,160*12+36*2              ;es:di指示在屏幕中央输出字符串。
    s:  mov ch,0
        mov cl,[si]
        jcxz ok
        mov ch,2h
        mov es:[di],cx
        inc si
        inc di
        inc di
        loop s
   ok: 
                                               ;中断处理程序结束并返回dos。
        mov ax,4c00h
        int 21h
enddo0: nop                                  ;空指令,标记中断处理程序结束位置。
code        ends
end START
------------------
回复: 学习~~
书里说标号d0:后要加一个jmp指令
masmaster
[第8楼]   [ 回复时间:2010-06-20 14:29 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
do0程序就是一段驻留程序,可以这么说吧
thedaydreamwang
[第9楼]   [ 回复时间:2010-07-15 05:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
mov word ptr es:[0*4],offset startdo0-offset do0+200h 不是很明白一条指令能完成两个不同的动作吗?很显然是不正确的还有offset的用法问题这样意思完全变了!!
cld
     rep movsb
     push es:[9*4]
     pop es:[200h]
     push es:[9*4+2]
     pop es:[202h]
     cli
     mov word ptr es:[9*4],204h
     mov word ptr es:[9*4+2],0
     sti
     这里的指令一个都不能少,也不能变!!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved