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

📄 完成实验一.asm

📁 微机原理课程设计报告 课题六:数字闹钟 1. 通过8253定时器产生秒脉冲定时中断。在中断服务程序中实现秒、分、小时的进位(24小时制)。 2. 将当前时分秒在七段LED显示器上显示(如:091
💻 ASM
字号:
LF	equ	0ah		;回车16进制码
DATAS SEGMENT
    ;此处输入数据段代码
    STRX DB 7,0,6 DUP(0)
    STRY DB 7,0, 6 DUP(0) 
    RESULT DB 7 DUP(?)
    FLAG	DB	1	;标志(用于打印结果数)
    Msg1	db	'x = ','$'
	Msg2	db	LF,'y = ','$'
	Msg3	db	LF,'x+y= ','$'
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX	;定位数据段
    ;此处输入代码据段代码
	;输入X
	LEA	DX,Msg1
	CALL	Puts
	LEA	DX,STRX
	CALL	Gets	;将输入的字符传保存在STRX中
	;输入Y
	LEA	DX,Msg2
	CALL	Puts
	LEA	DX,Stry
	CALL	Gets	;将输入的字符传保存在STRY中

    XOR CX,CX	;CX计数器清零
    MOV CL,STRX+1
    LEA SI,STRX+2
    ;如果位数小于6位,则对末位的后一位进行清零,(因为回车被存储进了)
    CMP CX,6
    JNC	SKIP3
    PUSH SI
    ADD SI,CX
    MOV [SI],BYTE PTR 0
    POP SI
SKIP3:
    CALL ASC2BIN	;STRX的字符转化为二进制真值
    
;对X进行位对齐,对低于6位数据进行自适应
	XOR CX,CX	;CX计数器清零
    MOV CL,STRX+1 
    LEA SI,STRX+2-1	;
    ADD SI,CX		;定位SI指向数据有效位的最低位的存储单元
    LEA DI,STRX+7	;定位SI指向数据缓冲区的最后一位
    
CHANGE1:	
  	MOV AL,[SI]
  	MOV [SI],BYTE PTR 0
  	MOV [DI],AL
  	 
  	DEC SI		;SI,DI同步自减CX次
  	DEC DI
  	CLC		;标志位清零
  	DEC CX
  	JNZ CHANGE1
    
    XOR CX,CX
    MOV CL,STRY+1
    LEA SI,STRY+2
    ;如果位数小于6位,则对末位的后一位进行清零,(因为回车被存储进了)
    CMP CX,6
    JNC	SKIP4
    PUSH SI
    ADD SI,CX
    MOV [SI],BYTE PTR 0
    POP SI
SKIP4:
    CALL ASC2BIN	;STRY的字符转化为二进制真值

;对Y进行位对齐,对低于6位数据进行自适应
	XOR CX,CX	;CX计数器清零
    MOV CL,STRY+1 
    LEA SI,STRY+2-1	;
    ADD SI,CX		;定位SI指向数据有效位的最低位的存储单元
    LEA DI,STRY+7	;定位SI指向数据缓冲区的最后一位
    
CHANGE:	
  	MOV AL,[SI]
  	MOV [SI],BYTE PTR 0
  	MOV [DI],AL
  	 
  	DEC SI		;SI,DI同步自减CX次
  	DEC DI
  	CLC		;标志位清零
  	DEC CX
  	JNZ CHANGE
    
    MOV CX,6	;
    LEA SI,STRX+2	;定位到六位数据头
    LEA DI,STRY+2
    CLC	;标志位清零
JIA:
    MOV AL,[SI+5]	;取DS:SI所指向的内存单元的值赋给AL
    ADC AL,[DI+5]	;
    AAA			;BCD码加法自动调整
    MOV [DI+6+6],AL	;定位RESULT存储最低位,RESULT从存储
    DEC SI
    DEC DI
    LOOP JIA
    
    LEA DI,RESULT
    MOV [DI],BYTE PTR 0	;RESULT最高位置零
    JNC	SKIP	;若无进位则跳转打印数字
    
	MOV [DI],BYTE PTR 1	;
SKIP: 
    XOR CX,CX	;计数器清零
    MOV CX,7
    LEA DX,Msg3
    CALL	Puts
    JMP DAYIN	;

DAYIN:		;从第一个不为0的数开始打印
	CMP	DS:FLAG,1
	MOV DL,[DI]
	JNZ	SHOW
	
    
    CMP DL,00H	;判断首字符是否为0
    JZ	SKIP1	;如果首字符为0则跳过设置打印标识符
SETTING:	;设置打印标志位
	MOV FLAG,0
	;JMP	SKIP1	;跳转
    
SHOW:
    ADD DL,30H		;DL加30h转化为ASCII码
    CALL OUTPUT
SKIP1:
    INC DI
    LOOP DAYIN
    MOV AH,4CH
    INT 21H

PRINT PROC
    MOV AH,9
    INT 21H
    RET   
PRINT ENDP

OUTPUT PROC
    MOV AH,2
    INT 21H
    RET
OUTPUT ENDP

Gets	 proc
;入口参数:ds:dx = 输入缓冲区首地址
;功能,从键盘读如一个字符串,存入以ds:dx所指的缓冲区
;说明:对缓冲区格式的要求同int 21h的10号功能
	push	 ax
	mov	ah,10
	int	21h
	pop	ax
	ret
Gets	 endp

Puts	proc

;入口参数:ds:dx = 输入缓冲区首地址
;功能,向显示器输出一个字符串,存入以ds:dx所指的缓冲区
;说明:对缓冲区格式的要求同int 21h的9号功能
	push	 ax
	mov	ah,9
	int	21h
	pop	ax
	ret
Puts	endp

ASC2BIN PROC
;入口参数:SI=STRX+2 = 输入缓冲区首地址
;功能:将对应内存地址单元中的字符ASCII码转化为二进制真值
;说明:CX计数器的值传入为该缓冲区字符数
A2B:
    AND BYTE PTR [SI],0FH
    INC SI
    DEC CX
    JNZ	A2B
    RET    
ASC2BIN ENDP

CRLF PROC
    MOV AH,2
    MOV DL,0DH
    INT 21H
    
    MOV DL,0AH
    INT 21H
    RET
CRLF ENDP
CODES ENDS
    END START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -