8253 汇编实验

调试软件

win10上可用emu8086调试,运行后可单步调试,查看寄存器、内存等
在这里插入图片描述
8253实验代码及menu8086编译工具百度网盘链接:
提取码:8086,里面包含4份代码

实验内容

在这里插入图片描述
在这里插入图片描述

实验2.3参考代码

参考一

IO8253A EQU 280H
IO8253B EQU 281H
IO8253C EQU 282H
IO8253D EQU 283H

DATAS SEGMENT
    TEMP DW 0, 0, 0, 0;四个字依存储为,键盘输入值暂存,T0计数值,T1计数值,是否继续标志位(0结束,1继续)
    STRING_1 DB 'counter1:', '$'
    STRING_2  DB 'counter2:', '$'
    STRING_3 DB 'continue?(y/n)', '$'
DATAS ENDS

STACKS SEGMENT
    DW 256 DUP(0)
STACKS ENDS

CODES SEGMENT
      ASSUME CS:CODES,DS:DATAS,SS:STACKS
  
  
START:
	 MOV  AX,DATAS
     MOV  DS,AX
     
MAIN:
	MOV AX, 0

	LEA  DX, STRING_1
	MOV  AH, 9		;9号功能显示提示字符串
	INT  21H
	CALL KEYSCAN
	MOV AX, [SI] 
	AND  AL, 0FEH	;最低位清零,计数值为偶数输出方波
	MOV [SI+2], AX	;保存T0参数存到

	LEA  DX, STRING_2
	MOV  AH, 9		;9号功能显示提示字符串
	INT  21H
	CALL KEYSCAN
	MOV AX, [SI]
	MOV [SI+4], AX	;保存T0参数存到
	
	LEA  DX, STRING_3
	MOV  AH, 9
	INT  21H
	CALL ISY
	MOV  AX, [SI+6]
	CMP  AX, 0
	JZ   STOP
	
	CALL SET
	
	MOV  AH, 2			;2号功能
	MOV  DX,  0DH       ;加回车符
	INT  21H
	MOV  DL,  0AH       ;加换行符
	INT  21H
	
  	JMP MAIN

STOP:
	MOV AX, 4C00H
	INT 21H


;判断按下y还是n,y继续n结束
ISY PROC NEAR
YORN:
	MOV AH, 8
    INT 21H
    CMP AL, 'y'
    JE Y0
    CMP AL, 'n'
    JE N0
    JMP YORN

Y0:
	MOV AX, 1
	MOV [SI+6], AX
	JMP RETURN1

N0:
	MOV AX, 0
	MOV [SI+6], AX
	JMP RETURN1
	
RETURN1:
	MOV  AH, 2
	MOV  DX,  0DH       ;加回车符
	INT  21H
	
	MOV  DL,  0AH       ;加换行符
	INT  21H
	RET 
ISY ENDP


;定时器/计数器设置子程序
SET PROC NEAR
S:  
	LEA SI, TEMP
	
	;TO配置
	MOV DX, IO8253D
	MOV AL, 00110110B
	OUT DX, AL
	MOV DX, IO8253A
	MOV AX, [SI+2]
	OUT DX, AL
	MOV AL, AH
	OUT DX, AL
	
	;T1配置
	MOV DX, IO8253D
	MOV AL, 01110110B
	OUT DX, AL
	MOV DX, IO8253B
	MOV AX, [SI+4]
	OUT DX, AL
	MOV AL, AH
	OUT DX, AL
	RET    
SET ENDP


;键盘读取子程序
KEYSCAN PROC NEAR 
SK:
	LEA SI, TEMP
	MOV AX, 0
	MOV [SI], AX
	MOV  CX, 0

KEYBORD:  
    MOV AH, 8	;8号功能
    INT 21H
    CMP AL, 0DH
    JNE KEY
    JMP RETURN

KEY: 
    CMP AL, 39H		;不是'0'-'9'等待
    JA CONTINUE
    CMP AL, 30H
    JB CONTINUE
    
	SUB AL, 30H		;转换成数字
	MOV BL, AL
	MOV BH, 0
    MOV AH, 0
    PUSH BX
    
    MOV AX, [SI]	;每收到一个数字之前的乘10,再加上刚输入的
    MOV DX, 0
    MOV BX, 10
    MUL BX			;双字节乘法
    POP BX
	ADD AX, BX
	MOV [SI], AX	;保存到si指向内存单元
	
	MOV DL, BL
	ADD DL, 30H
	MOV DH, 0
	MOV AH, 2
	INT 21H
	 
	INC CX
	CMP CX, 5
	JNE CONTINUE
	MOV  AX, SI
	CMP  AX, 65535	;大于65535取65535,防止溢出
	JB   RETURN
	MOV  AX, 65535
	MOV [SI], AX
	JMP  RETURN

RETURN:
	MOV  AH, 2
	MOV  DX,  0DH       ;加回车符
	INT  21H
	MOV  DL,  0AH       ;加换行符
	INT  21H
	RET
	
CONTINUE:
    JMP KEYBORD
KEYSCAN ENDP

CODES ENDS
END START

参考二

IO8253A EQU 280H
IO8253B EQU 281H
IO8253C EQU 282H
IO8253D EQU 283H

DATAS SEGMENT
    TEMP DW 0, 0, 0
    STRING_1 DB 'counter1:', '$'
    STRING_2 DB 'counter2:', '$'
    STRING_3 DB 'continue?(y/n)', '$'
DATAS ENDS

STACKS SEGMENT
	   DW 256H dup(?)
STACKS ENDS

CODES SEGMENT
      ASSUME CS:CODES,DS:DATAS,SS:STACKS
  
  
START:
	 MOV  AX,DATAS
     MOV  DS, AX
     MOV  AX, STACKS
     MOV  SS, AX
     
MAIN:
	MOV AX, 0
	LEA  DX, STRING_1
	MOV  AH, 9		;9号功能显示提示字符串
	INT  21H
	CALL KEYSCAN
	MOV AX, [SI]
	AND AL, 0FEH	;最低位清零,计数值为偶数输出方波
	MOV [SI+2], AX	;保存T0参数存到
	
	LEA  DX, STRING_2
	MOV  AH, 9		;9号功能显示提示字符串
	INT  21H
	CALL KEYSCAN
	MOV AX, [SI]
	MOV [SI+4], AX	;保存T0参数存到
	
	LEA  DX, STRING_3
	MOV  AH, 9
	INT  21H
	CALL ISY
	
	CALL SET	    ;设置TO、T1
	
	MOV  AH, 2
	MOV  DX,  0DH   ;加回车符
	INT  21H
	MOV  DL,  0AH   ;加换行符
	INT  21H
	
  	JMP MAIN


ISY PROC NEAR
Y_OR_N:
	MOV AH, 8
    INT 21H
    CMP AL, 'y'
    JE Y0
    CMP AL, 'n'
    JE N0
    JMP Y_OR_N

Y0:
	MOV  AH, 2
	MOV  DX,  0DH		;加回车符
	INT  21H
	
	MOV  DL,  0AH       ;加换行符
	INT  21H
	RET 

N0:
	MOV AX, 4C00H
	INT 21H
ISY ENDP


;定时器/计数器设置子程序
SET PROC NEAR
S:  
	LEA SI, TEMP
	
	;TO配置
	MOV DX, IO8253D		;T0工作方式配置
	MOV AL, 00110110B
	OUT DX, AL
	
	MOV AX, [SI+2]		;取T0计数值
	
	MOV DX, IO8253A
	OUT DX, AL
	MOV AL, AH
	OUT DX, AL
	
	;T1配置
	MOV DX, IO8253D		;T1工作方式配置
	MOV AL, 01110110B
	OUT DX, AL
	
	MOV AX, [SI+4]		;取T1赋计数值
	
	MOV DX, IO8253B
	OUT DX, AL
	MOV AL, AH
	OUT DX, AL
	RET    
SET ENDP


;键盘读取子程序
KEYSCAN PROC NEAR
SK:
	LEA SI, TEMP
	MOV AX, 0
	MOV [SI], AX
	MOV CX, 0
	
KEYBORD:  
    MOV AH, 8
    INT 21H
    CMP AL, 0DH
    JNE KEY
    JMP RETURN

KEY: 
    CMP AL, 39H		;不是'0'-'9'等待
    JA CONTINUE
    CMP AL, 30H
    JB CONTINUE
    
	SUB AL, 30H		;转换成数字
	MOV BL, AL
	MOV BH, 0
    MOV AH, 0
    PUSH BX
    
    MOV AX, [SI]	;每收到一个数字之前的乘10,再加上刚输入的
    MOV DX, 0
    MOV BX, 10
    MUL BX			;双字节乘法
    POP BX
	ADD AX, BX
	MOV [SI], AX	;保存到si指向内存单元
	
	MOV DL, BL
	ADD DL, 30H
	MOV DH, 0
	MOV AH, 2
	INT 21H
	 
	INC CX
	CMP CX, 5
	JNE CONTINUE
	MOV  AX, SI
	CMP  AX, 65535	;大于65535取65535,防止溢出
	JB   RETURN
	MOV  AX, 65535
	MOV [SI], AX
	JMP  RETURN

RETURN:
	MOV  AH, 2
	MOV  DX,  0DH       ;加回车符
	INT  21H
	MOV  DL,  0AH       ;加换行符
	INT  21H
	
	RET
	
CONTINUE:
    JMP KEYBORD
KEYSCAN ENDP

CODES ENDS
END START

参考三

IO8253A EQU 280H
IO8253B EQU 281H
IO8253C EQU 282H
IO8253D EQU 283H

DATAS SEGMENT
    TEMP DW 0
    TEMP_T0 DW 0
    TEMP_T1 DW 0
    STRING1 DB 'counter1:', '$'
    STRING2 DB 'counter2:', '$'
    STRING3 DB 'continue?(y/n)', '$'
DATAS ENDS

STACKS SEGMENT
	   DW 256H dup(?)
STACKS ENDS

CODES SEGMENT
      ASSUME CS:CODES,DS:DATAS,SS:STACKS
  
  
START:
	 MOV  AX,DATAS
     MOV  DS, AX
     MOV  AX, STACKS
     MOV  SS, AX
     
MAIN:
	MOV AX, 0
	LEA  DX, STRING1
	MOV  AH, 9		;9号功能显示提示字符串
	INT  21H
	CALL KEYSCAN
	MOV AX, TEMP
	AND AL, 0FEH	;最低位清零,计数值为偶数输出方波
	MOV TEMP_T0, AX	;保存T0参数存到
	
	LEA  DX, STRING2
	MOV  AH, 9		;9号功能显示提示字符串
	INT  21H
	CALL KEYSCAN
	MOV AX, TEMP
	MOV TEMP_T1, AX	;保存T0参数存到
	
	LEA  DX, STRING3
	MOV  AH, 9
	INT  21H
	CALL ISY
	
	CALL SET	    ;设置TO、T1
	
	MOV  AH, 2
	MOV  DX,  0DH   ;加回车符
	INT  21H
	MOV  DL,  0AH   ;加换行符
	INT  21H
	
  	JMP MAIN


ISY PROC NEAR
Y_OR_N:
	MOV AH, 8
    INT 21H
    CMP AL, 'y'
    JE Y0
    CMP AL, 'n'
    JE N0
    JMP Y_OR_N

Y0:
	MOV  AH, 2
	MOV  DX,  0DH		;加回车符
	INT  21H
	
	MOV  DL,  0AH       ;加换行符
	INT  21H
	RET 

N0:
	MOV AX, 4C00H
	INT 21H
ISY ENDP


;定时器/计数器设置子程序
SET PROC NEAR
S:  	
	;TO配置
	MOV DX, IO8253D		;T0工作方式配置
	MOV AL, 00110110B
	OUT DX, AL
	
	MOV AX, TEMP_T0		;取T0计数值
	
	MOV DX, IO8253A
	OUT DX, AL
	MOV AL, AH
	OUT DX, AL
	
	;T1配置
	MOV DX, IO8253D		;T1工作方式配置
	MOV AL, 01110110B
	OUT DX, AL
	
	MOV AX, TEMP_T1		;取T1赋计数值
	
	MOV DX, IO8253B
	OUT DX, AL
	MOV AL, AH
	OUT DX, AL
	RET    
SET ENDP


;键盘读取子程序
KEYSCAN PROC NEAR
SK:
	MOV TEMP, 0
	MOV CX, 0
	
KEYBORD:  
    MOV AH, 8
    INT 21H
    CMP AL, 0DH
    JNE KEY
    JMP RETURN

KEY: 
    CMP AL, 39H		;不是'0'-'9'等待
    JA CONTINUE
    CMP AL, 30H
    JB CONTINUE
    
	SUB AL, 30H		;转换成数字
	MOV BL, AL
	MOV BH, 0
    MOV AH, 0
    PUSH BX
    
    MOV AX, TEMP	;每收到一个数字之前的乘10,再加上刚输入的
    MOV DX, 0
    MOV BX, 10
    MUL BX			;双字节乘法
    POP BX
	ADD AX, BX
	MOV TEMP, AX	;保存到TEMP
	
	MOV DL, BL
	ADD DL, 30H
	MOV DH, 0
	MOV AH, 2
	INT 21H
	 
	INC CX
	CMP CX, 5
	JNE CONTINUE
	MOV AX, SI
	CMP AX, 65535	;大于65535取65535,防止溢出
	JB  RETURN
	MOV AX, 65535
	MOV TEMP, AX
	JMP RETURN

RETURN:
	MOV  AH, 2
	MOV  DX,  0DH       ;加回车符
	INT  21H
	MOV  DL,  0AH       ;加换行符
	INT  21H
	
	RET
	
CONTINUE:
    JMP KEYBORD
KEYSCAN ENDP


CODES ENDS
END START

参考4

IO8253A EQU 280H
IO8253B EQU 281H
IO8253C EQU 282H
IO8253D EQU 283H

DATAS SEGMENT
    TEMP DW 0
    TEMP_T0 DW 0
    TEMP_T1 DW 0
    STRING1 DB 'counter1:', '$'
    STRING2 DB 'counter2:', '$'
    STRING3 DB 'continue?(y/n)', '$'
    BUF DB 0,0,0,0,0,0
DATAS ENDS

STACKS SEGMENT
	   DW 256H dup(?)
STACKS ENDS

CODES SEGMENT
      ASSUME CS:CODES,DS:DATAS,SS:STACKS
  
  
START:
	 MOV  AX,DATAS
     MOV  DS, AX
     MOV  AX, STACKS
     MOV  SS, AX
     
MAIN:
	MOV AX, 0
	LEA  DX, STRING1
	MOV  AH, 9		;9号功能显示提示字符串
	INT  21H
	CALL KEYSCAN
	MOV AX, TEMP
	AND AL, 0FEH	;最低位清零,计数值为偶数输出方波
	MOV TEMP_T0, AX	;保存T0参数存到
	
	LEA  DX, STRING2
	MOV  AH, 9		;9号功能显示提示字符串
	INT  21H
	CALL KEYSCAN
	MOV AX, TEMP
	MOV TEMP_T1, AX	;保存T0参数存到
	
	LEA  DX, STRING3
	MOV  AH, 9
	INT  21H
	CALL ISY
	
	CALL SET	    ;设置TO、T1
	
	MOV  AH, 2
	MOV  DX,  0DH   ;加回车符
	INT  21H
	MOV  DL,  0AH   ;加换行符
	INT  21H
	
  	JMP MAIN


ISY PROC NEAR
Y_OR_N:
	MOV AH, 8
    INT 21H
    CMP AL, 'y'
    JE Y0
    CMP AL, 'n'
    JE N0
    JMP Y_OR_N

Y0:
	MOV  AH, 2
	MOV  DX,  0DH		;加回车符
	INT  21H
	
	MOV  DL,  0AH       ;加换行符
	INT  21H
	RET 

N0:
	MOV AX, 4C00H
	INT 21H
ISY ENDP


;定时器/计数器设置子程序
SET PROC NEAR
S:  	
	;TO配置
	MOV DX, IO8253D		;T0工作方式配置
	MOV AL, 00110110B
	OUT DX, AL
	
	MOV AX, TEMP_T0		;取T0计数值
	
	MOV DX, IO8253A
	OUT DX, AL
	MOV AL, AH
	OUT DX, AL
	
	;T1配置
	MOV DX, IO8253D		;T1工作方式配置
	MOV AL, 01110110B
	OUT DX, AL
	
	MOV AX, TEMP_T1		;取T1赋计数值
	
	MOV DX, IO8253B
	OUT DX, AL
	MOV AL, AH
	OUT DX, AL
	RET    
SET ENDP


;键盘读取子程序
KEYSCAN PROC NEAR
SK:
    MOV TEMP, 0
	LEA DX, BUF
	LEA SI, BUF
	MOV CX, 6
	MOV [SI], CX	;[DX]存放缓冲区最大容量
	MOV AH, 10		;10号功能
	INT 21H
	
	MOV AH, 2H	
	MOV DX,  0DH       ;加回车符
	INT 21H
	MOV DL,  0AH       ;加换行符
	INT 21H
	
	LEA SI, BUF
	MOV CH, 0
	INC SI
	MOV AL, [SI]
	MOV CL, [SI]
	MOV AH, 0
	CMP AL, 0
	JE   RETURN
	INC  SI

KEYBORD:
	MOV AL, [SI]	;寄存器相对寻址
	MOV AH, 0
    CMP AL, 39H		;不是'0'-'9'等待
    JA CONTINUE
    CMP AL, 30H
    JB CONTINUE
    
	SUB AL, 30H		;转换成数字
	MOV BL, AL
	MOV BH, 0
    MOV AH, 0
    PUSH BX
    
    MOV AX, TEMP	;每收到一个数字之前的乘10,再加上刚输入的
    MOV DX, 0
    MOV BX, 10
    MUL BX			;双字节乘法
    POP BX
	ADD AX, BX
	MOV TEMP, AX	;保存到temp

CONTINUE:
	INC SI
	INC CH
	CMP CH, CL
	JE RETURN
    JMP KEYBORD
    
RETURN:
	RET
KEYSCAN ENDP


CODES ENDS
END START
  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值