YTU 汇编语言 实验七 端口和终端调用

任务:构造一个查询日期、时间的程序

编程序,显示如下菜单:

1. Show time(hh:mm:ss)  

2. Show Date(yy-mm-dd)

3. Du ... ...

0. Exit

Choose:

在选择1后显示时间,格式是:时:分:秒

在选择2后显示日期,格式是:年-月-日

在选择3后蜂鸣器响一声

在选择0后退出

直接调用中断完成输入输出,不采用直接写显存的方式。

提倡同学自行设计,构造友好的交互界面

【源程序】

先安装提前设置自编译的中断,源程序:

assume cs:code, ss:stack

stack segment stack

       db 16 dup (0)

stack ends

code segment

start:

       mov ax, stack

       mov ss, ax

       mov sp, 16

      ;(1)将自定义的7ch号中断的中断例程安装到0:200

       mov ax,cs

      mov ds,ax ;ds=cs

      mov ax,0

      mov es,ax ;es=0

      lea si,int7c ;si       ds:si

      mov di,200h ;di     es:di

      mov cx,offset int7c_end - offset int7c ;设置cx

      cld

      rep movsb

      ;(2)设置7ch号中断的中断向量表

      mov word ptr es:[7ch*4],200h

      mov word ptr es:[7ch*4+2],0

      mov ax,4c00h

      int 21h

      ;(3)自定义的7ch号中断的中断例程:蜂鸣器“哔”地一声

int7c:

       push ax

       push cs

       ;下面的程序已经完成,照抄应用即可,很快学到端口时将知道其机制

       mov al, 08h    ;设置声音的频率

       out 42h, al       

       out 42h, al  

       in al, 61h     ;读设备控制器端口原值

       mov ah, al     ;保存原值     

       or al, 3       ;打开扬声器和定时器

       out 61h, al    ;接通扬声器,发声

       mov cx, 60000  ;延时

delay:

       nop

       loop delay

       mov al, ah        

       out 61h, al

       pop cx

       pop ax

       iret

int7c_end:

      nop

code ends

end start

然后显示菜单,源程序:

assume      cs:code,ds:data,ss:stack

data        segment

    time    db  '00:00:00$'

    list1    db  9,8,7    

    list2    db  4,2,0

data       ends

stack segment

     db 100H dup (?)

stack ends

code  segment

start:

      jmp beg

 sta  db 10,13,'           1. Show time(hh:mm:ss)'

      db 10,13,'           2. Show Date(yy-mm-dd)'

      db 10,13,'           3. Du ... ...'

      db 10,13,'           0. Exit'

      db 10,13

      db 10,13,'   Choose:','$'

codetab dw sub1, sub2, sub3   

beg:

      push cs

      pop ds     ;设置数据段

disp0:

      lea dx,sta ;DS:DX=待输出字符的地址

      mov ah,9

      int 21h     ;调用21h中断的第9号功能,显示起始地址在DS:DX,以'$'结束的字符串

      mov ah,1

      int 21h     ;调用21h中断的第1号功能,从键盘读入字符,AL保存读入字符的ASCII码

      sub al, 30h  ;ASCII变数字

      cmp al, 0

      je exit

      mov bl, al     

      mov bh, 0    

      add bx, bx   

      sub bx, 2   

      call word ptr codetab[bx];调用子函数

      jmp disp0     

exit:

      mov ah,4ch

      int 21h

sub1: ;功能为显示时间,格式是:时:分:秒

push ax

push ds

push ss

push sp

push si

push di

push cx

push ax

       mov     ax,data

mov     ds,ax

mov     ax,stack

mov     ss,ax

mov     sp,256

mov ah,2;调用21号中断的2号功能,输出空格

mov dl,' '

int 21h

            mov     si,offset list2

            mov     di,offset time

            mov     cx,3

s1:      

    push    cx

            mov     al,[si]

            out     70h,al

            in      al,71h

            mov     ah,al

            mov     cl,4

            shr     al,cl

            and     ah,00001111b

            add     ax,3030h

            mov     [di],ax ;转移过来

            add     di,3

            inc     si

            pop     cx

            loop    s1

            mov     ah,9

            mov     dx,offset time

            int     21h          ;调用21h中断的第9号功能,显示起始地址在DS:DX,以'$'结束的字符串

pop ax

pop cx

pop di

pop si

pop sp

pop ss

pop ds

pop ax

             ret

sub2:;功能为显示日期,格式是:年-月-日

push ax

push ds

push ss

push sp

push si

push di

push cx

push ax

       mov     ax,data

mov     ds,ax

mov     ax,stack

mov     ss,ax

mov     sp,256

    mov ah,2;调用21号中断的2号功能,输出空格

mov dl,' '

int 21h

            mov     si,offset list1

            mov     di,offset time

            mov     cx,3

    s2:      

    push    cx

            mov     al,[si]

            out     70h,al

            in      al,71h

            mov     ah,al

            mov     cl,4

            shr     al,cl

            and     ah,00001111b

            add     ax,3030h

            mov     [di],ax

            add     di,3

            inc     si

            pop     cx

            loop    s2

            mov     ah,9

            mov     dx,offset time

            int     21h          ;调用21h中断的第9号功能,显示起始地址在DS:DX,以'$'结束的字符串

pop ax

pop cx

pop di

pop si

pop sp

pop ss

pop ds

pop ax

       ret

sub3:

       mov ax, stack

       mov ss, ax

       mov sp, 16

       int 7ch ;调用21h中断的第7c号功能,自己提前设置自编译,功能为蜂鸣器响一声

       ret

code  ends

end start

【运行结果】

  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值