⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 homework3.txt

📁 用masm编的显示时间和设置系统时间的汇编源代码
💻 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 + -