王爽--------汇编语言 课程设计2

assume cs:code        
code segment  
start0:   mov bx,0
    mov ax,200h
    mov es,ax

    mov ah,2
    mov al,3
    mov ch,0
    mov cl,2
    mov dh,0
    mov dl,0

    int 13h
 
    mov ax,200h
    push ax
    mov ax,0
    push ax
    retf

 start1:   jmp short start
   
   s1 db '1.restart pc',0,'2.start system',0,'3.clock',0,'4.set clock',0,'5.input error!','$',0

 start:   mov ax,0b800h
    mov es,ax
      
    mov ax,cs
    mov ds,ax
    mov si,2

    mov dh,10
    mov dl,40
    mov bl,160
    mov bh,0

  s:   mov al,ds:[si]
    cmp al,0 
    jne s_next
    inc dh
    mov dl,39
    inc bh
    cmp bh,4
    je s_end

 s_next:  push dx
    push ax
    mov al,dh
    mul bl
    mov dh,0
    add ax,dx
    add ax,dx
    mov di,ax
    pop ax
    pop dx

    mov es:[di],al
    inc si
    inc dl
    jmp s  

 s_end:   mov ah,0
    int 16h

    cmp al,'1'
    jne choice2
    mov ax,0ffffh
    push ax
    mov ax,0
    push ax
    retf
    ;jmp dword 0ffff:0

choice2:  cmp al,'2'                                 '第二个子程序  
    jne choice3
 
    call cls

    mov ax,0
    mov es,ax
    mov bx,7c00h

    mov ah,2
    mov al,1
    mov ch,0
    mov cl,1
    mov dh,0
    mov dl,80h

    int 13h

    mov ax,7c0h
    push ax
    mov ax,0
    push ax
    retf
 
choice3:  cmp al,'3'                                '第三个子程序
    jne choice4
 
    call cls
    mov bh,7

showtimecon:  call show_time                           
    mov ah,0
    int 16h

    cmp ah,1h            ; key ESC
    je show_time_exit

    cmp ah,3bh           ; key F1
    jne showtimecon  

    inc bh
    jmp showtimecon
 
show_time_exit:   call cls
    jmp start1     

choice4:  cmp al,'4'                                 '第四个子程序set_time
    jne choice_other
    jmp set_time 

choice_other:   jmp start1

set_time: call getstr
       jmp start1


       
show_time:   jmp showtime_start                            '显示时间函数
   show_time_s1 db  9,8,7,4,2,0
showtime_start:    push ax
    ;push bx
     push cx
     push dx
     push ds
     push es
     push si
     push di
  
 show:  mov ax,cs
     mov ds,ax
     mov di,offset show_time_s1 - offset start1
   
     mov ax,0b800h
     mov es,ax
        mov si,12*160+10*2


     mov ax,0

     mov cx,6

  main_s:  mov dl,[di]
     call r_fun
     inc di

     mov byte ptr es:[si],ah
     mov byte ptr es:[si+1],bh
     mov byte ptr es:[si+2],al          
     mov byte ptr es:[si+3],bh

     add si,4
       
     cmp cx,4
     jna main_s1

     mov al,'/'
     mov es:[si], al
     mov es:[si+1],bh
     add si,2
     loop main_s

     jmp short main_s3

 main_s1:  cmp cx,4
     jb  main_s2

     add si,8
     loop main_s

     jmp short main_s3                 

 main_s2:  cmp cx,1
     je main_s3

     mov al,':'
     mov es:[si],al
     mov es:[si+1],bh

     add si,2 
     loop main_s

     jmp short main_s3

main_s3:   pop di
     pop si
     pop es
     pop ds
     pop dx
     pop cx
     ;pop bx
     pop ax
     ret         

  ; Read data from CMOS Ram              

   r_fun:  push bx
     push cx
     push dx
     push si

     mov al,dl
     out 70h,al
     in  al,71h

     mov ah,al
     mov cl,4
     shr ah,cl
     and al,00001111b

     add ah,30h
     add al,30h  
      
     pop  si
     pop  dx
     pop  cx
     pop  bx
     ret

  ;   Write data to CMOS Ram
 
w_time:    push ax
   push bx
   push cx
   push dx
   push ds
   push es
   push di
   push si

   mov bx,0b800h
   mov ds,bx
   mov si,160*12+10*2
    
   mov di,offset show_time_s1 - offset start1
   mov ax,cs
   mov es,ax

   mov cx,6
  w_loop: mov dl,es:[di]
   cmp byte ptr [si],'/'
   je w_loopcon
   cmp byte ptr [si],':'
   je w_loopcon

   sub si,2

   cmp cx,3                 
   jne w_loopcon

   add si,8

w_loopcon: add si,2
     
   mov bh,[si]
   mov bl,[si+2]
   call w_fun
    
   add si,4
   inc di
   loop w_loop

   pop si
   pop di
   pop es
   pop ds
   pop dx
   pop cx
   pop bx
   pop ax
   ret

w_fun:  push ax
    push bx
    push cx
    push dx
  
    sub bh,30h
    sub bl,30h

    mov al,bh
  
    mov cl,4
    shl al,cl
  
    and al,11110000b
    and bl,00001111b

    or al,bl
  
    mov dh,al

    mov al,dl                 ; transport ... CMOS address
    out 70h,al                ; write The CMOS address which will be visit to 70h
      
w_wait:   in al,71h 
    mov dl,al

    mov al,dh
    out 71h,al                ; dh deposit data which will be write to CMOS
    cmp dl,al
    jne w_wait

    pop  dx
    pop  cx
    pop  bx
    pop  ax
    ret
  
cls:    push ax                      '清屏函数
   push ds
   push si
   push cx

   mov ax,0b800h
   mov ds,ax
   mov si,0

   mov cx,80*25
cls_loop:    mov byte ptr [si],' '
   mov byte ptr [si+1],7             ;
   add si,2
   loop cls_loop
 
   pop cx
   pop si
   pop ds
   pop ax
   ret 

 getstr:  jmp getstrnext                                   '字符串堆栈
     stack db 50 dup(0)  
   
getstrnext:  mov bh,7
    call show_time

    push ax
    push si
    push dx
    push bx

    mov si,offset stack - offset start1
    mov ax,cs
    mov ds,ax

    mov dh,12
    mov dl,10

getstrs: mov ah,0
    int 16h
  
    cmp al,30h
    jb nochar
    cmp al,39h
    ja nochar
  
    mov ah,0
    call charstack
    mov ah,2
    call charstack
    jmp getstrs

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

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


enter:   push cx

   mov cx,1
   mov al,0
   mov ah,0
   call charstack
    
   mov cx,'@'
   mov ah,2
   call charstack
    
   call w_time
   call cls

   pop cx

   pop bx
   pop dx
   pop si
   pop ax
   ret

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

charstart: push bx
  push dx
  push di
  push es

  cmp ah,2
  ja charstackend
  mov bl,ah
  mov bh,0
  add bx,bx
  mov di,offset table -offset start1
  jmp word ptr [bx][di]

charstackend: jmp sret

charpush:  mov bx,top-1fh
  mov [si][bx],al
  inc top-1fh
  jmp sret

charpop:   cmp top-1fh,0
  je sret
  dec top-1fh
  mov bx,top-1fh
  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-1fh
  jne noempty
  ;mov byte ptr es:[di],' '
  jmp sret
 
noempty:  mov al,[si][bx]
  mov es:[di],al
   
  cmp byte ptr es:[di+2],'/'
  je charshownext
  cmp byte ptr es:[di+2],':'
  je charshownext
  ;cmp byte ptr es:[di+2],' '
  ;je charshownext
  
  sub di,2                 

  cmp cx,'@'
  jne charshownext
  mov byte ptr [si][bx],0
  mov byte ptr top-1fh,0                 
   
  charshownext: add di,2 
   
  mov byte ptr es:[di+2],' '
  inc bx
  cmp bx,0ch
  je sret
  cmp bx,6
  jne charshowcon
  add di,8

  charshowcon:  add di,2
  jmp charshows

   sret: pop es
  pop di
  pop dx
  pop bx
  ret

start2:   mov bx,offset start0             '代码拷贝
    mov ax,cs
    mov es,ax

    mov ah,3
    mov al,1
    mov ch,0
    mov cl,1
    mov dh,0
    mov dl,0h

    int 13h         
 
    mov bx,offset start1
    mov ax,cs
    mov es,ax

    mov ah,3
    mov al,4
    mov ch,0
    mov cl,2
    mov dh,0
    mov dl,0

    int 13h

    mov ax,4c00h
    int 21h
 code ends
end start2

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阅读下面的材料 : 开机后, CPU 自动进入到 FFF0:0 单元处执行,此处有一条跳转指令。 CPU 执行该指令后,转去执行 BIOS 中的硬件系统检测和初始化程序。 初始化程序将建立 BIOS 所支持的中断向量,即将 BIOS 提供的中断历程的入口地址登记在中断向量表中。 硬件系统检测和初始化完成后,调用 INT 19H 进行操作系统的引导。 如果设为从软盘启动操作系统,则 INT 19H 将主要完成一下工作: ( 1 )控制 0 号软驱,读取软盘 0 道 0 面 1 扇区的内容到 0 : 7C 00 。 ( 2 )将 CS:IP 指向 0 : 7C 00 。 软盘的 0 道 0 面 1 扇区中装有操作系统引导程序。 INT 19H 将其装到 0 : 7C 00 处后,设置 CPU 从 0 : 7C 00 开始执行此处的引导程序,操作系统被激活,控制计算机。 如果在 0 号软驱中没有软盘,或发生软盘 I/O 错误,则 INT 19H 将主要完成以下工作 ; (1) 读取硬盘 C 的 0 道 0 面 1 扇区的内容到 0 : 7C 00 ; (2) 将 CS:IP 指向 0 : 7C 00 。 这次课程设计的任务是编写一个可以自行启动计算机,不需要在现有操作系统环境中运行的程序。 改程序的功能如下: ( 1 )列出功能选项,让用户通过键盘进行选择,界面如下: 1 ) reset pc ; 重新启动计算机 2 ) Start system ; 引导现有的操作系统 3 ) Clock ; 进入时钟程序 4 ) Srt clock ; 设置时间 ( 2 )用户输入“ 1 ”后重新启动计算机。(提示:考虑 FFFF:0 ) ( 3 )用户输入“ 2 ” 后引导现有的操作系统。(提示:考虑硬盘 C 的 0 道 0 面 1 扇区) ( 4 )用户输入“ 3 ”后,执行动态现实当前日期,时间的程序。 现实格式如下:年 / 月 / 日 时:分:秒 进入此项功能后,一直动态现实当前的时间,在屏幕上将出现时间按秒变化的效果。(提示:循环读取 CMOS ) 当按下 F1 键后,改变现实颜色;按下 ESC 键后,返回到主选单。(提示:利用键盘中断) ( 5 )用户输入“ 4 ”后可更改当前的日期,时间,更改后返回到主选单。(提示:输入字符串) 下面给出的几点建议: ( 1 )在 DOS 下编写安装程序,在按转程序中包含任务程序; ( 2 )运行安装程序,将任务程序写到软盘上; ( 3 )若要任务程序可以在开机后自行执行,要将它写到软盘的 0 道 0 面 1 扇区上。如果程序长度大于 512B ,则需要用多个扇区存放,这种情况下,处于软盘 0 道 0 面 1 扇区中的程序就必须负责将其他扇区中的内容读入内存。 这个程序较为复杂,它用到了我们所学到的所有技术,需要进行仔细地分析和耐心地调试。这个程序对于我们的整个学习过程是具有总结性的,希望读者能够尽力完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值