. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->自由讨论区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  自己经过这段时间累积的源码  [待解决] 回复[ 1次 ]   点击[ 364次 ]  
zd3870262
[帖 主]   [ 发表时间:2008-10-25 14:29 ]   [引用]   [回复]   [ top ] 
荣誉值: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
mouse
[第1楼]   [ 回复时间:2008-10-27 20:24 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
疯狂建议个人自己独立完成 :-)
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved