调试软件
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