程序说明:
本程序是一个用汇编编的精致的图形时钟,运行时双击clock图标即可,
钟表显示的时间为本机系统的时间。
按b键可扩大画面 ;按s键可缩小画面;按c键可改变颜色;按e键可听音乐;
按q键退出本程序.

流程图:

程序源代码:
sound.asm

            EXTRN GENSOUND:FAR
PUBLIC   MUSIC
STACK    SEGMENT PARA STACK 'STACK'DB 64 DUP ('STACK')
STACK    ENDS
DATA     SEGMENT PARA 'DATA'
MUS_FREQ DW  330, 294, 262, 294, 3 DUP (330)DW  3 DUP (294), 330,392,392DW  330, 294, 262, 294, 4 DUP (330)DW  293, 294, 330, 294, 262,-1
MUS_TIME DW  6 DUP (25*8), 50*8DW  2 DUP (25*8, 25*8, 50*8)DW  12 DUP (25*8), 100*8
DATA     ENDS
CODE     SEGMENT PARA 'CODE'ASSUME CS: CODE, SS: STACKASSUME DS: DATA
MUSIC    PROC  FARPUSH  DSPUSH  DXPUSH  CXPUSH  BXPUSH  AXMOV   AX, DATAMOV   DS, AXLEA   SI, MUS_FREQLEA   BP, DS: MUS_TIME
FREQ:    MOV   DI, [SI]CMP   DI, -1JE    END_MUSMOV   BX, DS: [BP]CALL  GENSOUNDADD   SI, 2ADD   BP, 2JMP   FREQ
END_MUS:POP AXPOP BXPOP CXPOP DXPOP DSRET
MUSIC    ENDP
CODE     ENDSEND 

music.asm

PUBLIC  GENSOUND
CODE    SEGMENT PARA 'CODE'ASSUME CS: CODE
GENSOUND   PROC  FARPUSH  AXPUSH  BXPUSH  CXPUSH  DXPUSH  DIMOV   AL, 0B6HOUT   43H, ALMOV   DX, 12HMOV   AX, 533H*896DIV   DIOUT   42H, ALMOV   AL, AHOUT   42H, ALIN    AL, 61HOR    AL,  3OUT   61H,  AL
WAIT1:     MOV   CX, 8FF0H
DELAY:     LOOP  DELAYDEC   BXJNZ   WAIT1MOV   AL, AHOUT   61H, ALPOP   DIPOP   DXPOP   CXPOP   BXPOP   AXRET
GENSOUND   ENDP
CODE       ENDSEND

clock.asm

extrn music:far,gensound:far
;******************************************************
;* 堆栈段
.286;******************************************************
STACK_SEG     SEGMENT   STACKSTACK_BUF DW        120 DUP(?)TOP       EQU       $-STACK_BUF
STACK_SEG     ENDS
;******************************************************
;* 数据段
;******************************************************
DATA_SEG      SEGMENT   PARA
;------------------------------------------------------
; TODO: 数据的定义及存储器的分配
ts1           DB        0
quitbuf       DB        'welcome you to run this programme.                                       '
quitbuf2      DB        'C: change color;  B:extend the colck;  S:reduce the clock                '
quitbuf3      DB        'press e to sound; Press q to quit !                                      '
sigle         DB        80h
absx          DW        0
absy          DW        0
sut           DW        0
erroybz       DB        0
r0            DW        90
x0            DW        320
y0            DW        245                                                                                                                                                                          count0        db    0
count_hour    DB        11
count_minute  DB        11
yuanxinx      DW        0
yuanxiny      DW        0                           s             DB        0
s2            DB        0
s3            DB        0
hour          DW        0
hour2         DW        0
minute        DW        0
minute2       DW        0
second        DB        0
second2       DB        0
sin_x         DW        0
sin_xx        DW        0
x             DW        0
y             DW        0
x1            DW        0xminy         DW        0
yminx         DW        0
xmax          DW        0
ymax          DW        0
ymin          DW        0
xmin          DW        0
sjx_xminy     DW        0
sjx_yminx     DW        0
sjx_xmax      DW        0
sjx_ymax      DW        0
sjx_ymin      DW        0
sjx_xmin      DW        0
yuanx         DW        0
yuany         DW        0
y1            DW        0
x2            DW        0
y2            DW        0
x3            DW        0
y3            DW        0
DIancolor     DB        0
color         DB        2
color_hour    DB        2
color_min     DB        6
color_second  DB        9
color4        DB        10
color5        DB        11
color6        DB        12
backgroundcolor DB      1
page1         DB        0
y2y1          DW        0
x2x1          DW        0
sjx_y2y1      DW        0
sjx_x2x1      DW        0                                                                                         ;------------------------------------------------------DATA_SEG      ENDS
;******************************************************
;* 代码段
;******************************************************
CODE_SEG      SEGMENT   PARA
;------------------------------------------------------
MAIN          PROC      FARASSUME    CS:CODE_SEG,DS:DATA_SEGASSUME    SS:STACK_SEG
START:MOV       AX,STACK_SEGMOV       SS,AXMOV       SP,TOPMOV       AX,DATA_SEGMOV       DS,AX
;------------------------------------------------------
; TODO: 从这里开始您的代码
;------------------------------------------------------beg:         MOV       AX,0012hINT       10hMOV       DX,0010hCALL      b1002LEA       BP,quitbufCALL      msgMOV       DX,010ahLEA       BP,quitbuf2CALL      msgMOV       DX,020ahLEA       BP,quitbuf3CALL      msgbeg2:        CALL      skinCALL      skin2CALL      skin3CALL      CLkMOV       second,DHMOV       second2,DHMOV       count_minute,11CALL      minute_linXOR       DX,DX              MOV       AX,minute2MOV       CX,12DIV       CXMOV       CX,AX                 ;minurte2/12POP       AXADD       AX,CXMOV       hour2,AXMOV       count_hour,11            CALL      hour_lin              CALL      CLkMOV       DL,DHCALL      bcd2XOR       AH,AHMOV       CL,12DIV       CLMOV       count_minute,AH            ;second%12初始值DEC       count_minuteXOR       DX,DXMOV       AX,minute2MOV       CX,12DIV       CX                        ;minurte2%12MOV        count_hour,DLDEC       count_hourINC       second2
kk3:          CLICALL      second_lin STIJMP       ksks:           MOV       AH,1INT       16hJZ        kk3MOV       AH,8INT       21hCMP       AL,'q'JE        quitCMP       AL,'b'JE        CHange_rbCMP       AL,'s'JE        CHange_rsCMP       AL,'c'JE        CHange_color              cmp       al,'e'je        a0JMP       kk3CHange_rs:    CMP       r0,190JA        ksADD       r0,5JMP       tobeg2
CHange_rb:    CMP       r0,60JB        ksSUB       r0,5JMP       tobeg2
CHange_color: LEA       SI,color_hourMOV       CX,6
CHange_kk1:   MOV       AL,  [SI]INC       ALCMP       AL,15JC       CHange_color_kk2MOV       AL,1
CHange_color_kk2:              MOV       [SI],ALINC       SILOOP      CHange_kk1JMP       tobeg2
a0:           call musiccall musiccall music
tobeg2:       CALL      CLearJMP       beg2
quit:         MOV       AX,4C00HINT       21H
;*************************************              hour_lin      PROC      NEARPUSHaCMP       count_hour,11JB        tohour_ylJMP       hour_lin_next
tohour_yl:    MOV       SIgle,3JMP       hour_yl
hour_lin_next:   MOV       count_hour,0MOV       SIgle,5                         CALL      CLkMOV       DL,CHCALL      bcd2CMP       AL,12JB        hour_kk1SUB       AL,12
hour_kk1:     MOV       CL,30MUL       CLPUSH      AXXOR       DX,DXMOV       AX,minute2MOV       CX,12DIV       CXMOV       CX,AX       ;minurte2/12POP       AXADD       AX,CXMOV       hour2,AX           ;擦掉              MOV       Color,0MOV       AX,hourMOV       BX,r0ADD       BX,20CALL      renovateMOV       DX,yuanxMOV       x3,DXMOV       DX,yuanyMOV       y3,DXADD       AX,270ADD       BX,400              ;90CALL      renovate  MOV       DX,yuanx         ;擦掉MOV       x2,DXMOV       DX,yuanyMOV       y2,DX  MOV       DX,x0MOV       x1,DXMOV       DX,y0   ;擦掉MOV       y1,DXCALL      sjx  ADD       AX,180CALL      renovate  MOV       DX,yuanx         ;擦掉MOV       x2,DXMOV       DX,yuanyMOV       y2,DX                SUB       BX,100    CALL      renovate                MOV       DX,yuanxMOV       x3,DXMOV       DX,yuanyMOV       y3,DX            ;擦掉CALL      sjxMOV       SIgle,4;***************************;;  ;重写
hour_yl:      MOV       AL,color_hour              MOV       color,ALMOV       AX,hour2MOV       BX,r0ADD       BX,70CALL      renovateMOV       DX,yuanxMOV       x3,DXMOV       DX,yuanyMOV       y3,DXADD       AX,90ADD       BX,600                ;90CALL      renovate  MOV       DX,yuanxMOV       x2,DXMOV       DX,yuanyMOV       y2,DX             ;重写ADD       AX,180CALL      renovate  MOV       DX,yuanxMOV       x1,DXMOV       DX,yuanyMOV       y1,DXCALL      sjxxCALL      sjxy ADD       AX,270SUB       BX,100  CALL      renovate                  MOV       DX,yuanxMOV       x3,DX                ;重写MOV       DX,yuanyMOV       y3,DXCALL      sjx CALL      sjxxCALL      sjxy                                           MOV       CX,hour2MOV       hour,CX
hour_quit:    POPaRET
hour_lin      ENDP                                                    ;********************************                  minute_lin    PROC      NEARPUSHaCMP       count_minute,11JB        tominute_yl        ;仍是原来的一个   JMP       minute_lin_next
tominute_yl:  MOV       SIgle,0JMP       minute_yl
minute_lin_next:INC       count_hourCALL      CLkMOV       DL,CLCALL      bcd2            ;bcd->16MOV       CL,6MUL       CL              ;al*clPUSH      AXMOV       DL,second2CALL      bcd2                             XOR       AH,AHMOV       CL,12DIV       CLMOV       CL,AL       ;second2/12POP       AXMOV       CH,0ADD       AX,CXMOV       minute2,AX AAAa1:        MOV       SIgle,2   MOV       Color,0MOV       AX,minuteMOV       BX,r0ADD       BX,10CALL      renovateMOV       DX,yuanxMOV       x3,DXMOV       DX,yuanyMOV       y3,DXADD       AX,268ADD       BX,800              ;90CALL      renovate  MOV       DX,yuanxMOV       x2,DXMOV       DX,yuanyMOV       y2,DX  MOV       DX,x0MOV       x1,DXMOV       DX,y0MOV       y1,DXCALL      sjx ADD       AX,180CALL      renovate  MOV       DX,yuanxMOV       x2,DXMOV       DX,yuanyMOV       y2,DX                 ADD       AX,90SUB       BX,200    CALL      renovate                MOV       DX,yuanxMOV       x3,DXMOV       DX,yuanyMOV       y3,DXCALL      sjx inc count0cmp count0,5jnz minute_ylmov count0,0call musiccall musiccall music
;**********************************重写                            minute_yl:    MOV       sigle,1MOV       AL,color_minMOV       color,ALMOV       AX,minute2MOV       BX,r0ADD       BX,30CALL      renovateMOV       DX,yuanxMOV       x3,DXMOV       DX,yuanyMOV       y3,DXADD       AX,90ADD       BX,900                ;90CALL      renovate  MOV       DX,yuanxMOV       x2,DXMOV       DX,yuanyMOV       y2,DX  ADD       AX,180CALL      renovate  MOV       DX,yuanxMOV       x1,DXMOV       DX,yuanyMOV       y1,DXCALL      sjxxCALL      sjxy ADD       AX,270SUB       BX,200  CALL      renovate                  MOV       DX,yuanxMOV       x3,DXMOV       DX,yuanyMOV       y3,DXCALL      sjxxCALL      sjxy       MOV       CX,minute2MOV       minute,CXCALL      hour_linminute_kk1:
minute_quit:  POPaRET
minute_lin    ENDP                            ;******************in   dh秒数*********************
second_lin    PROC      NEARPUSHaCALL      CLkCMP       second2,DHJE        to_second_quit JMP       second_lin_next
to_second_quit:JMP       second_quit
second_lin_next:           MOV       SIgle,80hMOV       second2,DH MOV       Color,0          MOV       DL,second             ;eraseCALL      bcd2MOV       AH,0MOV       CL,6MUL       CLMOV       BX,r0ADD       BX,10CALL      renovateMOV       DX,yuanxMOV       x1,DXMOV       DX,yuanyMOV       y1,DXADD       AX,180ADD       BX,300CALL      renovate  MOV       DX,yuanxMOV       x2,DXMOV       DX,yuanyMOV       y2,DX  CALL      linexCALL      liney;重写             MOV       SIgle,80hMOV       AL,color_secondMOV       color,ALMOV       DL,second2CALL      bcd2MOV       AH,0MOV       CL,6MUL       CLMOV       BX,r0ADD       BX,10CALL      renovateMOV       DX,yuanxMOV       x1,DXMOV       DX,yuanyMOV       y1,DXADD       AX,180ADD       BX, 300CALL      renovate  MOV       DX,yuanxMOV       x2,DXMOV       DX,yuanyMOV       y2,DX  CALL      linexCALL      liney  CALL      yuanxinMOV       DL,second2MOV       second,DLCALL      minute_linCALL      skin2MOV       CL,second2MOV       second,CLCMP       count_minute,11JE        second_kk1INC       count_minuteJMP       second_quit
second_kk1:   MOV       count_minute,0
second_quit:  POPaRET
second_lin    ENDP          ;******bxbbx*********in ax度数***bx长度,*********;OUT x2->ax,y2->dx ;**
renovate      PROC      NEARPUSHaADD       AX,270PUSH      AXCALL      SInMOV       DX,0MOV       CX,BXDIV       CXCMP       SI,1JE        hjianADD       AX,y0JMP       renovate_kk1
hjian:        MOV       CX,y0SUB       CX,AXMOV       AX,CX
renovate_kk1: MOV       yuany,AXPOP       AX  CALL      cosMOV       DX,0MOV       CX,BXDIV       CXCMP       SI,1JE        hjian2ADD       AX,x0JMP       renovate_kk2
hjian2:        MOV      CX,x0SUB       CX,AXMOV       AX,CX
renovate_kk2: MOV       yuanx,AXPOPa   RET
renovate      ENDP
;**************************
Clk           PROC                                              MOV       AH,2INT       1ahRET
CLk           ENDP              ;*****************cosx  in ax  out ax ,si符号******************
cos           PROC      NEARADD       AX,90
cos_kk1:      CALL      SIn              RET
cos           ENDP
;*********Sinx  in ax out ax ,si符号*******************************
SIn           PROC      NEAR           ;out axPUSH      CXPUSH      DXPUSH      BX
sin360:       CMP       AX,90JA        dy90
sto0_90:      MOV       SI,0JMP       pp1
dy90:         CMP       AX,180JBE       z91to180JMP       dy180
z91to180:     MOV       CX,180SUB       CX,AXMOV       AX,CXMOV       SI,0JMP       pp1
z181to270:    SUB       AX,180MOV       SI,1JMP       pp1
z271to360:    CMP       AX,359JA        zdy359MOV       CX,360SUB       CX,AXMOV       AX,CXMOV       SI,1JMP       pp1
zdy359:       SUB       AX,360JMP       SIn360                                                                  dy180:        CMP       AX,270JBE       z181to270JMP       z271to360                            pp1:          MOV       CX,175XOR       DX,DXMUL       CXMOV       sin_x,AXXOR       DX,DXMOV       CX,AXMUL       CXMOV       CX,10000 DIV       CXMOV       sin_xx,AXXOR       DX,DXMOV       CX,120DIV       CXMOV       BX,1677;1667CALL      SUBabMOV       CX,sin_xxXOR       DX,DXMUL       CXMOV       CX,10000DIV       CX               ;xx(xx/120-10000/6)MOV       CX,10000MOV       DL,0CMP       DL,sJE        jiaSUB       CX,AXMOV       AX,CXJMP       kk1
jia:          ADD       AX,CX
kk1:          MOV       CX,sin_xXOR       DX,DXMUL       CXMOV       CX,10000DIV       CXPOP       BXPOP       DXPOP       CXMOV       s,0RET
SIn           ENDP  ;**************;绝对值在ax中符号在S中ax-bx*****s要定义db*************
subab         PROC                        CMP AX,BXJAE goabXOR s,1XCHG AX,BX
goab: SUB AX,BX              RET
subab ENDP;***************************linex***y=(y2-y1)*(x-x1)/(x2-x1)+y1
;****in (x1,y1),(x2,y2)******************x++
linex  PROC NEARPUSH      x1PUSH      x2PUSH      y1PUSH      y2pusha CALL    xymaxmin MOV AX,y2MOV BX,y1CALL subabMOV  y2y1,AXMOV AX,x2MOV BX,x1CALL subabMOV  SI,0CMP  SI,AXJE   zhixianJMP  lopx
zhixian:     JMP  zhixianxs
lopx:        MOV  x2x1,AXMOV  AX,xminMOV       x,AX
line0x:      SUB       AX,xminMOV       DX,0 MOV       CX,y2y1    MUL       CXMOV       CX,x2x1DIV       CXMOV       DX,0CMP       DL,sJE        zhengxMOV       CX,AXMOV       AX,xminySUB       AX,CXJMP       kk2x
zhengx:        ADD       AX,xminy
kk2x:         MOV       y,AXCALL      DIan INC       x              MOV       AX,xCMP       AX,xmaxJBE       line0xJMP       quit12             zhixianxs:    MOV       AX,xminMOV       x,AXMOV       AX,yminMOV       y,AX
lopxx:        CALL      DIanINC       yMOV       AX,ymaxCMP       AX,yJAE      lopxx                                                        quit12:      MOV       s,0             POPaPOP       y2POP       y1POP       x2POP       x1              RET
linex         ENDP ;**************************liney      x=(x2-x1)(y-y1)/(y2-y1)+x1;*****************y++                        sjx  PROC NEARPUSH      x1PUSH      x2PUSH      y1PUSH      y2pusha CALL      xymaxmin MOV       AX,y2MOV       BX,y1CALL      subabMOV       y2y1,AXMOV       SI,0CMP       SI,AXJE        to_sjxx
sjx_lop1:     MOV       AX,x2MOV       BX,x1CALL      subabMOV       x2x1,AXMOV       SI,0CMP       SI,AXJE        to_sjxyMOV       DX,0MOV       AX,y2y1MOV       CX,x2x1DIV       CXCMP       AX,1JE        to_sjxxCMP       AX,0JE        to_sjxxJMP       to_sjxy
to_sjxx:      MOV       s,0CALL      sjxx    JMP       sjx_quit
to_sjxy:      MOV       s,0CALL      sjxy
sjx_quit:     POPaPOP       y2POP       y1POP       x2POP       x1   MOV       s,0        RET
sjx           ENDP              liney  PROC NEARPUSH      x1PUSH      x2PUSH      y1PUSH      y2pusha CALL      xymaxmin MOV       AX,y2MOV       BX,y1CALL      subabMOV       y2y1,AXMOV       SI,0CMP       SI,AXJE        hengJMP       lop1
heng:         JMP       hengxian
lop1:         MOV AX,x2MOV BX,x1CALL subabMOV       x2x1,AXMOV       AX,yminMOV       y,AX        line0y: SUB   AX,yminMOV   DX,0 MOV       CX,x2x1    MUL       CXMOV       CX,y2y1DIV       CXMOV       DX,0CMP       DL,sJE        zhengyMOV       CX,AXMOV       AX,yminxSUB       AX,CXJMP       kky
zhengy:       ADD       AX,yminxkky:         MOV       x,AXCALL      DIan INC       y              MOV       AX,yCMP       AX,ymaxJBE       line0yJMP       quity
hengxian:     MOV       AX,yminMOV       y,AXMOV       AX,xminMOV       x,AX
lopy:         CALL      DIanINC       xMOV       AX,xmaxCMP       AX,xJAE       lopy                     quity:       MOV       s,0             POPaPOP      y2POP      y1POP      x2POP      x1              RET
liney         ENDP ;***************************linex***y=(y2-y1)*(x-x1)/(x2-x1)+y1
;****in (x1,y1),(x2,y2)******************x++
sjxx  PROC NEARpusha PUSH      x1PUSH      x2PUSH      x3PUSH      y1PUSH      y2PUSH      y3                            CALL      xymaxminMOV       AX,xminMOV       sjx_xmin,AXMOV       AX,yminMOV       sjx_ymin,AXMOV       AX,xmaxMOV       sjx_xmax,AXMOV       AX,ymaxMOV       sjx_ymax,AXMOV       AX,xminyMOV       sjx_xminy,AX              MOV AX,y2MOV BX,y1CALL subabMOV       sjx_y2y1,AXMOV AX,x2MOV BX,x1CALL subabMOV       DL,sMOV       s2,DLMOV       s,0              MOV       SI,0CMP       SI,AXJE        sjx_zhixianJMP       sjx_lopx
sjx_zhixian:      MOV       x1,AXMOV       AX,x3MOV       x2,AXMOV       AX,y3MOV       y2,AX                 JMP       sjx_zhixianxs
sjx_lopx:     MOV       sjx_x2x1,AXMOV       AX,x3MOV       x2,AXMOV       AX,y3MOV       y2,AX   MOV       AX,sjx_xminMOV       x1,AX                    sjx_line0x:   SUB       AX,sjx_xminMOV       DX,0                         ;***y=(y2-y1)*(x-x1)/(x2-x1)+y1MOV       CX,sjx_y2y1    MUL       CXMOV       CX,sjx_x2x1DIV       CXMOV       DX,0CMP       DL,s2JE        sjx_zhengxMOV       CX,AXMOV       AX,sjx_xminySUB       AX,CXJMP       sjx_kk2
sjx_zhengx:                 ADD       AX,sjx_xminy
sjx_kk2:                    MOV       y1,AXCALL      linexCALL      lineyINC       x1              MOV       AX,x1CMP       AX,sjx_xmaxJBE       sjx_line0xJMP       sjx_quit12             sjx_zhixianxs: MOV       AX,sjx_xminMOV       x1,AXMOV       AX,sjx_yminMOV       y1,AX
sjx_lopxx:         CALL      linexCALL      lineyINC       y1MOV       AX,sjx_ymaxCMP       AX,y1JAE      sjx_lopxx                                                        sjx_quit12:  MOV       s,0POP       y3   POP      y2POP      y1POP       x3POP      x2POP      x1                                     POPaRET
sjxx           ENDP ;**************************liney      x=(x2-x1)(y-y1)/(y2-y1)+x1;*****************y++                        sjxy  PROC NEARPUSH      x1PUSH      x2PUSH      x3PUSH      y1PUSH      y2PUSH      y3pusha CALL      xymaxmin MOV       AX,xminMOV       sjx_xmin,AXMOV       AX,yminMOV       sjx_ymin,AXMOV       AX,xmaxMOV       sjx_xmax,AXMOV       AX,ymaxMOV       sjx_ymax,AX  MOV       AX,yminxMOV       sjx_yminx,AX                          MOV AX,y2MOV BX,y1    CALL subabMOV       sjx_y2y1,AXMOV       SI,0CMP       SI,AXJE        sjxy_hengJMP       sjxy_lop1
sjxy_heng:     MOV       DL,sMOV       s2,DLMOV       s,0                 MOV       AX,x3MOV       x2,AXMOV       AX,y3MOV       y2,AX                               JMP       sjxy_hengxian
sjxy_lop1:    MOV      AX,x2MOV      BX,x1            ;x=(x2-x1)(y-y1)/(y2-y1)+x1CALL     subabMOV       DL,sMOV       s2,DLMOV       s,0MOV       sjx_x2x1,AXMOV       AX,x3MOV       x2,AXMOV       AX,y3MOV       y2,AX                               MOV       AX,sjx_yminMOV       y1,AX     sjxy_line0y:  SUB       AX,sjx_yminMOV       DX,0 MOV       CX,sjx_x2x1    MUL       CXMOV       CX,sjx_y2y1DIV       CXMOV       DX,0CMP       DL,s2JE        sjxy_zhengyMOV       CX,AXMOV       AX,sjx_yminxSUB       AX,CXJMP       sjxy_kky3
sjxy_zhengy:                ADD       AX,sjx_yminx
sjxy_kky3:                   MOV       x1,AXCALL      linexCALL      liney  INC       y1              MOV       AX,y1CMP       AX,sjx_ymaxJBE       sjxy_line0yJMP       sjxy_quity
sjxy_hengxian:     MOV       AX,sjx_yminMOV       y1,AXMOV       AX,sjx_xminMOV       x1,AX
sjxy_lopy:    CALL      lineyCALL      linexINC       x1MOV       AX,sjx_xmaxCMP       AX,x1JAE       sjxy_lopy                     sjxy_quity:  MOV       s,0             POPaPOP       y3POP      y2POP      y1POP       x3POP      x2POP      x1              RET
sjxy          ENDP ;
xymaxmin      PROC      NEARPUSHaPUSH      x1PUSH      x2PUSH      y1PUSH      y2                            MOV       AX,x1CMP       AX,x2JAE       x1dyx2MOV       xmin,AX    ;x1<x2MOV       AX,y1MOV       xminy,AXMOV       AX,x2MOV       xmax,AXJMP       ymaxmin
x1dyx2:       MOV       xmax,AXMOV       AX,x2MOV       xmin,AXMOV       AX,y2MOV       xminy,AX        ;xminx 所对应的y
ymaxmin:      MOV       AX,y1CMP       AX,y2JAE       y1dyy2MOV       ymin,AXMOV       AX,x1MOV       yminx,AX       ;所对应的xMOV       AX,y2MOV       ymax,AXJMP       xymax_quit
y1dyy2:       MOV       ymax,AXMOV       AX,y2MOV       ymin,AXMOV       AX,x2MOV       yminx,AX
xymax_quit:                 POP      y2POP      y1POP      x2POP      x1                            POPaRET
xymaxmin      ENDP   DIan PROC NEAR           ;画一点x,yPUSHaMOV       AH,s       MOV       s3,AH       MOV       AH,SIgle       AND       AH,80hCMP       AH,0JE        puanduan
paint:                                                         MOV AL,colorMOV BH,page1   MOV       DX,y                MOV CX,x        ;列号MOV AH,0chINT 10hJMP       DIanquit
puanduan:CALL      readerdianMOV       DIancolor,ALMOV       AH,SIgleAND       AH,7fhCMP       AH,0JE        NEw0CMP       AH,1JE        NEw1CMP       AH,2JE        NEw2CMP       AH,3JE        NEw3CMP       AH,4JE        NEw4CMP       AH,5JE        NEw5CMP       AH,6JE        NEw6JMP       DIanquitNEw0:         CMP       DIancolor,0JE        topaintJMP       DIanquit
NEw1:         CMP       DIancolor,0JE        topaintMOV       AH,color_hourCMP       DIancolor,AHJE        topaintJMP       DIanquit
topaint:      JMP       paint              NEw2:         MOV       AH,color_minCMP       DIancolor, AHJE        topaintJMP       DIanquit
NEw3:         JMP       NEw0
NEw4:         JMP       NEw0
NEw5:         MOV       AH,color_hour                                                CMP       DIancolor,AHJE        topaintJMP       DIanquit
NEw6:         CMP       DIancolor,0JE        topaintJMP       DIanquitMOV       AX,xMOV       BX,x0CALL      SUBabCMP       AX,5JA        topaintMOV       AX,yMOV       BX,y0CALL      SUBabCMP       AX,5JA        topaintDIanquit:     MOV       AH,s3MOV       s,AH                                              POPaRET
DIan ENDPyuanxin       PROCMOV       AL,color_secondADD       AL,1MOV       BH,PAGE1MOV       DX,y0MOV       CX,x0MOV       AH,0chINT       10hDEC       DX              MOV       AH,0chINT       10hDEC       CXMOV       AH,0chINT       10hINC       DXMOV       AH,0chINT       10hINC       DXMOV       AH,0chINT       10hINC       CXMOV       AH,0chINT       10hINC       CXMOV       AH,0chINT       10hSUB       DX,1MOV       AH,0chINT       10hDEC       DXMOV       AH,0chINT       10h              RET
yuanxin       ENDP                            readerdian    PROCMOV       BH,page1   MOV       DX,y                MOV       CX,x        ;列号MOV       AH,0dhINT       10h  RET
readerdian    ENDP                                 b1002         PROC      NEAR           ;入口DX-光标定位MOV       BH,0MOV       AH,02hINT       10hRET
b1002         ENDPCLear         PROCMOV       DX,0410hCALL      b1002MOV       CX,6000MOV       BH,PAGE1MOV       AL,' 'MOV       AH,0ahINT       10hRET
CLear         ENDP              ;      12根******************************
skin2         PROCPUSHaMOV       AL,color6MOV       color,ALMOV       CX,12MOV       AX,0
skin2_kk1:    PUSH      CX   PUSH      AXMOV       BX,r0MOV       CX,y0MOV       DX,x0CALL      enovateMOV       AX,xMOV       x1,AXMOV       AX,yMOV       y1,AXPOP       AXPUSH      AXMOV       BX,r0ADD       BX,10MOV       CX,y0MOV       DX,x0CALL      enovateMOV       AX,xMOV       x2,AXMOV       AX,yMOV       y2,AXCALL      linexCALL      lineyPOP       AXADD       AX,30POP       CXLOOP      skin2_kk1MOV       CX,4MOV       AX,0
skin2_kk2:    PUSH      CX   PUSH      AXMOV       BX,r0MOV       CX,y0MOV       DX,x0CALL      enovateMOV       AX,xMOV       x1,AXMOV       AX,yMOV       y1,AXPOP       AXPUSH      AXMOV       BX,r0ADD       BX,20MOV       CX,y0MOV       DX,x0CALL      enovateMOV       AX,xMOV       x2,AXMOV       AX,yMOV       y2,AXCALL      linexCALL      lineyPOP       AXADD       AX,90POP       CXLOOP      skin2_kk2POPaRET
skin2         ENDP
;60根**********************************88              skin3         PROCPUSHaMOV       AL,color5MOV       color,ALMOV       CX,60MOV       AX,0
skin2_kk3:    PUSH      CX   PUSH      AXMOV       BX,r0MOV       CX,y0MOV       DX,x0CALL      enovateMOV       AX,xMOV       x1,AXMOV       AX,yMOV       y1,AXPOP       AXPUSH      AXMOV       BX,r0ADD       BX,3MOV       CX,y0MOV       DX,x0CALL      enovateMOV       AX,xMOV       x2,AXMOV       AX,yMOV       y2,AXCALL      linexCALL      lineyPOP       AXADD       AX,6POP       CXLOOP      skin2_kk3POPaRET
skin3         ENDP
;数字加圆**************************************88
skin          PROC      NEARMOV       AL,color4MOV       color,ALMOV       BX,r0CALL      yuanMOV       BX,r0              MOV       DH,7MOV       DL,39CALL      b1002MOV       DL,'1'MOV       AH,2INT       21hMOV       DH,7MOV       DL,40CALL      b1002MOV       DL,'2'MOV       AH,2INT       21h MOV       DH,8MOV       DL,47CALL      b1002MOV       DL,'1'MOV       AH,2INT       21h  MOV       DH,11MOV       DL,53CALL      b1002MOV       DL,'2'MOV       AH,2INT       21h MOV       DH,19MOV       DL,53CALL      b1002MOV       DL,'4'MOV       AH,2INT       21hMOV       DH,22MOV       DL,47CALL      b1002MOV       DL,'5'MOV       AH,2INT       21h MOV       DH,22MOV       DL,32CALL      b1002MOV       DL,'7'MOV       AH,2INT       21hMOV       DH,19MOV       DL,26CALL      b1002MOV       DL,'8'MOV       AH,2INT       21h MOV       DH,11MOV       DL,25CALL      b1002MOV       DL,'1'MOV       AH,2INT       21hMOV       DH,11MOV       DL,26CALL      b1002MOV       DL,'0'MOV       AH,2INT       21h MOV       DH,8MOV       DL,30CALL      b1002MOV       DL,'1'MOV       AH,2INT       21h MOV       DH,8MOV       DL,31CALL      b1002MOV       DL,'1'MOV       AH,2INT       21hMOV       DH,15MOV       DL,55CALL      b1002MOV       DL,'3'MOV       AH,2INT       21h         MOV       DH,23MOV       DL,40CALL      b1002MOV       DL,'6'MOV       AH,2INT       21hMOV       DH,15MOV       DL,24CALL      b1002MOV       DL,'9'MOV       AH,2INT       21hRETskin          ENDP             msg           PROC      NEAR        ;in bp为输出字符串地址PUSH      ESPUSH      DSPOP       ESMOV       CX,40hMOV       AL,0MOV       BX,2MOV       AH,13hINT       10hPOP       ESRET
msg           ENDP;*****************in dl  out al
bcd2          PROC      NEAR                            MOV       AH,0MOV       AL,DLSHR       AL,4AND       AL,0fhMOV       CL,10MUL       CLMOV       CL,ALMOV       AL,DLAND       AL,0fhADD       AL,CL;;;;;      bcd转16进制RET
bcd2          ENDP                            ;r0=bx    圆心cx 行 dx列********************
yuan          PROCPUSHaMOV       CX,360MOV       AX,0
yuan_kk1:     PUSH      CX   PUSH      AXMOV       CX,y0MOV       DX,x0CALL      enovateCALL      dianPOP       AXADD       AX,1POP       CXLOOP      yuan_kk1POPaRET
yuan          ENDP                                          ;*****************in ax度数    bx=半径r长度,cx 列 dx行  圆心 out  x,y************
enovate       PROC      NEARPUSHaPUSH      DXPUSH      AXPUSH      CXCALL      SInMOV       DX,0MOV       CX,BXDIV       CXPOP       CXCMP       SI,1JE        ianADD       AX,CXJMP       enovate_kk1
ian:          SUB       CX,AXMOV       AX,CX
enovate_kk1:  MOV       y,AXPOP       AX                            CALL      cosMOV       DX,0MOV       CX,BXDIV       CXPOP       DXCMP       SI,1JE        ian2ADD       AX,DXJMP       enovate_kk2
ian2:         MOV       CX,DXSUB       CX,AXMOV       AX,CX
enovate_kk2:  MOV       x,AX                                   POPaRET
enovate     ENDP       MAIN          ENDP
;------------------------------------------------------
CODE_SEG      ENDS
;******************************************************END       START    ;程序结束

函数功能
主函数功能为调用子函数设置表盘背景图形及通过判断输入的字符调用对应功能。
1)首先显示提示语句,通过调用b1002(修改光标位置,使得显示字符居中)和msg函数实现。随后调用skin, skin2, skin3函数,绘制表盘轮廓、刻度和数字。再按先获取时间(调用clk函数)后设置表针(_lin系列函数)的顺序分别设置时针、分针和秒针。
2)此后,调用BIOS中断,监听键盘缓冲区。当键盘缓冲区内有字符,且有对应功能时,跳转执行此功能,功能执行完后,清屏,并跳转至1)步骤中调用skin函数处继续运行;否则回跳至设置秒针处继续运行。
到达整分钟时,将会调用music函数播放音乐。(此处存在BUG:由于music函数一直处于执行状态,其他语句不能执行,画面无法更新;同时此处的音乐播放时间过长)

本程序共有28个子函数用于实现各类功能。
设置秒针的函数second_lin中调用了设置分针的函数minute_lin,minute_lin中调用了设置时针的函数hour_lin,因而只需跳转至秒针函数处即可控制所有指针。
程序中的linex, liney, subxy, sin, cos, xymaxmin,sjx等函数,提供了基本的二维坐标运算方法;envote , renvote函数用于确定表的尺寸及位置;yuanxin , dian, readerdian等函数提供绘制二维点的方法。
另有bcd2 , msg , clk ,clear等函数,分别用于实现16进制的转换、提示信息输出、获取时间、清屏等功能。

参数传递
主函数与三个表针函数的参数传递为约定单元法,所用约定单元分别为对应的count_hour/minute/second及hour2/minute2/second2;
主函数与music, sound之间无参数传递;

表针函数与renovate函数之间的参数传递为寄存器法,所用寄存器为ax,bx,cx,dx;
主函数与enovate函数的参数传递为寄存器法,所用寄存器为ax,bx,cx,dx;
主函数与yuan函数的参数传递为约定单元法,约定单元为y0,x0;
主函数与bdc2的参数传递为寄存器法,所用寄存器为dl,al;
主函数与MSG的参数传递为寄存器法,寄存器为es,bp等;
与skin的参数传递为约定单元法,约定单元为color,color4;
与skin3的参数传递为约定单元法,约定单元为color,color5,,x,x0,x1,y,y0,y1;
与skin2的参数传递为约定单元法,约定单元为color,color6,,x,x0,x1,y,y0,y1;
与clear, b1002无参数传递;
与readerdian的参数传递为约定单元法,约定单元为page1, y , x;
与yuanxin的参数传递为约定单元法,约定单元为color_second , page1, x0 , y0;
与dian的参数传递为约定单元法,

中断向量及中断处理程序地址计算
中断向量:
本题用到了10H、16H、1AH、21H函数库的函数调用。
10H号函数库:CS=410h+2h=42h , IP=410h=40h 。中断向量为0:40H。
16H号函数库:CS = 416H + 2H =60H, IP =416H=58H。中断向量为0:58H。
1AH号函数库:CS = 41AH + 2H =70H, IP =41AH=68H。中断向量为0:68H。
21H号函数库:CS=421h+2h=86h , IP=421h=84h 。中断向量为0:84h。

汇编程序设计:钟表显示相关推荐

  1. 基于51单片机自动数字电压表PCF8591 TLC2543 TL548 proteus仿真汇编程序设计

    硬件设计1 基于51单片机+PCF8591 ADC的仿真电路图: A. 基于51单片机和PCF8591的电压表,具有仿真图/源程序: B. 由数码管作为显示器: C.测试电压范围为0~5V,精度约为0 ...

  2. ARM汇编程序设计实例

    10.5  ARM汇编程序设计举例 在本节中通过一些例子来说明ARM中伪操作及指令的基本用法. 10.5.1  条件跳转及循环 1.ALU状态标志 所有ARM指令都可以条件执行.大部分ARM指令集和T ...

  3. 汇编程序设计与计算机体系结构软件工程师教程笔记:内联汇编与宏

    <汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...

  4. 汇编程序设计与计算机体系结构软件工程师教程笔记:函数、字符串、浮点运算

    <汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...

  5. 汇编程序设计与计算机体系结构软件工程师教程笔记:指令

    <汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...

  6. 汇编程序设计与计算机体系结构软件工程师教程笔记:处理器、寄存器简介

    <汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...

  7. 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )

    文章目录 一.创建 Capstone 反汇编解析器实例对象 二.设置 Cs 汇编解析器显示细节 一.创建 Capstone 反汇编解析器实例对象 使用 Capstone 反汇编框架 , 首先创建 Ca ...

  8. 第三章 系统指令与汇编程序设计 3.1 单片机指令系统

    第三章 系统指令与汇编程序设计 3.1 单片机指令系统 3.1.1 寻址空间及常用符号 3.1.2 寻址方式 3.1.3 数据传送与交换指令 3.1.4 算术运算指令 3.1.5 逻辑操作指令 3.1 ...

  9. c语言年历表程序设计,c语言程序设计年历显示-20210413153548.docx-原创力文档

    内部编号:(YUUT-TBBY-MMUT-URRUY-UOOY-DBUYI-0128) 内部编号:(YUUT-TBBY-MMUT-URRUY-UOOY-DBUYI-0128) c语言程序设计年历显示 ...

  10. 【汇编语言与计算机系统结构笔记18】MIPS指令集与汇编程序设计 异常处理

    本次笔记内容: 28.MIPS指令集与汇编程序设计-2 补充:MIPS32异常处理 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库. 本节课对应幻灯片:汇编语言程式设计-MIPS.pd ...

最新文章

  1. 自定义PHP错误报告处理方式
  2. Flink在美团的实践与应用
  3. SAP Data Intelligence API返回错误消息 - Fordidden cross-site request
  4. LuckyDraw app使用CosmosDB的成本分析
  5. 如何使用JavaScript删除CSS属性?
  6. 简易nodejs服务器
  7. 在VS2010 Choose Toolbox Item Dialog 中显示自定义控件
  8. 【NOIP1997】【Luogu2626】斐波那契数列(枚举,质因数分解)
  9. UAV 无人机检测实践分析
  10. php中的单引号和双引号
  11. 转载[UGUI]深入理解Canvas Scaler
  12. vue 使用vue-canvas-poster生成自定义海报
  13. yarn logs 查看日志
  14. 从零开始的Docker [ 7 ] --- 顶级 Volumes,数据卷, 系统限制sysctls
  15. 《计算机应用基础》第04章在线测试,《计算机应用基础》在线测试.doc
  16. windows/linux 系统U盘制作系统盘(实战,简单)
  17. 超参数的调优(lightgbm)
  18. JAVA大数据的第五十九天——The authenticity of host ‘gree129 (192.168.**.129)‘ can‘t be established.
  19. (原创)LEON3入门教程(三):基于LEON3的SOPC设计以及HELLOWORLD和流水灯
  20. 让 new bing 使用 GPT-4 编写一个令人满意的程序全过程赏析

热门文章

  1. 回首2013,寄语步入社会的我——自强不息,厚德载物
  2. 阿里云ECS和WorldPress + Nginx实现固定连接策略
  3. Unity发布VR项目不能唤起VR头盔
  4. 博客总纲 博客目录V1
  5. 与“雾霾”相关的英语表达
  6. win10 往vmware 黑苹果系统无法拖拽复制问题
  7. 【DZX修改】根据性别不同显示不同的默认头像
  8. 我的练习项目: 模拟淘宝搜索商品、添加商品到购物车功能、修改商品信息功能
  9. python多线程网易云歌单
  10. 由于改 UOM conversion 导致库存数量和财务上的数据错误