21,459
社区成员
发帖
与我相关
我的任务
分享
assume cs:code
stack segment
dw 100 dup(0)
stack ends
code segment;主程序的功能为把shanqu1的程序(标号内的程序)写入软盘的扇区1
;把shanqu2的程序(单独一个段)写入软盘的扇区2开始的区域
start:
mov ax, stack
mov ss,ax
mov sp,100
mov ax,code
mov es,ax
mov bx,offset shanqu1;把shanqu1的程序写入软盘的扇区1
mov al,1;写入1个扇区
mov ch,0
mov cl,1
mov dl,0
mov dh,0
mov ah,3
int 13h
mov ax,shanqu2;把shanqu2的程序写入软盘的扇区2开始的区域
mov es,ax
mov bx,0
mov al,15;写入15个扇区
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,3
int 13h
mov ax,4c00h
int 21h
shanqu1:;写入扇区1
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
mov ax,0
mov [bx],ax
mov word ptr [bx+2],2000h
jmp dword ptr [bx]
shanqu1end:nop
code ends;主程序结束
shanqu2 segment;写入扇区2开始的区域
org 20000h
assume cs:shanqu2
call clean
jmp start1
str1 db 'welcome',0
str2 db '1) reset pc',0
str3 db '2) start system',0
str4 db '3) clock',0
str5 db '4) set clock',0
str6 db 'Please input time like "yy/mm/dd hh:mm:ss.',0
str7 db 'Set clock successful! Press enter key to return...',0
stack1 dw 128 dup(0)
start1:
mov ax,cs
mov ss,ax
mov sp,offset stack1 +127
mov ax,cs
mov ds,ax
mov dh,1; ;显示主菜单-开始
mov dl,1;
mov cl,02h
mov bx,offset str1
call show_str;
mov dh,12;
mov dl,15
mov cl,2h
mov bx,offset str2
call show_str
mov dh,14
mov dl,15
mov cl,2h
mov bx,offset str3
call show_str
mov dh,16;
mov dl,15;
mov cl,2h
mov bx,offset str4
call show_str;
mov dh,18;
mov dl,15
mov cl,2h
mov bx,offset str5
call show_str ;显示主菜单-结束
shuru: mov ah,0 ;选择菜单:
int 16h
mov al,ah
cmp al,5;
ja shuru
cmp al,2;扫描到的按键值大于5或小于2(输入1~4以外的字符)都需要重新输入
jb shuru
jmp short set1
table0 db 0,1,2,3;对应0,1,2,3
table1 db 2,3,4,5;1,2,3,4的案件通码
set1:push bx
mov bx,0
s9:cmp al,table1[bx]
je s8
inc bx
jmp s9
s8:
mov al,table0[bx]
pop bx
mov ah,al
mov al,2
jmp set
table dw sys_restart,sys_start,sys_showclock,sys_setclock
set:push bx
mov bl,ah
mov bh,0
add bx,bx;选择程序
call word ptr table[bx]
jmp quit
;下面为4个子程序
sys_restart:;重新启动
mov ax,0
mov [bx],ax
mov word ptr [bx+2],0ffffh
jmp dword ptr [bx]
ret
sys_start:;正常启动计算机
call clean
mov ax,0h
mov es,ax
mov bx,7c00h
mov al,2
mov ch,0
mov cl,1
mov dl,80h
mov dh,0
mov ah,2
int 13h
mov ax,7c00h
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
ret
sys_showclock:;显示时钟
call clean
mov dl,2
push cs
pop ds
mov ax,0
mov es,ax
mov si,offset int9
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0
sti
jmp ssc
int9:
push ax
push bx
push cx
push es
in al,60h
pushf
call dword ptr cs:[200h]
cmp al,3bh
jne nf1
dec dl
nf1:
cmp al,1h
jne int9ret
push es:[8000h];当这个中断不需要时,恢复原来的中断程序
pop es:[9*4];不过有没有这个,对于本程序都没有影响
push es:[8002h]
pop es:[9*4+2]
pop es
pop cx
pop bx
pop ax
mov ax,2000h
push ax
mov ax,0h
push ax
retf
int9ret:
pop es
pop cx
pop bx
pop ax
iret
int9end:nop
fh db '// ::';用到的符号
ssc: ;读取时钟,显示到屏幕上
mov al,9
out 70h,al
in al,71h
mov bl,al
mov cl,4
and bl,00001111b
shr al,cl
add al,30h
add bl,30h
mov es:[si+4],al
mov byte ptr es:[si+5],dl
mov es:[si+6],bl
mov byte ptr es:[si+7],dl
mov al,fh[0]
mov es:[si+10],al
mov byte ptr es:[si+11],dl
mov al,8
out 70h,al
in al,71h
mov bl,al
mov cl,4
and bl,00001111b
shr al,cl
add al,30h
add bl,30h
push dx
mov dx,0b800h
mov es,dx
pop dx
mov si,160*2
mov es:[si+16],al
mov byte ptr es:[si+17],dl
mov es:[si+18],bl
mov byte ptr es:[si+19],dl
mov al,fh[1]
mov es:[si+22],al
mov byte ptr es:[si+23],dl
mov al,7
out 70h,al
in al,71h
mov bl,al
mov cl,4
and bl,00001111b
shr al,cl
add al,30h
add bl,30h
push dx
mov dx,0b800h
mov es,dx
pop dx
mov si,160*2
mov es:[si+28],al
mov byte ptr es:[si+29],dl
mov es:[si+30],bl
mov byte ptr es:[si+31],dl
mov al,fh[2]
mov es:[si+34],al
mov byte ptr es:[si+35],dl
mov al,4
out 70h,al
in al,71h
mov bl,al
mov cl,4
and bl,00001111b
shr al,cl
add al,30h
add bl,30h
push dx
mov dx,0b800h
mov es,dx
pop dx
mov si,160*2
mov es:[si+40],al
mov byte ptr es:[si+41],dl
mov es:[si+42],bl
mov byte ptr es:[si+43],dl
mov al,fh[3]
mov es:[si+46],al
mov byte ptr es:[si+47],dl
mov al,2
out 70h,al
in al,71h
mov bl,al
mov cl,4
and bl,00001111b
shr al,cl
add al,30h
add bl,30h
push dx
mov dx,0b800h
mov es,dx
pop dx
mov si,160*2
mov es:[si+52],al
mov byte ptr es:[si+53],dl
mov es:[si+54],bl
mov byte ptr es:[si+55],dl
mov al,fh[4]
mov es:[si+58],al
mov byte ptr es:[si+59],dl
mov al,0
out 70h,al
in al,71h
mov bl,al
mov cl,4
and bl,00001111b
shr al,cl
add al,30h
add bl,30h
push dx
mov dx,0b800h
mov es,dx
pop dx
mov si,160*2
mov es:[si+64],al
mov byte ptr es:[si+65],dl
mov es:[si+66],bl
mov byte ptr es:[si+67],dl
jmp ssc
ret
sys_setclock:;设置时钟
call clean
mov dh,4;显示的行号
mov dl,13;显示的列号
mov cl,2h
mov bx,offset str6
call show_str;调用显示字符串函数
startsc:jmp getstr
string dw 50 dup(0);盛放输入的字符串
getstr: mov ax,string
mov ds,ax
mov si,offset string
push ax
getstrs:mov ah,0
int 16h
cmp al,20h
jb nochar
mov ah,0
call charstack
mov ah,2
call charstack
jmp getstrs
nochar: cmp ah,0eh
je backspace
cmp ah,1ch
je enter1
jmp getstrs
backspace:mov ah,1
call charstack
mov ah,2
call charstack
jmp getstrs
enter1: mov al,0;按enter键结束字符的输入
mov ah,0
call charstack
mov al,[si][0];把字符串解析后写入记录时钟的cmos ram中
mov bl,[si][1]
sub al,30h
sub bl,30h
mov cl,4
shl al,cl
and al,11110000b
and bl,00001111b
add al,bl
mov bl,al
mov al,9
out 70h,al
mov al,bl
out 71h,al
mov al,[si][3];把字符串解析后写入记录时钟的cmos ram中
mov bl,[si][4]
sub al,30h
sub bl,30h
mov cl,4
shl al,cl
and al,11110000b
and bl,00001111b
add al,bl
mov bl,al
mov al,8
out 70h,al
mov al,bl
out 71h,al
mov al,[si][6];把字符串解析后写入记录时钟的cmos ram中
mov bl,[si][7]
sub al,30h
sub bl,30h
mov cl,4
shl al,cl
and al,11110000b
and bl,00001111b
add al,bl
mov bl,al
mov al,7
out 70h,al
mov al,bl
out 71h,al
mov al,[si][9];把字符串解析后写入记录时钟的cmos ram中
mov bl,[si][10]
sub al,30h
sub bl,30h
mov cl,4
shl al,cl
and al,11110000b
and bl,00001111b
add al,bl
mov bl,al
mov al,4
out 70h,al
mov al,bl
out 71h,al
mov al,[si][12];把字符串解析后写入记录时钟的cmos ram中
mov bl,[si][13]
sub al,30h
sub bl,30h
mov cl,4
shl al,cl
and al,11110000b
and bl,00001111b
add al,bl
mov bl,al
mov al,2
out 70h,al
mov al,bl
out 71h,al
mov al,[si][15];把字符串解析后写入记录时钟的cmos ram中
mov bl,[si][16]
sub al,30h
sub bl,30h
mov cl,4
shl al,cl
and al,11110000b
and bl,00001111b
add al,bl
mov bl,al
mov al,0
out 70h,al
mov al,bl
out 71h,al
mov dh,6;显示的行号
mov dl,13;显示的列号
mov cl,2h
mov bx,offset str7
call show_str;调用显示字符串函数
shuru1: mov ah,0
int 16h
cmp ah,1ch;
jne shuru1;按enter键返回主程序
mov top,0
pop ax
mov ax,2000h;返回主程序
push ax
mov ax,0h
push ax
retf ;根据地址转移cpu执行位置
ret
charstack:jmp short charstart;处理输入、输出、显示的子程序
tablesr dw charpush,charpop,charshow
top dw 0
charstart:push bx
push dx
push di
push es
mov bx,cs
mov ds,bx
mov si,offset string
cmp ah,2
ja sret
mov bl,ah
mov bh,0
add bx,bx
mov dh,4
mov dl,12
jmp word ptr tablesr[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],' '
jmp sret
noempty:mov al,[si][bx]
mov es:[di],al
mov byte ptr es:[di+2],' '
inc bx
add di,2
jmp charshows
sret:pop es
pop di
pop dx
pop bx
ret
clean:;清屏的子程序
push bx;清屏
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
sub1s:mov byte ptr es:[bx],' '
add bx,2
loop sub1s
pop es
pop cx
pop bx
ret
;显示字符串函数\/
show_str:
push ax
push bx
push cx
push dx
push es
push si
push cx
mov al,160
dec dh
mul dh
push ax
mov al,2
dec dl
mul dl
pop si
add si,ax
mov ax,0b800h
mov es,ax
pop dx
mov ch,0
;pop si
s: mov cl,ds:[bx]
jcxz ok
mov al,ds:[bx]
mov es:[si],al
mov es:[si+1],dl
inc bx
add si,2
jmp short s
ok:
pop si
pop es
pop dx
pop cx
pop bx
pop ax
ret
;显示字符串函数^
quit:
mov ax,4c00h
int 21h
shanqu2 ends
end start
; 主菜单部分的
call show_str
qing1:
mov ah,1
int 16h
pan1:
jz shuru
mov ah, 0
int 16h
jmp qing1
shuru: mov ah,0 ;选择菜单:
int 16h
cmp al, '1'
jb qing1
cmp al, '4'
ja qing1
sub al, '1'
shl al, 1
mov bh, 0
mov bl, al
call word ptr table[bx]
jmp start1
; ......
; 显示时钟部分的
sys_showclock:;显示时钟
call clean
mov dl,2
ssc:
mov ah,1
int 16h
jz wan
mov ah, 0
int 16h
cmp ah, 1
jne isF1?
isEsc:
ret
fh db '// ::';用到的符号
isF1?:
cmp ah,3bh
jne ssc
add dl,1
wan: