. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->使用BIOS进行键盘输入和磁盘读写
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  基本上完成(课程设计2)。。。  [待解决] 回复[ 1次 ]   点击[ 365次 ]  
liangdezhi
[帖 主]   [ 发表时间:2010-07-09 23:42 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-02-10 14:31
assume cs:code
stack segment
 db 128 dup (0)
stack ends
code segment
   start:   mov ax,cs
            mov es,ax
            mov bx,offset string

            mov al,2
            mov ch,0
            mov cl,1
            mov dl,0
            mov dh,0

            mov ah,3
            int 13h
            mov ax,4c00h
            int 21h
   org 7c00h

    string:  jmp short begin
      str1 db 'welcome to masm!',0
      str2 db '/','/',' ',':',':',0
      str3 db 9,8,7,4,2,0
      
      str4 db '1) reset pc',0
      str5 db '2) start system',0
      str6 db '3) clock',0
      str7 db '4) set clock',0
      str dw str1,str2,str3,str4,str5,str6,str7
      save dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0
    begin:  mov ax,0b800h
            mov es,ax
            mov bx,0
            mov cx,2000
         sss_cls:
            mov byte ptr es:[bx],' '
            add bx,2
            loop sss_cls
            
            mov ah,2
            mov bh,0
            mov dh,10
            mov dl,0
            int 10h
            mov save[0],offset begin
            mov save[2],cs

            mov ax,0b800h
            mov ds,ax
            mov bx,0
            mov si,0
            mov di,0
            mov bp,0
            mov dx,0
            mov cx,0
            mov ax,0
            mov es,ax


    s_show: mov bx,str[6+bp]
            mov al,cs:[bx+si]
            cmp al,0
            je end_str
            mov ds:[di],al
            mov byte ptr ds:[di+1],2
            inc si
            add di,2
            jmp short s_show
   end_str: add di,160
            add bp,2
            add si,si
            sub di,si
            sub si,si
            inc dx
            cmp dx,4
            jne s_show

   getstr:  push ax
  getstrs:  mov ah,0
            int 16h

            cmp ah,5
            ja getstrs
            call shell
           
            jmp short getstrs

   shell:   jmp short system
      table dw reset_pc,start_system,clock,set_cls  ;这里跳转不到set_cls郁闷怎么解决..
      save1 db 0,0,0,0,0,0,0,0,0,0,0,0,0
   system:  sub ah,2
            mov bl,ah
            sub bh,bh
            add bx,bx
            jmp word ptr table[bx]

    reset_pc: mov ax,0ffffh
              push ax
              mov ax,0
              push ax
              retf
            
    start_system: push ax

     reads: mov ah,0
            int 16h
            cmp al,20h
            jb no_char
            mov ah,0
            call charstack
            mov ah,2
            mov dh,7
            mov dl,0
            call charstack
            jmp reads

   no_char: cmp ah,1ch
            jne reads
            mov ah,3
            call charstack
            pop ax
            ret

   charstack:  jmp short charstart
      tab1 dw charpush,charpop,charshow,char_xie
      top dw 0
 charstart: push bx
            push dx
            push di
            push es

   
            mov bl,ah
            mov bh,0
            add bx,bx
            jmp word ptr tab1[bx]

   charpush:mov bx,top
            mov byte ptr save1[bx],al
            inc top
            jmp sret
 charpop:  

 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,save1[bx]
            mov es:[di],al
            mov byte ptr es:[di+2],' '
            inc bx
                add di,2
            jmp charshows

 char_xie:  mov bx,0
            mov dl,save1[bx]
            mov dh,save1[bx+1]
          
            sub dl,30h
            sub dh,30h
            mov cl,4
            shl dh,cl
            or dh,dl

            mov al,9
            out 70h,al
            mov al,dh
            out 71h,al

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

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

            add ah,30h
            add al,30h
            mov bx,0b800h
            mov es,bx
            mov byte ptr es:[12*160],al
            mov byte ptr es:[12*160+2],ah

      sret:pop es
            pop di
            pop dx
            pop bx
            ret
       

    clock: ; mov save[0],offset string
           ; mov save[2],cs

            mov ax,0b800h
            mov es,ax
            mov bx,0
            mov cx,2000
     s_cls: mov byte ptr es:[bx],' '
            add bx,2
            loop s_cls

   a_int9:
            mov ax,cs
            mov ds,ax

            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
            mov ax,0
            mov es,ax
            mov bx,7c00h+200h

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

            jmp short capital

      int9: push ax
            push bx
            push cx
            push es

            in al,60h

            pushf
            call dword ptr cs:[200h]

            cmp al,3bh
            je red1
            cmp al,1
            je esc1
            jmp short int9ret
    esc1:  ; push save[2]
           ; push save[0]
           ; retf

             pop es
             pop cx
             pop bx
             pop ax

             push bp
             mov bp,sp
             push save[2]
             pop ax
             mov ss:[bp],ax
             push save[0]
             pop ax
             mov ss:[bp+2],ax
             pop bp
             iret
     red1:
            mov ax,0b800h
            mov es,ax
            mov bx,1
            mov cx,28
      s:    inc byte ptr es:[bx+160*10]
            add bx,2
           ; cmp bx,2001
            loop s
    
    int9ret:pop es
            pop cx
            pop bx
            pop ax
            iret
  int9end:  nop

   capital:       
            mov ax,0b800h
            mov ds,ax
            mov bx,str
            mov si,0
            mov di,160*10
    s_date:                    
            mov al,str3[si]
            out 70h,al
            in al,71h
            mov ah,al
            mov cl,4
            shr ah,cl
            and al,00001111b
            add ah,30h
            add al,30h
            mov ds:[di],ah
            mov ds:[di+2],al
            mov al,str2[si]
            mov ds:[di+4],al
            add di,6
            inc si
            cmp si,6
            jne s_date
            
            jmp short capital

   set_cls: mov ax,0b800h
            mov es,ax
            mov bx,0
            mov cx,2000

   ss1_cls: mov byte ptr es:[bx],' '
           add bx,2
           loop ss1_cls
           ret

code ends
end start
liangdezhi
[第1楼]   [ 回复时间:2010-07-09 23:44 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-02-10 14:31
乱七八糟的,,就是引导系统,不知道怎么引导,郁闷。。。。好多短位移 位移不到 郁闷。。不知道怎么解决。。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved