📄 homework3.txt
字号:
;时间,日期显示设置
PRINT MACRO COUNT
LOCAL next,cont,skip,disp,jump
;用来将数字转化成ASCII码并输出的操作
mov ax,COUNT
;用减法实现除以1000~10,以DL存放结果
next: mov dl,0
cont: cmp bx,ax
jb skip
inc dl
sub bx,ax
jmp cont
;显示当前位,但不显示最高位的零,由flag控制
skip: cmp flag,0
jne disp
cmp dl,0
jz jump
mov flag,1
disp: or dl,30h
push ax
mov ah,2
int 21h
pop ax
;ax/10,修改权数
jump: cwd
div factor
cmp ax,1
jne next
;单独处理最低位
mov dl,bl
or dl,30h
mov ah,2
int 21h
ENDM
INPUTNUM MACRO WTB
LOCAL input,out,wtob,out2
;用来将输入转化为对应数字的操作
;读入数,直到回车为止
input: mov ah,1
int 21h
cmp al,30h
jb out
cmp al,39h
ja out
;buf=buf*10+al,将输入的十进制数串转换为对应的数值存入buf
and al,0fh
shl buf,1
mov bx,buf
shl buf,1
shl buf,1
add buf,bx
mov ah,0
add buf,ax
jmp input
wtob: mov bl,dl
xor dx,dx
;add dl,30h
;mov ah,2
;int 21h
jmp out2
out:
ENTER
mov dx,buf
mov buf,0
mov al,wtb
cmp al,0
je wtob
out2:
ENDM
ENTER MACRO
MOV DL,0AH
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
ENDM
DATAS SEGMENT
factor dw 10 ;用于修改权数
flag dw 0 ;开关变量,控制结果中的高位零不显示
cr equ 0dh ;回车
lf equ 0ah ;换行
buf dw ?
;YEAR-SEC用来存储读出或输入的对应日期、时间项
YEAR DW ?
MONTH DB ?
DAY DB ?
HOUR DB ?
MIN DB ?
SEC DB ?
;OP1-CHT为英文提示,用来提示用户操作
OP1 DB 'Hollow!Please choose an operation(1--look data,2--look time,3--set data,4--set time,0--exit):',0AH,0DH,'$'
OP2 DB 'Input a wrong number,please do it again.',0AH,0DH,'$'
OP3 DB 0AH,0DH,'Continue?(1--Yes,2--No):',0AH,0DH,'$'
OPDAY DB 0AH,0DH,'Today is:','$'
OPTIME DB 0AH,0DH,'Now the time is:','$'
OPERROR DB 'Input Error,please do again.',0AH,0DH,'$'
OPOK DB 'Operation success!',0AH,0DH,'$'
OPA DB 0AH,0DH,'What do you want to do next?',0AH,0DH,'$'
CHD DB 0AH,0DH,'Please input a new data:(YEAR MONTH DAY input separate)',0AH,0DH,'$'
CHT DB 0AH,0DH,'Please input a new time:(HOUR MIN SEC input separate)',0AH,0DH,'$'
DATAS ENDS
STACKS SEGMENT
DW 20H DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
JMP HERE
AGAIN:
LEA DX,OPA
MOV AH,9
INT 21H
JMP GO
HERE:
;输出提示并接受用户输入的选项,比较后跳转到相应功能
LEA DX,OP1
MOV AH,9
INT 21H
GO:
MOV AH,0
INT 16H
CMP AL,30H
JE GOOUT
CMP AL,31H
JE DATA
CMP AL,32H
JE TIME
CMP AL,33H
JE SETDATA
CMP AL,34H
JE SETTIME
LEA DX,OP2
MOV AH,9
INT 21H
JMP HERE
DATA:
;读取当前日期并输出
MOV AH,2AH
INT 21H
;将读出日期放到相应单元中保存
MOV YEAR,CX
MOV MONTH,DH
MOV DAY,DL
LEA DX,OPDAY
MOV AH,9
INT 21H
MOV BX,YEAR
;调用输出方法,参数标志输出的是几位数
PRINT 1000
MOV DL,'-'
MOV AH,2
INT 21H
XOR BX,BX
MOV BL,MONTH
PRINT 10
MOV DL,'-'
MOV AH,2
INT 21H
MOV BL,DAY
PRINT 10
JMP NEXT
TIME:
;读取当前时间并输出,读出的值保存到相应内存单元中
MOV AH,2CH
INT 21H
MOV HOUR,CH
MOV MIN,CL
MOV SEC,DH
LEA DX,OPTIME
MOV AH,9
INT 21H
MOV BL,HOUR
PRINT 10
MOV DL,':'
MOV AH,2
INT 21H
MOV BL,MIN
PRINT 10
MOV DL,':'
MOV AH,2
INT 21H
MOV BL,SEC
PRINT 10
JMP NEXT
SETDATA:
;设置日期
LEA DX,CHD
MOV AH,9
INT 21H
;调用INPUTNUM输入新的年月日,参数1表示输入为字长,0表示输入为字节长
INPUTNUM 1
MOV YEAR,DX
INPUTNUM 0
MOV MONTH,BL
INPUTNUM 0
MOV DAY,BL
MOV CX,YEAR
MOV DH,MONTH
MOV DL,DAY
MOV AH,2BH
INT 21H
CMP AL,0
JE DONE
LEA DX,OPERROR
MOV AH,9
INT 21H
JMP NEXT
SETTIME:
;设置时间,设计思路方法基本同上
LEA DX,CHT
MOV AH,9
INT 21H
INPUTNUM 0
MOV HOUR,BL
INPUTNUM 0
MOV MIN,BL
INPUTNUM 0
MOV SEC,BL
MOV CH,HOUR
MOV CL,MIN
MOV DH,SEC
MOV DL,0
MOV AH,2DH
INT 21H
CMP AL,0
JE DONE
LEA DX,OPERROR
MOV AH,9
INT 21H
JMP NEXT
DONE:
;若设置操作成功,输出提示
LEA DX,OPOK
MOV AH,9
INT 21H
NEXT:
;一次操作完毕,提示用户是否继续,并由输入选项跳转到程序头或退出
LEA DX,OP3
MOV AH,9
INT 21H
MOV AH,0
INT 16H
CMP AL,31H
JE AGAIN
GOOUT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -