汇编语言(王爽) 课设二

;-------------------------------------------写扇区
assume cs:setupsg
setupsg segment
setup:
;引导程序-1扇区
        mov ax,initsg
        mov es,ax
        mov bx,0
 
        mov al,1
        mov ch,0
        mov cl,1
        mov dl,0
        mov dh,0
 
        mov ah,3
        int 13h

;子程序-2扇区
        mov ax,syssg
        mov es,ax
        
        mov al,15
        mov cl,2
        mov ah,3
        int 13h
 
        mov ax,4c00h
        int 21h
        
setupsg ends
;-------------------------------------------写扇区


;-------------------------------------------引导程序
assume cs:initsg
initsg segment
init:
        call loadsys
 
        mov ax,2000h        ;跳转2000:0
        push ax
        mov ax,0
        push ax
        retf
 
loadsys:

        mov ax,2000h        ;读取子程序
        mov es,ax
        mov bx,0
 
        mov al,15        
        mov ch,0        
        mov cl,2        
        mov dl,0        
        mov dh,0        
 
        mov ah,2
        int 13h
        
ret
initsg ends
;-------------------------------------------引导程序
 


;-------------------------------------------子程序
assume cs:syssg
syssg segment
menu:
        jmp near ptr menushow
        menudata dw offset md0,offset md1,offset md2,offset md3,offset md4,offset md5
        md0 db "------ welcome ------",0
        md1 db "    1) reset pc",0
        md2 db "    2) start system",0
        md3 db "    3) clock",0
        md4 db "    4) set clock",0
        md5 db "------ welcome ------",0
        systable dw sys_restart,sys_disksys,sys_showclock,sys_setclock
        
menushow:

        mov dh,5
        mov dl,30
        mov bp,0        ;menudata
        mov ax,cs
        mov ds,ax
        mov cx,6
        
menushow_s:

        push cx
        mov si,menudata[bp]
        mov cl,02h
        call sys_showstr
        add bp,2
        add dh,2
        pop cx
        
loop menushow_s
;-------------------------------------------子程序


;-------------------------------------------处理输入选项
sys_input:

        mov ah,0
        int 16h
        mov bx,0
        mov bl,al
        mov al,30h
        sub bl,al 
        sub bl,1
 
        cmp bx,0
        jb cycle
        cmp bx,3
        ja cycle
        add bx,bx
        call word ptr systable[bx]        ;调用功能
        
cycle:
        jmp short sys_input
;-------------------------------------------处理输入选项
 
 
 
;-------------------------------------------重启
sys_restart:

        mov ax,0ffffh        ;引导 ffff:0
        push ax
        mov ax,0h
        push ax
        retf
;-------------------------------------------重启


;-------------------------------------------硬盘引导
sys_disksys:

        call cls
 
        mov ax,0h  
        mov es,ax
        mov bx,7c00h
 
        mov al,1  
        mov ch,0  
        mov cl,1  
        mov dl,80h        ;C盘
        mov dh,0  
 
        mov ah,2
        int 13h
 
        mov ax,0h
        push ax
        mov ax,7c00h
        push ax
retf
;-------------------------------------------硬盘引导


;-------------------------------------------显示时钟
sys_showclock:

        call cls
        jmp short clockread
        
clockdata:

        clockstr dw offset cl1,offset cl2,offset cl3
        clockcolor db 02h
        cl1 db '00/00/00 00:00:00',0
        cl2 db 'ESC - return menu!',0
        cl3 db 'F1 - change color!',0
        cltable db 9,8,7,4,2,0
        
clockread:

        mov si,0        ;cl1
        mov di,0        ;cltable
        mov cx,6        
        
clockread_s:

        push cx
        mov al,cltable[di]    
        
        out 70h,al        ;读取CMOS RAM
        in al,71h
        mov ah,al        
        mov cl,4       
        shr ah,cl        
        and al,00001111b   
        add ah,30h        
        add al,30h       
        
        mov byte ptr cl1[si],ah        ;储存时间
        mov byte ptr cl1[si+1],al
        
        add si,3
        inc di
        pop cx
        
loop clockread_s

clockprint:

        mov dh,6
        mov dl,30
        mov bp,0
        mov ax,cs
        mov ds,ax
        mov cx,3
        
clockprint_s:

        push cx
        mov si,clockstr[bp]
        mov cl,clockcolor[0]        ;颜色
        call sys_showstr
        add bp,2
        add dh,2
        pop cx
        
loop clockprint_s

        mov ah,0        
        int 16h
        cmp ah,01h        ;ESCh
        je clockreturn 
        cmp ah,3bh        ;F1
        je changecolor
        jmp short clockread
        
clockreturn:

        call cls
        
        mov ah,0   
        int 16h     
        
        jmp near ptr menu
        
changecolor:

        inc clockcolor
        
        mov ah,0    
        int 16h    
        
        jmp near ptr clockread
;-------------------------------------------显示时钟



;-------------------------------------------修改时钟
sys_setclock:
jmp short setclock

        setclockdata db 'input time like "yy/mm/dd hh:mm:ss"',0
        setsuccess   db 'successful! Press any key return...',0
        
setclock:

        call cls
        
        mov dh,6
        mov dl,20
        mov cl,02h
        mov ax,cs
        mov ds,ax
        mov si,offset setclockdata        ;输出'input'
        call sys_showstr
        
        call getstr            ;读取输入内容
        call settime        ;设置CMOS RAM        
        
        mov dh,10
        mov dl,20
        mov cl,02h
        mov ax,cs
        mov ds,ax
        mov si,offset setsuccess        ;输出'success'
        call sys_showstr

        mov ah,0
        int 16h
        
        call cls
        
        jmp near ptr menu
;-------------------------------------------修改时钟


;-------------------------------------------设置时钟
;ds:si指向时间字符串
settime:

    jmp short seting
    settable db 9,8,7,4,2,0

seting:

        mov bx,0
        mov cx,6

settime_s:

        mov dh,ds:[si]        ;取值
        inc si
        mov dl,ds:[si]
        add si,2
        
        mov al,30h        ;设置CMOS RAM    
        sub dl,al
        sub dh,al
        shl dh,1
        shl dh,1
        shl dh,1
        shl dh,1
        or dl,dh
        
        mov al,settable[bx]
        out 70h,al
        mov al,dl
        out 71h,al
        
        inc bx
        
loop settime_s
ret
;-------------------------------------------设置时钟


;-------------------------------------------处理输入
getstr:
        push ax
getstrs:
        mov ah,0
        int 16h
        
        cmp al,20h
        jb nochar
        
        mov ah,0
        call charstack
        
        mov ah,2
        mov dh,8
        mov dl,25
        call charstack
        
        jmp getstrs
        
nochar:

        cmp ah,0eh
        je backspace
        
        cmp ah,1ch
        je enterkey
        
        jmp getstrs
        
backspace:

        mov ah,1
        call charstack
        
        mov ah,2
        call charstack
        jmp getstrs
        
enterkey:

        mov al,0
        mov ah,0
        call charstack
        
        mov ah,2
        call charstack
        
        pop ax
ret
;-------------------------------------------处理输入


;-------------------------------------------字符栈处理
;(ah),0入栈,1出栈,2显示
;ds:si指向字符栈空间
;0号,(al)表示入栈字符
;1号,(al)返回的字符
;2号,(dh)(dl)字符串在屏幕显示的行列位置
charstack:

        jmp short charstart
        table dw charpush,charpop,charshow
        top  dw 0
        
charstart:

        push bx
        push dx
        push di
        push es
        
        cmp ah,2
        ja sret
        
        mov bl,ah
        mov bh,0
        add bx,bx
        jmp word ptr table[bx]        ;跳转
        
charpush:

        mov bx,top
        mov [si][bx],al
        inc top
        jmp sret
        
charpop:

        cmp top,0
        je sret
        dec top
        mov bx,top
        mov al,[si][bx]
        jmp sret
        
charshow:

        mov bx,0b800h
        mov es,bx
        mov al,160
        mov ah,0
        mul dh
        mov di,ax
        add dl,dl
        mov dh,0
        add di,dx
        mov bx,0
        
charshows:

        cmp bx,top
        jne noempty
        mov byte ptr es:[di],' '
        mov byte ptr es:[di+1],02h
        jmp sret
        
noempty:

        mov al,[si][bx]
        mov es:[di],al
        mov byte ptr es:[di+2],' '
        mov byte ptr es:[di+1],02h
        inc bx
        add di,2
        jmp charshows
        
sret:

        pop es
        pop di
        pop dx
        pop bx
ret
;-------------------------------------------字符栈处理


;-------------------------------------------显示字符串 
;行 - dh,列 - dl,颜色 - cl,首地址 - ds:si
sys_showstr:

        push ax
        push cx
        push dx
        push si
        push bp
        push es
        
        mov ax,0b800h
        mov es,ax
        mov al,160
        mul dh
        mov dh,0
        add dx,dx 
        add ax,dx
        mov bp,ax
        
showstr_s:

        mov ch,ds:[si]
        cmp ch,0
        je showstr_return
        mov es:[bp],ch
        mov es:[bp+1],cl
        add bp,2
        inc si
        
jmp short showstr_s
        
showstr_return:

        pop es
        pop bp
        pop si
        pop dx
        pop cx
        pop ax
ret
;-------------------------------------------显示字符串


;-------------------------------------------清屏
cls:

        mov ax,0b800h
        mov ds,ax
        mov bx,0
        mov cx,24*80*2
 
cls_s:

        mov byte ptr ds:[bx],0
        add bx,2
        
loop cls_s
ret
;-------------------------------------------清屏

syssg ends
end setup

参考石莹

  博主石莹的这篇汇编代码已经写的比较完美了,受益颇深。

posted @ 2019-11-09 17:07  Vivid-BinGo  阅读(439)  评论(0编辑  收藏  举报