汇编网首页登录博客注册
arg123654789的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2013-09-01 11:12] 课程设计2

图片载入中
课程设计2

;这个程序将一堆程序安装到软盘A的起始位置

assume cs:code

code segment
        booter:mov ax,7c0h
        mov es,ax
        mov bx,offset booter_ipcs
        jmp dword ptr es:[bx]
        booter_loader:mov ah,2
        mov al,3
        mov ch,0
        mov cl,2
        mov dh,0
        mov dl,0
        mov bx,7c0h
        mov es,bx
        mov bx,offset finallab
        int 13h
        booter_exec:jmp finallab
        booter_ipcs:dw offset booter_loader,7c0h
        booter_fill:db 510-(offset booter_fill-offset booter) dup(0)
        dw 0aa55h
        
        finallab:mov ah,2
        mov al,1
        mov ch,0
        mov cl,1
        mov dh,0
        mov dl,80h
        mov bx,cs
        mov es,bx
        mov bx,0
        int 13h
        mov ax,cs
        mov ss,ax
        mov sp,offset mainfrm
        jmp mainfrm
        
        table dw reset,loados,clock,setclock
        menustr  db '1) reset pc',0,'2) start system',0,'3) clock',0,'4) set clock',0
        stack:db 64 dup(0)
        
        ;主界面
        mainfrm:call cls
        mov ax,0b800h
        mov es,ax
        mov di,10*160+70
        mov si,0
        mov ah,7
        mov bx,0
        mov cx,4
        mainfrm_print:mov al,menustr[si]
        cmp al,0
        je mainfrm_next
        mov es:[di+bx],ax
        add bx,2
        inc si
        jmp short mainfrm_print
        mainfrm_next:inc si
        add di,160
        mov bx,0
        loop mainfrm_print
        mov ax,0
        mainfrm_input:in al,60h
        cmp ax,282h
        je mainfrm_jmp
        cmp ax,383h
        je mainfrm_jmp
        cmp ax,484h
        je mainfrm_jmp
        cmp ax,585h
        je mainfrm_jmp
        mov ah,al
        jne mainfrm_input
        mainfrm_jmp:sub al,ah
        cmp al,80h
        jne mainfrm_input
        sub ah,2
        add ah,ah
        mov bh,0
        mov bl,ah
        jmp table[bx]
        
        ;清屏子程序
        cls:mov bx,0b800h
        mov es,bx
        mov bx,0
        mov cx,2000
        cls_do:mov byte ptr es:[bx],' '
        add bx,2
        loop cls_do
        ret
        
        ;1) 重启计算机
        reset:call cls
        mov ax,0ffffh
        push ax
        xor ax,ax
        push ax
        retf
        
        ;2) 加载操作系统
        loados:call cls
        mov bx,0
        mov es,bx
        mov bx,7c00h
        push es
        push bx
        retf
        
        ;3) 时钟程序
        clock:call cls
        mov dl,7
        clock_frv:in al,60h
        cmp ax,181h
        je clock_back
        cmp ax,3bbbh
        jne clock_ShowTime
        inc dl
        cmp dl,8
        jne clock_ShowTime
        mov dl,1
        clock_ShowTime:call ShowTime
        mov ah,al
        jmp clock_frv
        clock_back:mov ax,0
        mov es,ax
        jmp mainfrm

        ;显示时钟子程序
        ShowTime:push ax
        push cx
        push bx
        push ds
        push es
        push si
        push di
        jmp ShowTime_start
        ShowTime_loc:db 9,8,7,4,2,0
        ShowTime_buf:db "00/00/00 00:00:00"
        ShowTime_start:mov ax,cs
        mov ds,ax
        mov es,ax
        mov si,offset ShowTime_buf
        mov di,offset ShowTime_loc
        
        mov cx,6
        ShowTime_next:push cx
        mov al,es:[di]
        out 70h,al
        in al,71h
        mov ah,al
        mov cl,4
        shr ah,cl
        and al,15
        add al,30h
        add ah,30h
        mov bl,[si]
        cmp bl,'0'
        jb ShowTime_notdig
        cmp bl,'9'
        jna ShowTime_tobuf
        ShowTime_notdig:inc si
        ShowTime_tobuf:mov [si],ah
        inc si
        mov [si],al
        inc si
        inc di
        pop cx
        loop ShowTime_next
        
        mov ax,0b800h
        mov es,ax
        mov di,160*12+31*2
        mov si,offset ShowTime_buf
        mov cx,17
        ShowTime_show:mov al,[si]
        mov es:[di],al
        inc si
        inc di
        mov es:[di],dl
        inc di
        loop ShowTime_show
        pop di
        pop si
        pop es
        pop ds
        pop bx
        pop cx
        pop ax
        ret
        
        ;修改时钟子程序
        ;si表示要修改的位置
        ;ch表示修改高位或低位,1表示高位,0表示低位
        ;cl表示修改后的数字
        ;程序改变si和ch
        set:push ax
        jmp short set_do
        set_loc db 9,8,7,4,2
        set_do:cmp si,5
        jne set_jud
        mov si,0
        set_jud:cmp ch,0
        je set_low
        jmp set_high
        set_low:add dh,cl
        jmp short set_write
        set_high:mov dh,cl
        mov cl,4
        shl dh,cl
        jmp short set_hl
        set_write:mov al,set_loc[si]
        out 70h,al
        mov al,dh
        out 71h,al
        set_hl:xor ch,1
        cmp ch,0
        je set_ret
        inc si
        set_ret:pop ax
        ret
        
        ;4)修改时钟
        ;输入两个数字刷新一次时间,别输太快
        ;只能从08年8月8日8点开始运行
        ;非法输入将导致不可预测的结果
        setclock:call cls
        mov dl,7
        mov ch,1
        mov si,0
        setclock_frv:in al,60h
        cmp ax,181h
        je setclock_back
        cmp ax,0282h
        je setclock_set
        cmp ax,0383h
        je setclock_set
        cmp ax,0484h
        je setclock_set
        cmp ax,0585h
        je setclock_set
        cmp ax,0686h
        je setclock_set
        cmp ax,0787h
        je setclock_set
        cmp ax,0888h
        je setclock_set
        cmp ax,0989h
        je setclock_set
        cmp ax,0a8ah
        je setclock_set
        cmp ax,0b8bh
        je setclock_zero
        jne setclock_ShowTime
        setclock_zero:mov cl,0
        call set
        jmp short setclock_ShowTime
        setclock_set:mov cl,ah
        dec cl
        call set
        setclock_ShowTime:call ShowTime
        mov ah,al
        jmp setclock_frv
        setclock_back:jmp mainfrm
        
        final_fill:db 2560-(offset final_fill - offset booter) dup(0)
        
        ;安装程序
        start:mov ah,3
        mov al,5
        mov ch,0
        mov cl,1
        mov dh,0
        mov dl,0
        mov dh,0
        mov bx,cs
        mov es,bx
        mov bx,offset booter
        int 13h
        mov ax,4c00h
        int 21h
code ends
end start
评论次数(1)  |  浏览次数(663)  |  类型(汇编作业) |  收藏此文  | 

[  游客   发表于  2013-09-01 17:39  ]

WOW
恭喜
不要嫌多余哦

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码