回复 求助:扩充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