[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
;这个程序将一堆程序安装到软盘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) |
浏览次数(673) |
类型(汇编作业) |
收藏此文 |
[ 游客 发表于 2013-09-01 17:39 ]
WOW
恭喜
不要嫌多余哦