汇编程序设计:钟表显示
程序说明:
本程序是一个用汇编编的精致的图形时钟,运行时双击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。
汇编程序设计:钟表显示相关推荐
- 基于51单片机自动数字电压表PCF8591 TLC2543 TL548 proteus仿真汇编程序设计
硬件设计1 基于51单片机+PCF8591 ADC的仿真电路图: A. 基于51单片机和PCF8591的电压表,具有仿真图/源程序: B. 由数码管作为显示器: C.测试电压范围为0~5V,精度约为0 ...
- ARM汇编程序设计实例
10.5 ARM汇编程序设计举例 在本节中通过一些例子来说明ARM中伪操作及指令的基本用法. 10.5.1 条件跳转及循环 1.ALU状态标志 所有ARM指令都可以条件执行.大部分ARM指令集和T ...
- 汇编程序设计与计算机体系结构软件工程师教程笔记:内联汇编与宏
<汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...
- 汇编程序设计与计算机体系结构软件工程师教程笔记:函数、字符串、浮点运算
<汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...
- 汇编程序设计与计算机体系结构软件工程师教程笔记:指令
<汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...
- 汇编程序设计与计算机体系结构软件工程师教程笔记:处理器、寄存器简介
<汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...
- 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )
文章目录 一.创建 Capstone 反汇编解析器实例对象 二.设置 Cs 汇编解析器显示细节 一.创建 Capstone 反汇编解析器实例对象 使用 Capstone 反汇编框架 , 首先创建 Ca ...
- 第三章 系统指令与汇编程序设计 3.1 单片机指令系统
第三章 系统指令与汇编程序设计 3.1 单片机指令系统 3.1.1 寻址空间及常用符号 3.1.2 寻址方式 3.1.3 数据传送与交换指令 3.1.4 算术运算指令 3.1.5 逻辑操作指令 3.1 ...
- c语言年历表程序设计,c语言程序设计年历显示-20210413153548.docx-原创力文档
内部编号:(YUUT-TBBY-MMUT-URRUY-UOOY-DBUYI-0128) 内部编号:(YUUT-TBBY-MMUT-URRUY-UOOY-DBUYI-0128) c语言程序设计年历显示 ...
- 【汇编语言与计算机系统结构笔记18】MIPS指令集与汇编程序设计 异常处理
本次笔记内容: 28.MIPS指令集与汇编程序设计-2 补充:MIPS32异常处理 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库. 本节课对应幻灯片:汇编语言程式设计-MIPS.pd ...
最新文章
- 自定义PHP错误报告处理方式
- Flink在美团的实践与应用
- SAP Data Intelligence API返回错误消息 - Fordidden cross-site request
- LuckyDraw app使用CosmosDB的成本分析
- 如何使用JavaScript删除CSS属性?
- 简易nodejs服务器
- 在VS2010 Choose Toolbox Item Dialog 中显示自定义控件
- 【NOIP1997】【Luogu2626】斐波那契数列(枚举,质因数分解)
- UAV 无人机检测实践分析
- php中的单引号和双引号
- 转载[UGUI]深入理解Canvas Scaler
- vue 使用vue-canvas-poster生成自定义海报
- yarn logs 查看日志
- 从零开始的Docker [ 7 ] --- 顶级 Volumes,数据卷, 系统限制sysctls
- 《计算机应用基础》第04章在线测试,《计算机应用基础》在线测试.doc
- windows/linux 系统U盘制作系统盘(实战,简单)
- 超参数的调优(lightgbm)
- JAVA大数据的第五十九天——The authenticity of host ‘gree129 (192.168.**.129)‘ can‘t be established.
- (原创)LEON3入门教程(三):基于LEON3的SOPC设计以及HELLOWORLD和流水灯
- 让 new bing 使用 GPT-4 编写一个令人满意的程序全过程赏析