;-------------------------------------------写扇区
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,1
int 16h
cmp al,1bh ;ESC
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
博主石莹的这篇汇编代码已经写的比较完美了,受益颇深。