荣誉值:0
信誉值:8
注册日期:2007-11-24 19:34 |
经过几个月的辛苦学习 累积了些代码 大家用的着的就拿去用吧
assume cs:code,ds:data,ss:stack
stack segment
dw 128 dup (0)
stack ends
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
data segment
buffer db 256 dup (?)
data ends
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
code segment
;名称 fdtoc
;功能 将ASCII码数字数转换成为对应的十进制
;参数 fdtoc(待转换的字母所在段地址,待转换的字母所在段偏移)
;返回 dx=dword型高16位
; ax=dword型低16位
; 字符串以0结束
; 参数入栈形式 从右到左
fdtoc proc
push bp
mov bp,sp
push bx
push cx
push si
push ds
;*****************************************************************************
mov si,[bp+4]
mov ds,si
mov si,[bp+6]
mov bx,10
xor cx,cx
xor ax,ax
xor dx,dx ;转换过程
fdtoc_s: mov cl,[si]
sub cx,30h
add ax,cx
adc dx,0
cmp byte ptr [si+1],0
je fdtoc_end
mul bx
inc si
jmp short fdtoc_s
;******************************************************************************
fdtoc_end: pop ds
pop si
pop cx
pop bx
pop bp
ret 4
fdtoc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;名称 copy
;功能 将指定的数据复制到指定的地方
;参数 copy(源段地址,源段偏移,到段地址,到段偏移,复制字节数)
; 参数入栈形式 从右到左
copy proc
;*****************************************************************************
push bp
mov bp,sp
;*****************************************************************************
push ax
push cx
push si
push di
push ds
push es
;*******************************************************************************
mov cx,[bp+12] ;复制字节数
mov es,[bp+8] ;到段地址
mov di,[bp+10] ;到段偏移
mov ds,[bp+4] ;源段地址
mov si,[bp+6] ;源段偏移
;*******************************************************************************
cld
rep movsb
pop es
pop ds
pop di
pop si
pop cx
pop ax
mov sp,bp
pop bp
ret 10
copy endp
;名称 time
;功能 将时钟显示程序放到0:200以待修改时钟中断1ch
;参数 time()
;返回 无
;本来使用直接定址表 不过一循环就出错 循环注释了后就正确,不知道是为什么
;所以只好使用原始的办法了
time proc
push ax
;****************************************************************************
mov ax,offset time_end-offset time_g
push ax
mov ax,200h
push ax
xor ax,ax
push ax
mov ax,offset time_g ;安装过程
push ax
mov ax,cs
push ax
call copy
;****************************************************************************
pop ax
ret
time_g: push ax
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,160*24+62*2
jmp short time_start
;****************************************************************************
time_iret: pop es ;由于往下跳转超过了128字节
pop cx ;所以只好放在这里了
pop bx
pop ax
iret
;****************************************************************************
time_db db 18
dec time_db
mov al,time_db ;判断条件18次以后进行一次时钟显示
cmp al,0
jne time_iret
mov time_db,18
;*****************************************************************************
time_start: mov al,9
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ax,3030h ;读取并显示年
mov es:[bx],ah
add bx,2
mov es:[bx],al
add bx,2
mov byte ptr es:[bx],'\'
add bx,2
;*****************************************************************************
mov al,8
out 70h,al
in al,71h
mov ah,al
shr ah,cl ;读取并显示月份
and al,0fh
add ax,3030h
mov es:[bx],ah
add bx,2
mov es:[bx],al
add bx,2
mov byte ptr es:[bx],'\'
add bx,2
;*****************************************************************************
mov al,7
out 70h,al
in al,71h
mov ah,al
shr ah,cl
and al,0fh ;读取并显示日
add ax,3030h
mov es:[bx],ah
add bx,2
mov es:[bx],al
add bx,2
mov byte ptr es:[bx],' '
add bx,2
;******************************************************************************
mov al,4
out 70h,al
in al,71h
mov ah,al
shr ah,cl
and al,0fh ;读取并显示小时
add ax,3030h
mov es:[bx],ah
add bx,2
mov es:[bx],al
add bx,2
mov byte ptr es:[bx],':'
add bx,2
;******************************************************************************
mov al,2
out 70h,al
in al,71h
mov ah,al
shr ah,cl
and al,0fh ;读取并显示分钟
add ax,3030h
mov es:[bx],ah
add bx,2
mov es:[bx],al
add bx,2
mov byte ptr es:[bx],':'
add bx,2
;******************************************************************************
xor ax,ax
out 70h,al
in al,71h
mov ah,al ;读取并显示秒
shr ah,cl
and al,0fh
add ax,3030h
mov es:[bx],ah
add bx,2
mov es:[bx],al
;******************************************************************************
jmp time_iret
time_end: nop
time endp
;名称 BCD
;功能 把压缩的8421BCD码转换为对应十进制的ASCII码
;参数 al待转换数
;返回 ah=转换后的高字节
; al=转换后的低字节
BCD proc
;****************************************************************************
mov ah,al
and al,00001111b
shr ah,1
shr ah,1 ;转换过程
shr ah,1
shr ah,1
add al,30h
add ah,30h
;****************************************************************************
BCD endp
;名称 getstr
;功能 接收一个字符串
;参数 getstr()
; ds:si指向缓冲区
getstr proc
push ax
push bx
push cx
push dx
mov ah,03
xor bx,bx ;获取光标所在
int 10h
getstrs:
mov ah,0
int 16h
cmp al,20h
jb nochar
mov ah,0
call charstack
mov ah,2
call charstack
jmp short getstrs
;*****************************************************************************
nochar: cmp ah,0eh ;退格键扫描码
je backspace
cmp ah,1ch ;回车键扫描码
je enter
jmp short getstrs
;*****************************************************************************
backspace:
;*****************************************************************************
mov ah,1
call charstack ;字符出栈
;*****************************************************************************
mov ah,2 ;光标指向第一行
xor bx,bx
int 10h
mov ah,2
call charstack ;显示
jmp short getstrs
enter: xor ax,ax
call charstack
mov ah,2 ;光标指向下一行
xor bx,bx
inc dh
int 10h
pop dx
pop cx
pop bx
pop ax
ret
getstr endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;名称 charstack
;功能 字符串的入栈,出栈和显示
;参数 charstack( )
; (ah)=功能号 0表示入栈,1表示出栈,2表示显示
; 对于0号功能:(al)=入栈字符
; 对于1号功能:(al)=返回的字符
; 对于2号功能:在当前光标所在位置显示字符
; 缓冲区最小需要80字节
charstack proc
;******************************************************************************
jmp short char_stack_g
;******************************************************************************
char_stack_top dw 0 ;栈顶
char_stack_tab dw char_push,char_pop,char_show
;*****************************************************************************
char_stack_g: push bx
push cx
push dx
;*****************************************************************************
and ah,3
xor bx,bx
mov bl,ah ;调用选择的功能号
add bx,bx
call char_stack_tab[bx]
;*****************************************************************************
pop dx
pop cx
pop bx
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
char_push: push ax
push bx
;****************************************************************************
char_push_s: mov bx,char_stack_top
cmp bx,79
je char_push_end
mov [si][bx],al ;字符入栈
inc bx
mov char_stack_top,bx
cmp ax,0
jne char_push_end
mov char_stack_top,ax
;****************************************************************************
char_push_end: pop bx
pop ax
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
char_pop: push bx
;*****************************************************************************
mov bx,char_stack_top
cmp bx,0
je char_pop_end ;字符出栈
mov al,[si][bx-1]
dec bx
mov char_stack_top,bx
;****************************************************************************
char_pop_end: pop bx
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
char_show: push ax
push bx
push cx
push dx
;****************************************************************************
;****************************************************************************
xor bx,bx
char_show_s: cmp bx,char_stack_top
je char_show_end
;*****************************************************************************
mov ah,9
mov al,[si][bx]
push bx
mov bx,0007h ;显示栈中字符
mov cx,1
int 10h
pop bx
inc bx
;****************************************************************************
mov ah,2
push bx ;光标指向下一行
xor bx,bx
inc dl
int 10h
pop bx
;****************************************************************************
jmp short char_show_s ;循环显示
char_show_end: mov ah,09
mov al,' '
mov bx,7 ;当前光标所在显示空字符
mov cx,1
inc dl
int 10h
;****************************************************************************
pop dx
pop cx
pop bx
pop ax
ret
charstack endp
;名称 setscreen
;功能 (0) 清屏
; (1) 设置前景色
; (2) 设置背景色
; (3) 向上滚动一行
;参数 ah传递功能号
; 对于2,3号功能 al传递颜色值(al)={0,1,2,3,4,5,6,7}
setscreen proc
push bx
;***************************************************************************
jmp short setscreen_start
setscreen_table dw cls,foreground,background,uproll
;***************************************************************************
setscreen_start: and al,7
xor bx,bx
mov bl,ah
and bl,00000011b ;选择功能号
add bx,bx
call word ptr setscreen_table[bx]
pop bx
ret
;***************************************************************************
;名称 uproll
;功能 向上滚动一行
uproll proc
push ax
push cx
push si
push di
push es
;*****************************************************************************
mov si,0b800h
mov es,si
xor si,si
mov di,160
mov cx,24
uproll_s: push cx
mov cx,80
uproll_s1: mov ax,es:[di]
mov es:[si],ax
add si,2
add di,2
loop uproll_s1
pop cx
loop uproll_s
mov cx,80
uproll_d1: mov byte ptr es:[si],' '
add si,2
loop uproll_d1
;*****************************************************************************
pop es
pop di
pop si
pop cx
pop ax
ret
uproll endp
;名称 background
;功能 设置背景色
;参数 al传递颜色值
background proc
push bx
push cx
push es
;*******************************************************************************
and al,00000111b
mov cl,4
shl al,cl
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
background_s: or es:[bx],al
add bx,2
loop background_s
;******************************************************************************
pop es
pop cx
pop bx
ret
background endp
;名称 foreground
;功能 设置前景色
;参数 al传递颜色值
foreground proc
push bx
push cx
push es
;*******************************************************************************
and al,00000111b
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
foregroudn_s: mov es:[bx],al
add bx,2
loop foregroudn_s
;******************************************************************************
pop es
pop cx
pop bx
ret
foreground endp
;名称 cls
;功能 清屏
cls proc
push bx
push cx
push es
;*****************************************************************************
mov bx,0b800h
mov es,bx
xor bx,bx
mov cx,2000
cls_s: mov byte ptr es:[bx],' '
add bx,2
loop cls_s
;******************************************************************************
pop es
pop cx
pop bx
ret
cls endp
;名称 delay
;功能 延时
;参数 delay(dword延时低16位,dword延时高16位)
delay proc
push bp
mov bp,sp
;******************************************************************************
push ax
push dx
mov dx,[bp+6]
mov ax,[bp+4]
delay_si: sub ax,1
sbb dx,0
cmp ax,0
jne delay_si
cmp dx,0
jne delay_si
pop dx
pop ax
pop bp
ret
delay endp
;名称 letter
;功能 将字符串中的字母按选定的功能转变
;参数 (ah)=功能号 (al)=标示字符串的结束符
; 0号功能 将字符串转变成大写字母
; 1号功能 将字符串转变成小写字母
; letter(段地址,偏移地址)
letter proc
push bp
mov bp,sp
;*****************************************************************************
push ax
push bx
push si
push ds
;*****************************************************************************
mov si,[bp+6]
mov ds,[bp+4]
xor bx,bx
mov bl,ah
and bl,00000001b ;选择功能号
add bx,bx
jmp letter_start
letter_table dw letter_zero,letter_one
letter_start: jmp letter_table[bx]
;******************************************************************************
letter_zero: mov ah,[si]
cmp ah,al
je letter_exit
cmp ah,'a'-1
jna letter_next ;0号功能小写换大写
cmp ah,'z'+1
jnb letter_next
and ah,11011111b
mov [si],ah
letter_next: inc si
jmp letter_zero
;******************************************************************************
letter_one: mov ah,[si]
cmp ah,al
je letter_exit
cmp ah,'A'-1
jna letter_next1 ;1号功能 大写换小写
cmp ah,'Z'+1
jnb letter_next1
or ah,00100000b
mov [si],ah
letter_next1: inc si
jmp letter_one
;******************************************************************************
letter_exit: pop ds
pop si
pop bx
pop ax
pop bp
ret 4
letter endp
;名称 dtoc
;功能 将dword型数转变成为表示十进制数的字符串,字符串以0结尾
;参数 dtoc(dword型低位,dword型高位,转换后的段地址,段偏移)
dtoc proc
push bp
mov bp,sp
;******************************************************************************
push ax
push bx
push cx
push dx
push si
push ds
;******************************************************************************
mov ds,[bp+8]
mov si,[bp+10]
mov dx,[bp+6]
mov ax,[bp+4]
;*****************************************************************************
xor bx,bx
dtoc_while: mov cx,10
call divdw
add cx,30h
push cx
inc bx ;循环除余数入栈
mov cx,dx
jcxz dtoc_balance
jmp dtoc_while
dtoc_balance: mov cx,ax
jcxz dtoc_end
jmp dtoc_while
;******************************************************************************
dtoc_end: mov cx,bx
jcxz dtoc_exit
pop ax
mov [si],al ;结果循环出栈
inc si
dec bx
loop dtoc_end
;******************************************************************************
dtoc_exit: mov byte ptr [si],0
pop ds
pop si
pop dx
pop cx
pop bx
pop ax
;******************************************************************************
pop bp
ret 8
dtoc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;名称 divdw
;功能 进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
;参数 (dx) = dword型高16位
; (ax) = dword型低16位
; (cx) = 除数
;返回 (dx) = 结果高16位 (ax) = 结果低16位 (cx) = 余数
divdw proc
push bx
;***************************************************************************
mov bx,ax
mov ax,dx
xor dx,dx
div cx
push ax
mov ax,bx
div cx
mov cx,dx
pop dx
;****************************************************************************
pop bx
ret
divdw endp
;名称 show_str
;功能 在指定的位置显示指定的数据
;参数 show_str(行,列,颜色,段地址,段偏移)
;ah传送功能号 (对于0号功能 al=标示字符串结束的字符)
; (对于1号功能 al=需要显示的字符数)
show_str proc
push bp
mov bp,sp
push bx
push cx
push dx
push si
push ds
push es
;******************************************************************************
mov bx,0b800h
mov es,bx
mov bx,[bp+10]
mov ds,bx
mov bx,[bp+12]
mov si,bx
;******************************************************************************
jmp show_start
show_table dw show_zero,show_one
show_start: mov bl,ah ;选择功能号
xor bh,bh
and bl,00000001b
add bx,bx
jmp show_table[bx]
;******************************************************************************
show_zero: mov cl,al
xor ch,ch
mov ax,[bp+4]
mov bx,160
xor dx,dx
mul bx
mov bx,[bp+6]
add bx,bx
add bx,ax
show_while: mov al,[si] ;0号功能
cmp al,cl
jz show_exit
mov es:[bx],al
inc bx
mov ax,[bp+8]
mov es:[bx],al
inc bx
inc si
jmp show_while
;****************************************************************************
show_one: mov cl,al
xor ch,ch
mov ax,[bp+4]
xor dx,dx
mov bx,160
mul bx
mov bx,[bp+6]
add bx,bx ;1号功能
add bx,ax
show_while1: mov al,[si]
mov es:[bx],al
inc bx
mov ax,[bp+8]
mov es:[bx],al
inc bx
inc si
loop show_while1
;******************************************************************************
show_exit: pop es
pop ds
pop si
pop dx
pop cx
pop bx
pop bp
ret 10
show_str endp
;名称 main
;功能 主函数
main proc
;*******************************************************************************
push bp
sub sp,32 ;[bp+4]年,[bp+19]列,[bp+20]颜色,[bp+21]字符数
mov bp,sp
;*******************************************************************************
;主函数框架
;*******************************************************************************
add sp,32
pop bp
ret
;*******************************************************************************
main endp
start: mov ax,stack
mov ss,ax
mov sp,256
call main
mov ax,4c00h
int 21h
code ends
end start | | |