. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->使用BIOS进行键盘输入和磁盘读写
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  写完程序2,好乱呀300多行代码,改了不下50次成功了,不行的哥们别放弃,坚持就是胜利  [待解决] 回复[ 2次 ]   点击[ 448次 ]  
youguiqing
[帖 主]   [ 发表时间:2011-04-11 14:58 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-12-03 21:13
data segment
        ;input data segment code here
data ends

stack segment
        ;input stack segment code here
stack ends

code segment
assume cs:code    ;自己写引导软盘
start:mov ax,cs    ;安装程序把从good开始的代码写入软盘 
      mov es,ax
      mov bx,offset good
      mov ax,0304h
      mov cx,0001h
      mov dx,0000h
      int 13h
      mov ax,4c00h
      int 21h
    org 7c00h  ;以下内容从内存地址7c00h开始编辑
   
    good: 
    mov ax,0   ;把软盘第二扇区开始的内容写入内存7e00h处
               ;这段代码正好一扇区512字节
    mov es,ax
    mov bx,7e00h
    mov ax,0203h
    mov cx,0002h
    mov dx,0000h
    int 13h
    mov ax,0
    push ax
    mov ax,7e00h
    push ax
    retf
    
   db 512-($-good) dup (0)  ;意思是512-从这里到标号good占多少字节后
                          ;等于多少就补上多少个0,使这段代码=512字节
    
    ha: mov bl,1
        call clis
        jmp kaisi
    menu  db '1) reset pc     '
         db '2) start system '
         db '3) clock        '
           db '4) change time  '  
         kaisi:
         mov ax,0
         mov ds,ax
         mov si,offset menu
         mov ax,0b800h
         mov es,ax
         mov di,160*5+40
         mov cx,4
     s:push cx
        mov cx,16
        s1:
         push [si]
         pop es:[di]
         mov es:1[di],bl
         inc si
         add di,2
         loop s1
         add di,160-32
         pop cx
         loop s
    jx:in al,60h
       cmp al,2
       je do1
       cmp al,3
       je do2
       cmp al,4
       je do3
       cmp al,5
       je do4
       jmp jx
       do4:
       call clis
       call change
       jmp ha
       do3:
       mov al,45h
       out 60h,al
       call clis
       call clock
       jmp ha
       do2:
       call harddisk
       do1: mov ax,0ffffh
         push ax
         mov ax,0
         push ax
         retf
  clis:
      push ax
      push cx
      push si
      push es
      
     mov ax,0b800h
      mov es,ax
      mov si,0
      mov cx,2000
   sb: mov byte ptr es:[si],' '
      mov byte ptr es:1[si],7
      add si,2
      loop sb
      pop es
      pop si
      pop cx
      pop ax
      ret
      change:
     push ax
     push bx
     push cx
     push si
     push di
     push ds
     push es
     
     jmp kaisi5
     table1 db 'nian:yue :ri  :si  :fen :miao:'
          
     bios db 9,8,7,4,2,0
         
         kaisi5:
         mov ax,0
         mov ds,ax
         mov di,160*8+50
         mov ax,0b800h
         mov es,ax
         mov si,0
         mov bx,0
         mov cx,6
         kaisi5lp:
         call kaisi6
         call zicenxu
         mov al,bios[bx]
         out 70h,al
         call zuanhuan
         out 71h,al
         inc bx
         add di,150
         loop kaisi5lp
         pop es
         pop ds
         pop di
         pop si
         pop cx
         pop bx
         pop ax
         ret
         
         kaisi6:
       push cx
         mov cx,5
         kaisi6lp:
         mov al,table1[si]
         mov es:[di],al
         mov byte ptr es:1[di],02h
         inc si
         add di,2
         loop kaisi6lp
         pop cx
         ret
         zuanhuan:
          push bx
          push cx
         mov bx,0
         mov ah,top1[bx]
         mov al,top1[bx+1]
         sub al,30h
         sub ah,30h
         mov cl,4
         shl ah,cl
         or al,ah
         pop cx
         pop bx
         
         ret
        
  zicenxu:push ax
        d2:mov ah,0
         int 16h
         cmp ah,0bh
         ja nozihu
         mov ah,0
         call zihu
         mov ah,2
         call zihu
         jmp d2
         nozihu:
         cmp ah,0eh
         je tuige
         cmp ah,1ch
         je huice
         jmp d2
         tuige:
         mov ah,1
         call zihu
         mov ah,2
         call zihu
         jmp d2
         huice:
         mov al,0
         mov ah,0
         call zihu
         mov ah,2
         call zihu
         mov top,0
         pop ax
         ret
          zihu:
         push bx
         push cx
         push dx
         push di
         push es
         
         jmp do
         table dw dopush,dopop,doxian
         top dw 0
         top1 db 0,0,0,0,0,0,0,0
         do:
         cmp ah,2
         ja doend
         mov bl,ah
         mov bh,0
         add bx,bx
         jmp word ptr table[bx]
         dopush:
         cmp top,1
         ja doend
         mov bx,top
         
         mov top1[bx],al
         inc top
         jmp doend
         dopop:
         cmp top,0
         je doend
         dec top
        ; mov bx,top
        ; mov al,[bx+si]
         jmp doend
         doxian:
         
         mov bx,0
         cmp top,0
         je xian1
         mov cx,top
        d1:mov al,top1[bx]
         mov es:[di],al
         mov byte ptr es:1[di],02h
         inc bx
         add di,2
         loop d1
         xian1:mov es:[di],' '
         doend:
         pop es
         pop di
         pop dx
         pop cx
         pop bx
         ret
  clock:
    push ax
    push bx
    
     mov bx,1
     
    xian:
    call nian
    in al,60h
    cmp al,3bh
    je f1
    cmp al,1
    je esc1
    jmp xian
    f1:
    mov ah,0
    int 16h
    inc bl
    mov al,16h
    out 60h,al
    call nian
     ;这句很重要,要不60h的值一直是F1使时间停住
    jmp xian
    esc1:
    pop bx
    pop ax
    ret
    
     nian: 
     push ax
     push cx
     push si
     push di
     push ds
     push es
 
    jmp nian2
    nian1 db 9,8,7,4,2,0,'/','/',' ',':',':',' '
    nian2:
    mov ax,0b800h
    mov es,ax
    mov di,160*8+60
    mov ax,0
    mov ds,ax
    mov si,offset nian1
    mov cx,6
    snian:
    mov al,[si]
    out 70h,al
    in al,71h
    mov ah,al
    push cx
    mov cl,4
    shr ah,cl
    pop cx
    and al,00001111b
    add ah,30h
    add al,30h
    mov es:[di],ah
    mov es:1[di],bl
    mov es:2[di],al
    mov es:3[di],bl
    push 6[si]
    pop es:4[di]
    mov es:5[di],bl
    inc si
    add di,6
    loop snian
    pop es
    pop ds
    pop di
    pop si
    pop cx
    pop ax
    ret
   harddisk:
    call copyhd
    mov ax,0
    push ax
    mov ax,7c00h
    push ax
    retf
    copyhd: 
    push ax
    push bx
    push cx
    push dx
    push es
    
    mov ax,0
    mov es,ax
    mov bx,7c00h
    mov ax,0201h
    mov cx,0001h
    mov dx,0080h
    int 13h
    pop es
    pop dx
    pop cx
    pop bx
    pop ax
    ret 
             
code ends
end start
jkf
[第1楼]   [ 回复时间:2011-06-02 23:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2011-03-22 09:59

太乱
给点注释呗
jkf
[第2楼]   [ 回复时间:2011-06-02 23:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2011-03-22 09:59

太乱
给点注释呗
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved