扩充INT21H的功能

 回复 求助:扩充INT21H的功能
http://topic.csdn.net/u/20100609/00/a27b42dd-d845-43c7-9219-e76d6df9d049.html?88804

;扩充INT21H的子功能 0D1H,0D2H,0D3H,0D4H,0D5H
;分别为将BX=8100h的值以
;二进制1000000100000000
;八进制100400
;十进制无符号33024
;十进制有符号-32512
;十六进制形式输出8100
;
;!!!只能编译为COM格式!!!
;
 CODE SEGMENT
 ASSUME  CS:CODE,DS:CODE
 org 100h ;标准COM格式
 START:
 jmp begin
 IP_CS dd 0
 @int21h:
 sti
 pushf
 cmp ah,0d1h
 jb @old
 cmp ah,0d5h
 jbe chuli
@old:
 popf
 cli
 JMP CS:IP_CS
chuli:
 PUSH    AX
 PUSH    BX
 PUSH    CX
 PUSH    DX
 PUSH    SI
 PUSH    DI
 PUSH    DS
 PUSH    ES
 ;
shuchu:
 push cs
 pop ds
 mov di,offset number ;指向权数表首址
 sub ah,0d1h
 mov al,ah
 xor ah,ah
 shl ax,1
 add di,ax ;取对应权数
 ;***原创多进制转换通用模块***
 xchg ax,bx
 cmp bx,6 ;十进制有符号
 jnz crt
 or ax,ax
 jns crt
 push ax
 mov al,'-' ;输出负号
 mov ah,0eh
 int 10h
 pop ax
 neg ax ;求补
crt: xor cx,cx
 mov bx,[di]
nx1: xor dx,dx
 div bx
 or dx,0e30h
 push dx
 inc cx
 cmp ax,0
 jnz nx1
nx2: pop ax
 cmp al,'9'
 jbe ok
 add al,7
ok: int 10h
 loop nx2
quit:
 POP     ES
 POP     DS
 POP     DI
 POP     SI
 POP     DX
 POP     CX
 POP     BX
 POP     AX
 POPF
 cli
 iret
 ;****** 权数表 ******
 number dw 2,8,10,10,16
 ;
begin:
 push cs
 pop ds
 mov ax,3591h
 int 21h ; Return: ES:BX = 中断向量
 test bx,bx
 jz _load
 mov dx,offset message1
 mov ah,9 ;提示已经安装
 int 21h
 mov ah,4ch
 int 21h
_load:
 mov ax,3521h
 int 21h ; Return: ES:BX = 中断向量
 mov word ptr IP_CS, bx
 mov word ptr IP_CS+2, es
 push  es
 pop  ds
 mov  dx, bx
 mov  ax, 2591h
 int  21h    ; 存中断向量
 push  cs
 pop  ds
 mov dx,offset message2
 mov ah,9 ;提示安装成功
 int 21h
 mov  dx, offset @int21h
 mov  ax, 2521h
 int  21h    ; 存中断向量
 mov  dx, offset begin+120h
 add  dx, 0Fh
 mov  cl, 4
 shr  dx, cl
 mov  ax, 3100h ;内存驻留
 int  91h   

 message1 db 0dh,0ah,9,'Already!$'
 message2 db 0dh,0ah,9,'Installed!$'
 CODE ENDS
 END START

 附:检验程序,在XP下的CMD中,实际运行,结果正确。
 先运行上面的COM程序,再运行下面程序校验。
 CODE SEGMENT
 ASSUME  CS:CODE,DS:CODE
 org 100h
 START:
 push cs
 pop ds
 mov bx,65535
 mov ah,0d3h ;调用INT21H的扩充子功能0D3H
 int 21h ; 输出BX的十进制
 mov ah,7
 int 21h
 mov ah,4ch
 int 21h

 CODE ENDS
 END START

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值