课程设计二

code segment
assume cs:code

setupsg2:jmp short show             ;选项显示
  table dw offset t0,offset t1,offset t2,offset t3
  t0 db "1) reset pc",0
  t1 db "2) start system",0
  t2 db "3) clock",0
  t3 db "4) set clock",0
  table1 dw resetpc,startsys,clock,setclock
  s1:db 50,9,8,7,4,2,0
  s2:db '/','/',20h,':',':',20h

show:
  mov dh,8
  mov dl,20
  mov di,0
  mov ax,cs
  mov ds,ax
  mov cx,4
show1:push cx
  mov si,table[di]
  mov cl,02   ;属性
  call showchoice
  add di,2
  add dh,1
  pop cx
  loop show1

choiced:mov ah,0
  int 16h
  sub al,30h   ;将ASCII码换为数字
  sub al,1
  mov ah,0
  add ax,ax
  mov bx,ax
  call word ptr table1[bx]
  jmp choiced
 

 
resetpc:mov ax,0ffffh   ;重新启动计算机
  push ax
  mov ax,0
  push ax
  retf

startsys:           ;硬盘数据读取到0:7c00
  mov ax,0         
  mov es,ax
  mov bx,7c00h
  mov al,1           ;读取的扇区数
  mov ch,0 
  mov cl,1           ;1扇区
  mov dl,80h 
  mov dh,0 
  mov ah,2
  int 13h

  mov ax,0
  push ax
  mov ax,7c00h
  push ax
  retf


showchoice:push ax
  push dx
  push cx
  push di
  push es
  push si
  mov ax,0b800h
  mov es,ax
  mov al,160
  mul dh
  mov dh,0
  add dl,dl
  add ax,dx
  mov di,ax
showchoice1:mov ch,ds:[si]
  cmp ch,0
  je showret
  mov byte ptr es:[di],ch
  mov byte ptr es:[di+1],02
  add di,2
  inc si
  jmp short showchoice1
showret:
  pop si
  pop es
  pop di
  pop cx
  pop dx
  pop ax
  ret


clock:mov ax,0
  mov es,ax
  push es:[9*4]
  pop es:[200h]
  push es:[9*4+2]
  pop es:[202h]
  cli
  mov word ptr es:[9*4],offset int9
  mov word ptr es:[9*4+2],cs
  sti
 
  mov dl,02
clock1:
  mov bx,160*12+40*2
  mov di,offset s1
  mov si,offset s2

  mov al,cs:[di] 
  out 70h,al
  in al,71h
 
  mov ah,al
  mov cl,4
  shr ah,cl
  and al,00001111b

  add ah,30h
  add al,30h

  push bx
  mov bx,0b800h
  mov es,bx
  pop bx
  mov byte ptr es:[bx],ah
  mov byte ptr es:[bx+1],dl
  mov byte ptr es:[bx+2],al
  mov byte ptr es:[bx+3],dl
  inc di
  add bx,4

  mov cx,6
l1:push cx
  mov al,cs:[di] 
  out 70h,al
  in al,71h
 
  mov ah,al
  mov cl,4
  shr ah,cl
  and al,00001111b

  add ah,30h
  add al,30h

  push bx
  mov bx,0b800h
  mov es,bx
  pop bx
  mov byte ptr es:[bx],ah
  mov byte ptr es:[bx+1],dl
  mov byte ptr es:[bx+2],al
  mov byte ptr es:[bx+3],dl
  mov al,cs:[si]
  mov byte ptr es:[bx+4],al
  mov byte ptr es:[bx+5],dl
  add bx,6
  inc di
  inc si
  pop cx
  loop l1
  jmp short clock1
 
int9: push ax
  mov ax,0
  mov es,ax
  in al,60h
  pushf
  call dword ptr es:[200h]
  cmp al,02h              ;1
  je changecolor 
  cmp al,1                 ;ESC
  je return
k1:
  pop ax
  iret 
changecolor:
  inc dl
  jmp short k1
return:
  pop ax
  mov ax,0
  mov es,ax
  cli
  push es:[200h]
  pop es:[9*4]
  push es:[202h]
  pop es:[9*4+2]
  sti
  jmp near ptr setupsg2


setclock:call getstr
  call settime
  jmp near ptr setupsg2

settime:jmp short set1
 settable db 50,9,8,7,4,2,0
set1:
 mov bx,0
 mov cx,6
set2:
 mov dh,ds:[si]
 inc si
 mov dl,ds:[si]
 add si,2
 mov al,30h
 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 set2
 ret

 


getstr: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 enter          ;enter键扫描码
  jmp getstrs

backspace:mov ah,1
  call charstack
  mov ah,2
  call charstack
 
enter:mov al,0
  mov ah,0
  call charstack
  mov ah,2
  call charstack
  pop ax
  ret
 
charstack:jmp short charstart
  tabl 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 tabl[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],' '
 mov byte ptr es:[di+1],02h
 inc bx
 add di,2
 jmp charshows
sret:
 pop es
 pop di
 pop dx
 pop bx
 ret

 

 

setupsg: call floppytwo   ;主引导程序
  mov ax,200h
  push ax
  mov ax,0h
  push ax
  retf

floppytwo:        ;从2扇区读数据到200h:0
  mov ax,200h
  mov es,ax
  mov bx,0h
  mov al,2
  mov ch,0
  mov cl,2
  mov dl,0
  mov dh,0
  mov ah,2
  int 13h
  ret

start:               ;主引导程序安装到第一扇区
  mov ax,cs         
  mov es,ax
  mov bx,offset setupsg

  mov al,1           ;读取的扇区数
  mov ch,0
  mov cl,1           ;扇区号
  mov dl,0
  mov ah,3
  mov dh,0
  int 13h            

  mov ax,cs     ;子程序安装到从第二扇区开始的扇区
  mov es,ax
  mov bx,offset setupsg2
  mov al,2            ;读取的扇区数
  mov cl,2            ;扇区号
  mov ah,3
  mov dl,0
  mov ch,0
  mov dh,0
  int 13h             
  mov ax,4c00h
  int 21h

            
code ends
end start

 

 

 谁有设置时钟项的完善啊,我现在只能实现简单的字符串的输入和输出,想改变charshow里的内容,使输出格式为'/','/',20h,':',':',20h

 

我搞晕了

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值