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

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新评论
最新留言
好友圈
文章收藏
友情链接

[2011-06-25 13:58] 课程设计二

图片载入中
assume cs:code

code segment

     s: jmp near ptr Uistart

        Pick0 db '1) Reset Pc',0        ;重启
        Pick1 db '2) Start system',0    ;开始引导的原有系统
        pick2 db '3) clock',0           ;查看时间
        pick3 db '4) set clock',0       ;设置时间

        help1 db 'Picking=1, 2, 3, 4, Up , Do                       Recognize=Enter',0
                 ;帮助信息

        Time db '00/00/00 00:00:00',0 
                      ;存放row中读取的本地时间 格式:年/月/日 时:分:秒 动态刷新

        
        tableA1 dw pick0,pick1,pick2,pick3,help1,Time
                  ;偏移地址表

        Array1 db 32,9,32,11,32,13,32,15,06,22
                  ;列行表

        color1 db 5 dup (6,0)
                  ;颜色表

        tableS1 db 2,3,4,5,48h,50h,1ch
                  ;1 2 3 4 up down enter 键的扫描码表

        tableP1 dw Countkx,Countkx,Countkx,Countkx,ControlUp,ControlDo,ControlEnter
                  ;按键子列程的偏移地址表

        tableE1 dw Enter1,Enter2,Enter3,Enter4
                  ;确认子列程偏移地址表

        topp1 dw 0 ;记录选项顶

        Port db 9,0,0,8,0,0,7,0,0,4,0,0,2,0,0,0,0         ;存放端口的地址

        colorT1 db 0             ;存放颜色参数

        tablek1 db 0bh,2,3,4,5,6,7,8,9,0ah,35h,27h,39h,1ch,0eh,1
                   ;0-9 / : 空格 回车 退格 esc 键的扫描码表

        topc dw 0

        tableA2 dw chark1,chark1,chark1,chark1,chark1,chark1,chark1,chark1,chark1,chark1,chark1,chark1,chark1,EnterM,backspace,Esc4
                   ;0-9 / : 空格 回车 退格 esc 键的扫描码 的处理程序地址


;--------------------------------------- 启动程序数据段-----------------------------------------

Uistart: call Pure

    ui0: push cs
         pop ds

         mov bx,0
         mov cx,5

   uis1: push cx

         mov si,tableA1[bx]
         mov dx,word ptr Array1[bx]
         mov cl,color1[bx]
         call show
         add bx,2

         pop cx
         loop uis1

;----------------------------------- 初始化启动程序界面 -------------------------------------------


   Exa0: mov ah,0
         int 16h

         mov bx,0
         mov cx,8

  Goon0: cmp tableS1[bx],ah
         je Pro0

         inc bx

         loop Goon0

         jmp short Exa0

;--------------------------------------- 判断按键 -----------------------------------------

   pro0: add bx,bx
         jmp word ptr tableP1[bx]

;---------------------------------------调用相应处理程序------------------------------------


  Countkx: push bx
           mov bx,topP1
           mov color1[bx],6
           pop bx
           mov color1[bx],0ah
           mov topP1,bx
           jmp short ui0

;---------------------------数值键的事件处理---------------------------

ControlUp: sub topP1,2
           cmp topP1,0fffeh
           je bugUp

           mov bx,topp1
           mov color1[bx+2],6
           mov color1[bx],0ah
           jmp near ptr Uistart

    bugup: mov color1[0],6
           mov color1[6],0ah
           mov topP1,6
           jmp near ptr ui0

;---------------------------- 控制键Up的事件处理----------------------------

ControlDo: add topP1,2
           cmp topP1,8 
           je bugDo

           mov bx,topP1
           mov color1[bx-2],6
           mov color1[bx],0ah
           jmp near ptr Uistart

    bugDo: mov color1[6],6
           mov color1[0],0ah
           mov topP1,0
           jmp near ptr ui0

;------------------------------- 控制键Do的事件处理------------------------------------


ControlEnter: mov bx,topp1
              jmp word ptr tableE1[bx]

;-------------------------------- Enter键的事件处理列表 ----------------------------------

      Enter1: mov ax,0ffffh
              push ax
              mov ax,0
              push ax
              retf

;--------------------------- 重启 ----------------------------------------

      Enter2: mov bx,0            
              mov es,bx
              mov bx,7c00h        ;存放磁盘数据的内存地址

              mov al,1            ;需要读取的扇区数
              mov ch,0            ;磁道号
              mov cl,1            ;扇区号
              mov dh,0            ;面
              mov dl,80h          ;驱动器号
              mov ah,2            ;2号子程序 功能:读
              int 13h             ;调用 13h中断列程

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

;------------------------------- 引导现有操作系统 -------------------------


      Enter3: call Pure

              mov colorT1,2                                     ;颜色计数器

       Stime: mov bx,0                                          ;循环6次从 coms ram 中读取时间信息写入内存time 段并调用show 显示
              mov cx,6

       Otime: push cx

              mov al,Port[bx]
              out 70h,al
              in al,71h

              mov ah,al
              mov cl,4
              shr ah,cl
              add ah,30h

              and al,00001111b
              add al,30h

              mov time[bx],ah
              mov time[bx+1],al
              add bx,3

              pop cx
              loop Otime

              push cs
              pop ds
              mov si,tableA1[10]

              mov cl,colorT1
              mov dl,32
              mov dh,13

              call show
              call wp

              in al,60h
   
              cmp al,3bh
              jne Cross

              inc colorT1

       Cross: cmp al,1h
              jne Stime

              jmp near ptr uistart

;-----------------------------------查看本地时间----------------------------------



      Enter4: call Pure                  ;清屏

       timeM: mov bx,0

              mov ah,0                   ;调用16h号中断的0号子程序 功能从键盘缓冲区读取一个键盘输入返回,如果键盘缓冲区没有数据则循环等待
              int 16h                    ;返回的结果ah 存放扫描码 al 存放ascii码

              mov cx,16

       Goon1: cmp ah,tablek1[bx]         ;用ah中的扫描码循环比较tablek1段中的扫描码等于则调用相应的处理程序
              je pr1
              
              inc bx

              loop goon1

              jmp short timeM

;--------------------------------------- 检测键位 ------------------------------------

         pr1: add bx,bx
              jmp word ptr tableA2[bx]    ;将比较结果tablek1中某个扫描码的偏移地址的1次幂得到相应tablep1段中处理程序的偏移地址

;----------------------------------------- 调用处理程序表中对应的处理程序 --------------------------------------------------

      chark1: cmp topc,16
              ja timeM

              mov si,topc                ;用 topc 一个内存字单元模拟sp使用来记录栈顶,每次按下键盘的数字键 topc 加1,按下backspace键topc 减1
              mov Time[si],al            ;将 al 中的ascii码送入内存 time 段中
              inc topc                   ;记录栈顶

;---------------------------------------------- 0-9 空格 / : 键的事件处理程序 ---------------------------------------

    charShow: mov di,0b800h
              mov es,di
              mov di,13*160+32*2         ;将按下的数字键的ascii码送入到显存

              mov bx,0

       shows: cmp bx,topc
              jne noemptr
              mov byte ptr es:[di],' '
              jmp short timeM

     noemptr: mov al,Time[bx]
              mov ah,2
              mov es:[di],ax
              mov byte ptr es:[di+2],' '
              inc bx
              add di,2
              jmp short shows

;-------------------------------------------- 显示增加或删除的字符 ------------------------------------------------------

      EnterM: cmp topc,0                          ;判断topc 字符记录栈顶的字符个数是否为0是则返回timeM
              je timeM

              mov bx,0                            ;否则循环6次把time中的ascii码,转换为bcd码后写入cmos ram 中
              mov cx,6

         bcd: push cx

              mov al,Port[bx]
              out 70h,al

              mov ah,time[bx]
              sub ah,30h
              mov cl,4
              shl ah,cl

              mov al,time[bx+1]
              sub al,30h
              add al,ah

              out 71h,al

              add bx,3

              pop cx
              loop bcd

              mov topc,0                                      ;程序返回之前将 topc 计数器清空否则下次进入会发生错误

              jmp near ptr uistart

;---------------------------------------- enterm 的事件处理 -------------------------------------

   backspace: cmp topc,0                  ;判断topc 字符记录栈顶的字符个数是否为0是则返回timeM
              je re1

              dec topc                    ;否则字符个数减1后跳转到 charshow 显示字符
              jmp short charShow

         re1: jmp near ptr timeM

;----------------------------Enter4 程序内的 backspace 的事件处理 ----------------

        esc4: jmp near ptr uistart

;----------------------------------------- esc4 返回主界面 ----------------------------------------


;----------------------------------- Enter4 修改本地时间 ---------------------------------- 



             

;----------------------------- 子列程show -------------------------------

 show: push ax
       push cx
       push dx
       push es
       push di
       push si

       mov di,0b800h          ;es:di指向显示的位置
       mov es,di
       mov ax,160
       mul dh
       mov dh,0
       add dx,dx
       add ax,dx
       mov di,ax

       mov al,cl

show0: mov cl,ds:[si]         ;ds:si传递过来的参数
       mov ch,0
       jcxz rets
       mov ch,al
       mov es:[di],cx
       add di,2
       inc si
       jmp short show0

 rets: pop si
       pop di
       pop es
       pop dx
       pop cx
       pop ax
       ret

;--------------------------------- 子列程Pure(作用清屏)---------------------------------

Pure: push ax
      push cx
      push ds
      push si
      ;压栈关联寄存器

      mov si,0b800h      ;初始化需要清屏的显存地址
      mov ds,si
      mov si,0

      mov al,' '         ;给ax寄存器赋空字符然后把它传送到显存达到清屏的效果
      mov ah,7
      mov cx,2000        ;ax为16为寄存器对应一个显存字单元所以 循环次数=25行*(160列/2)
   p: mov [si],ax        
      add si,2
      loop p

      pop si
      pop ds
      pop cx
      pop ax
      ret

;------------------------------------ wp 功能延时 ----------------------------------
 wp: push ax
     push dx

     mov dx,400h
     mov ax,0

dts: sub ax,1
     sbb dx,0

     cmp ax,0
     jne dts

     cmp dx,0
     jne dts

     pop dx
     pop ax
     ret

 endSP: nop


    Bst: mov bx,7e0h
         mov es,bx
         mov bx,0

         mov ax,offset endSp - offset s
         mov dx,0
         mov cx,512
         div cx

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

         mov ah,2
         int 13h

         mov ax,7e0h
         push ax
         mov ax,0
         push ax
         retf


;--------------------------------------------- 启动程序结束 -----------------------------------------

    
  Intro0 db '  Everyone likes me to call to allow Bin, just contact compilation',0
  Intro1 db 'the language selected teacher WangShuang to edit collected materials',0
  Intro2 db 'language this book the very good logical arrangement was clear from',0
  Intro3 db 'shallow go into deeply followed the sequence and advanced gradually',0
  Intro4 db 'the boring and dull and monotonous style of traditional teaching material',0
  Intro5 db 'that the vivid interest breaks, it is a requiredteaching material to is a',0
  Intro6 db 'raw recruit this.We really appreciate here the confidencethat Wang Shuang.',0
  Intro7 db 'Lao gives me study to edit collected materials language. My QQ:172605328',0
  Intro8 db 'welcome everyone swap compilation the language progress together.',0
            ;安装界面显示的介绍信息

   Hint0 db 'Please select validation or cancel(Enter/Esc)',0
            ;安装界面显示的确认或取消选项提示信息

   Hint1 db 'This procedure will write to lead procedure in your soft pan',0
   Hint2 db 'ma yoveraly your data to invite circumspect to look for!(Y / N)',0
            ;警告信息

   Hint3 db 'Whether exit to install procedure!(Y/ N)',0
            ;退出信息

   Hint4 db 'Write to lead procedure completion to please to press the Enter return!',0
            ;完成提示信息

   Array0 db 3,4,3,5,3,6,3,7,3,8,3,9,3,10,3,11,3,12,18,22
             ;安装程序列行表
   
   tableA0 dw Intro0,Intro1,Intro2,Intro3,Intro4,Intro5,Intro6,Intro7,Intro8,Hint0,Hint1,Hint2
             ;介绍信息和确认或取消选项和提示信息的偏移地址表


     start: call Pure

            push cs
            pop ds

            mov bx,0
            mov cx,10

       uiS: push cx

            mov si,tableA0[bx]
            mov dx,word ptr Array0[bx]
            mov cl,2
            
            call show
            add bx,2

            pop cx
            loop uis

;----------------------------------------- 安装界面自序信息及提示 ----------------------------------

  JudgeI: in al,60h                    ;循环检测键盘端口60h 调用相应程序响应事件

          cmp al,1ch
          je EnterI

          cmp al,1h
          je EscI

          jmp short JudgeI

;----------------------------------------- 判断按键 -----------------------------

EnterI: call pure

        push cs
        pop ds
        mov si,tableA0[14h]
 
        mov dh,12
        mov dl,10
        
        mov cx,2

enters: push cx

        mov cl,4
        call show
        add dh,2
        mov si,tableA0[16h]

        pop cx
        loop enters

        ; ----显示一条警告信息

 exm1: in al,60h

       cmp al,15h
       je keyy0

       cmp al,31h
       je keyy

       jmp short exm1

keyy0: call pure

       push cs
       pop es
       mov bx,offset bst

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

       mov ah,3
       int 13h

       mov bx,offset s

       mov ax,offset endsP-offset s
       mov dx,0
       mov cx,512
       div cx

       inc al
       mov ch,0
       mov cl,2
       mov dh,0
       mov dl,0
 
       mov ah,3
       int 13h
       
       push cs
       pop ds
       mov si,offset Hint4

       mov cl,2
       mov dh,12
       mov dl,5
       call show
       
   x1: in al,60h

       cmp al,1ch
       je keyy1

       jmp short x1
 
;------------------------------------------ enter 键的事件处理 ------------------------------

 escI: call pure

       push cs
       pop ds
       mov si,offset Hint3

       mov dl,20
       mov dh,13
       mov cl,2
       call show

 exm0: in al,60h

       cmp al,15h
       je keyy1

       cmp al,31h
       je keyy

       jmp short  exm0

 keyy: jmp near ptr start

keyy1: call pure

;------------------------------------------------ esc 键事件处理 ----------------------------------------------------------

       mov ax,4c00h
       int 21h 

;----------------------------------------------- 安装程序返回 --------------------------------------------------

code ends
end start
评论次数(0)  |  浏览次数(637)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码