汇编网首页登录博客注册
zhenglxd的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  浮躁10次=fool 浮躁20次=fathead 浮躁30次=stupid 浮躁40次=pig
  • 『姓名』:small liu
  • 『性别』:男『发送消息
  • 个人说明:我现在浮躁 指数4
  • 详细信息『加为好友』
学习动态
友情链接

[2009-07-13 17:03] 终于圆满了~课程设计二搞定!

图片载入中
;花了8天60+小时,中间的曲折和艰辛实在是。。。不过还好我挺过来了,一直一直没有放弃,我坚信付出总会有回报的!
assume cs:code
code segment

start:mov ax,cs
      mov es,ax
      mov bx,offset write_floppy
      mov ah,3                      ;write
      mov al,1                      ;total sector
      mov ch,0                      ;track number
      mov cl,1                      ;sector number
      mov dh,0                      ;side number
      mov dl,0                      ;floppy number
      int 13h  
;引导程序写入0面0道1扇区

      mov bx,offset int7ch_start2
      mov ah,3                      ;write
      mov al,4                      ;total sector
      mov ch,0                      ;track number
      mov cl,2                      ;sector number
      mov dh,0                      ;side number
      mov dl,0                      ;floppy number
      int 13h  
;int 7ch安装程序写入0面0道2~8扇区
      
      mov ax,4c00h
      int 21h

write_floppy:
       mov ax,0
       mov es,ax           
       mov bx,7e00H
       mov ah,2                      ;read
       mov al,4                      ;total sector
       mov ch,0                      ;track number
       mov cl,2                      ;sector number
       mov dh,0                      ;side number
       mov dl,0                      ;floppy number
       int 13h
       mov bx,offset int7ch_start
       push bx
       ret
       
;floppy引导调用int 7ch来完成课程设计2
org 7e00h
int7ch_start2:
choose:db '1) reset pc     '
       db '2) start system '
       db '3) clock        '
       db '4) set clock    '
       db 'please enter number (1-4): ',0  
 
char_stack:
       db 32 dup(0)

cmos_date_sep:
       db ' ',':',':',' ','/','/'
cmos_date_address:
       db 0,2,4,7,8,9                  ;从cmos读取数据的地址
CMOS_range:
       db '9','1','3','2','6','6'             ;Y\M\D\h\m\s range
CMOS_range2:
       db '9','2','1','4','0','0'
CMOS_temp:
       db 0,0
CMOS_temp2:
       db 16 dup (0)
set_time:
       db 'Set year:       '
       db 'Set month:      '
       db 'Set day:        '
       db 'Set hour:       '
       db 'Set minute:     '
       db 'Set second:     '
       db 'save or not?Y/N:'

process_table:
       dw offset choose1
       dw offset choose2
       dw offset choose3
       dw offset choose4
        
temp_stack:
       db 128 dup (0)

int9_old_addr:
       dw 2 dup(0)

int7ch_start:
       mov bx,cs
       mov ss,bx
       mov sp,7c00h
         
run_clear_screen:
       call clear_screen             
show_choose: 
       mov ax,0b800h
       mov es,ax
       mov ax,cs
       mov ds,ax
       mov si,offset choose
       mov di,11*160+33*2
       cld
       mov cx,4
  sc_0:push cx
       mov cx,16
  sc_1:movsb
       mov byte ptr es:[di],4   ;red colour
       inc di
       loop sc_1
       add di,1*128             ;newline
       pop cx
       loop sc_0

       mov bx,2                 ;bh=0,bl=2(colour=green)
       mov di,23*160
       call showstr             ;show "please entry number:"       
;列出功能选项和请求输入

       mov si,offset char_stack
       mov bx,7                 ;默认前后景
       call char_stk_clr

  digital1_4:mov ah,0           ;only input digit 1-4
             sti
             int 16h                
             cmp al,'1'
             jb digital1_4
             cmp al,'4'
             ja digital1_4
             mov cs:[si],al          
             call showstr
  input_over:mov ah,0            ;only input enter or backspace
             int 16h
             cmp ah,1cH               
             je enter               
             cmp ah,0eH
             je backspace
             jmp input_over
;允许显示输入的字符窜1~4,输入的量为1个

   backspace:push bx
             mov bh,1
             call showstr
             pop bx
             mov byte ptr ss:[si],0
             dec si     
             jmp digital1_4

       enter:mov bx,offset char_stack
             mov al,cs:[bx]
             sub al,49
             shl al,1
             mov bl,al
             mov bh,0
             add bx,offset process_table
             jmp word ptr cs:[bx]
             
char_stk_clr:push cx
             push bx
             mov cx,32
             mov bx,offset char_stack
       lpclr:mov byte ptr cs:[bx],0
             inc bx
             loop lpclr
             pop bx
             pop cx
             ret

clear_screen:push bx
             push es
             push cx
             mov bx,0b800H
             mov es,bx
             mov bx,0
             mov cx,2000
  show_blank:mov byte ptr es:[bx],' '
             add bx,2
             loop show_blank 
             pop cx
             pop es
             pop bx
             ret   
  
showstr:push ds
        push es
                
        push si
        mov si,ss
        mov ds,si                     ;ds=ss
        mov si,0b800h
        mov es,si                     ;es=0b800H
        pop si
        cmp bh,1
        je subshowstr
        cld
    lps:cmp byte ptr ds:[si],0
        je over
        movsb
        mov byte ptr es:[di],bl
        inc di
        jmp lps

subshowstr:dec di
           dec di
           mov word ptr es:[di],' '
       
over:   pop es
        pop ds
        ret
;showstr作用:显示字符,必要参数si=源地址址,di=目标地址
;                      默认参数 ds=ss,es=0b800h
;                      可选参数 bx, bl=颜色,bh=1为启动subshowstr

choose1:mov ax,0FFFFH
        push ax
        mov ax,0
        push ax
        retf
;reset pc

choose2:mov ax,0
        push ax
        mov es,ax             
        mov bx,7c00H
        push bx

        mov ah,2                      ;read
        mov al,1                      ;total sector
        mov ch,0                      ;track number
        mov cl,1                      ;sector number
        mov dh,0                      ;side number
        mov dl,80H                    ;Hard disk number(c:)
        int 13h 
        retf
;start system
;读硬盘c0面0道1扇区入0:7c00H,后加载操作系统

choose3:     push ax
             push bx
             mov ax,cs:[9*4]          ;int9 old entry ip addr
             mov bx,offset int9_old_addr
             mov cs:[bx],ax            
             mov ax,cs:[9*4+2]        ;int9 old entry seg addr
             mov cs:[bx+2],ax
             mov word ptr cs:[9*4],offset int9_start
             mov word ptr cs:[9*4+2],0
;write int9 new entry ip and seg address

             pop bx
             pop ax
             jmp choose3_start
             
  int9_start:push si
             push ax
             in al,60h
             mov si,offset int9_old_addr
             pushf
             call dword ptr cs:[si] 
             cmp al,01
             je Esc_key
             cmp al,3bH
             je F1_key

    int9_ret:pop ax
             pop si
             iret
              
     Esc_key:mov ax,0
             mov es,ax
             mov bx,offset int9_old_addr
             mov ax,cs:[bx]
             mov es:[9*4],ax
             mov bx,cs:[bx+2]
             mov es:[9*4+2],bx              ;原来int9地址还原程序
             pop ax
             pop si
             pop ax 
             pop ax
;clear invalid data
      
             mov ax,cs 
             push ax
             mov ax,offset run_clear_screen
             push ax
             iret
;return initial interface

      F1_key:inc bh
             jmp int9_ret

choose3_start:      
      call clear_screen
      mov cx,0b800H
      mov es,cx
      mov bh,7            ;default colour
cycle:mov si,0
      mov cx,6
      mov di,offset cmos_date_address
show_date:      
      mov al,cs:[di+5]
      mov bl,cs:[di-1]    ;bl=sep ASCII
      call in_CMOS

      mov es:[si+12*160+34*2],ah
      add si,2
      mov es:[si+12*160+34*2],al
      add si,2
      mov es:[si+12*160+34*2],bl
      add si,2
      dec di
      loop show_date
      mov si,0
      mov cx,18
color:mov es:[si+12*160+34*2+1],bh
      add si,2
      loop color
      jmp cycle

in_CMOS:
      out 70H,al          ;写入要访问的字节单元
      in al,71h           
      mov ah,al   
      push cx
      mov cl,4
      shr ah,cl           ;十位数 ASCII
      add ah,30H
      and al,00001111b    ;个位数 ASCII  
      add al,30H
      pop cx 
      ret
;按al地址读取CMOS中数据并且ah=十位数 ASCII al=个位数 ASCII

choose4:
        mov bl,7                        ;colour  
        mov bh,0                        ;parameter of CMOS
        mov di,0
        mov si,offset set_time
        mov cx,cs
        mov ds,cx        
        mov cx,0b800H
        mov es,cx 
        call clear_screen
        mov cx,6  
     
 CMOS_0:push cx 
        push bx                         ;number range         
        mov cx,16               
 CMOS_1:movsb
        mov byte ptr es:[di],2          ;colour
        inc di
        loop CMOS_1  
        push si                  
        push di
        call char_stk_clr               ;清空字符栈
        mov si,offset char_stack        ;每次输入字符从字符栈0地址开始
        call get_date
        pop di
        add di,128                      ;newline
        pop si  
        pop bx
        inc bh
        pop cx                          
        loop CMOS_0
       
        mov cx,16               
 CMOS_2:movsb
        mov byte ptr es:[di],4                   ;colour=red
        inc di
        loop CMOS_2 
        call char_stk_clr               ;清空字符栈
        mov si,offset char_stack

 CMOS_3:mov ah,0
        int 16h
        cmp al,'y'
        je end_dig
        cmp al,'Y'
        je end_dig
        cmp al,'N'
        je end_dig
        cmp al,'n'
        je end_dig
        jmp CMOS_3     
     
     get_date:mov al,bh
              mov ah,0
              push bx
              mov bx,offset CMOS_temp                
              mov cs:[bx],ax  
              pop bx      
              push si
              mov si,offset CMOS_range
              add si,ax
              mov bh,cs:[si]               ;bh=function number
              mov dh,cs:[si+6]             ;dh=maximum value of top digit
              pop si

   tens_place:call get_input2       
              cmp al,'0'
              je less_than_10           
              jb tens_place
              cmp al,bh
              ja tens_place

              mov cs:[si],al               ;if tens digit's not zero and in the range of valid entry  
              call showstr                 
 high_than_10:cmp al,bh
              jb get_0_9                   ;所有个位数允许0~9的批处理掉

       ret_t: call get_input2
              cmp al,'0'
              jb ret_t
              cmp al,dh
              ja ret_t
              jmp end_dig

get_0_9:call get_input2
        cmp al,'0'
        jb get_0_9
        cmp al,'9'
        ja get_0_9
        jmp end_dig

end_dig:mov cs:[si],al
        call showstr
        push bx
        mov bx,2                     ;get_input2's parameter
        call get_input2  ;收尾
;第二个数字送入显存,跳转到收尾程序
jump_tens_place:jmp tens_place
 less_than_10:mov cs:[si],al          
              call showstr
less_than_10b:call get_input2
              cmp bh,'1'
              je above1
              cmp bh,'3'
              je above1       
              cmp al,'0'
              jb less_than_10b
              jmp above0
       above1:cmp al,'1'
              jb less_than_10b
       above0:cmp al,'9'
              ja less_than_10b
              jmp end_dig
;小于十的量,如果是月和日必须大于1,其他必须大于0
 
 get_input2:
              mov ah,0
              int 16h
              cmp ah,1cH               
              je key_key 
              cmp ah,0eH
              je key_key   
              cmp bx,2
              je get_input2          
              ret
      key_key:add sp,2
              cmp bx,2
              jne nor1
              pop bx
         nor1:cmp ah,1cH               
              je enter_key 
              cmp ah,0eH
              je backspace_key
;功能检测到enter和backspace键输入作出相应跳转,          
;如果bx=2,则作为收尾程序
          
backspace_key:
          cmp si,offset char_stack
          je jump_tens_place
          cmp si,offset char_stack+1
          je CMOS_one   
          push bx
          mov bx,offset char_stack          
          mov bl,cs:[bx]
          cmp bl,'0'
          mov al,bl
          pop bx
          je del_less_than_10
          call backspace_2
          jmp high_than_10

CMOS_one: mov al,cs:[si-1]
          cmp al,'9'
          jna del_tens_place
  CMOS_bk:call backspace_2
          jmp CMOS_3

del_tens_place:
          call backspace_2
          jmp tens_place    
      
   backspace_2:
          push bx
          mov bh,1
          call showstr
          pop bx
          mov byte ptr cs:[si],0
          dec si
          ret

del_less_than_10:
          call backspace_2
          jmp less_than_10b
        
enter_key:
       cmp si,offset char_stack 
       je no_change
       mov al,cs:[si-1]
       cmp al,'9'
       ja CMOS_K 
       cmp si,offset char_stack+1
       je del_tens_place
       
       mov bx,offset char_stack
       mov bx,cs:[bx]
       sub bl,30H
       sub bh,30H
       mov al,bl
       mov cx,4
       shl al,cl
       or al,bh
       mov bx,offset CMOS_temp
       mov si,cs:[bx]
       mov cs:[bx+si+2],al
       ret

CMOS_K:cmp al,'y'
       je CMOS_set_yes
       cmp al,'Y'
       je CMOS_set_yes
       jmp choose4       
CMOS_set_yes:
       mov bx,offset CMOS_temp2
       mov cx,6
       mov si,offset cmos_date_address+5
CMOS_X:
       mov al,cs:[si]
       out 70h,al
       mov al,cs:[bx]
       out 71h,al
       inc bx
       dec si
       loop CMOS_X       
       jmp run_clear_screen
     
no_change:
      mov bx,offset CMOS_temp
      mov bx,cs:[bx]
      push bx
      mov ax,bx    
      mov bx,offset cmos_date_address+5
      sub bx,ax
      mov al,cs:[bx]
      out 70H,al 
      in al,71h   
      pop si
      mov bx,offset CMOS_temp2
      mov cs:[bx+si],al
      mov ah,al   
      push cx
      mov cl,4
      shr ah,cl           ;十位数 ASCII
      add ah,30H
      and al,00001111b    ;个位数 ASCII  
      add al,30H
      pop cx 
      mov es:[di],ah
      add di,2
      mov es:[di],al
      add di,2      
      ret

int7ch_end:nop
code ends
end start
评论次数(2)  |  浏览次数(1681)  |  类型(汇编作业) |  收藏此文  | 

[  游客   发表于  2009-07-14 13:39  ]

花了8天60+小时,中间的曲折和艰辛实在是。。。不过还好我挺过来了,一直一直没有放弃,我坚信付出总会有回报的! 
==================
太厉害了!!佩服。

[  springaccount   发表于  2011-03-31 20:25  ]

请问下我虚拟机安装完毕后怎么还不行调试哦 能否请大虾给个完整的调试过程呢 谢拉

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码