|
主题 : : 求0号中断正确的代码 [待解决] |
回复[ 9次 ]
点击[ 673次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-02-19 03:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18 |
看了N多的代码竟没有看到正确的,求高人发正确的代码!!
第12章王爽老题的代码是怎么样的??? | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第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
...... | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-02-19 14:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-02-02 15:08 |
不过我的程序还有可以完善的地方,我在中断处理程序中没有对寄存器原值进行现场保护,从这点说有点不符合中断处理程序设计规范。因为具体到这个程序,不会对结果产生不利影响,所以就偷懒了^.^ | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-02-19 21:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18 |
|
|
|
|
|
[第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号中断啊,这样算不算没有安装成功呢??? | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第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指令 | | |
|
|
|
|
[第8楼]
[ 回复时间:2010-06-20 14:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
|
|
|
|
|
[第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
这里的指令一个都不能少,也不能变!! | | |
|