第一次实验 简单程序设计
实验教程P22-23 ②③题
STACKA SEGMENT STACK
DB 100 DUP(?)
STACKA ENDS
DATA SEGMENT
NUM1 DD 2A8B7654H
NUM2 DW 5ABCH
NUM3 DW ?
NUM4 DW ?
DATA ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,WORD PTR NUM1
MOV DX,WORD PTR NUM1+2
DIV NUM2
MOV NUM3,AX
MOV NUM4,DX
MOV AH,4CH
INT 21H
CSEG ENDS
END START
STACKA SEGMENT STACK
DB 100 DUP(?)
STACKA ENDS
DATA SEGMENT
ARY DB 34H
DATA ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA SI,ARY
MOV AL,[SI]
SHR AL,4
MOV [SI+1],AL
MOV AL,[SI]
AND AL,0FH
MOV [SI+2],AL
MOV AH,4CH
INT 21H
CSEG ENDS
END START
第二次实验 分支程序设计
实验教程P29 ①②题
STACKA SEGMENT STACK
DB 100 DUP(?)
STACKA ENDS
DATA SEGMENT
A DB 21H
B DB 23H
C DB 44H
K DB ?
DATA ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,A
CMP AL,B
JNE COMP2
CMP AL,C
JNE K1
JMP K2
COMP2: MOV BL,B
CMP BL,C
JE K1
CMP AL,C
JE K1
K0: MOV K,00H
JMP EXIT
K1: MOV K,01H
JMP EXIT
K2: MOV K,02H
JMP EXIT
EXIT: MOV AH,4CH
INT 21H
CSEG ENDS
END START
STACKA SEGMENT STACK
DB 100 DUP(?)
STACKA ENDS
DATA SEGMENT
A DB 2FH
B DB 34H
C DB 1H
D DB ?
DATA ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AL,A
CMP AL,B
JG FUN
ADD AL,B
JMP EXIT
FUN: SUB AL,B
ADC AL,C
EXIT: MOV D,AL
MOV AH,4CH
INT 21H
CSEG ENDS
END START
第三次实验 循环程序设计
实验教程P34 ②③④题。
- 存储单元DAT1及DAT2中各有10个字节的二进制数,高字节放在高位地址中。试
编写一程序将这2个数据相加,结果存放在从DAT3开始的单元中。
DATA SEGMENT
DATA1 DB 11,22,33,44,55,66,77,88,99,56
DATA2 DB 56,49,78,56,11,66,46,77,96,88
DATA3 DB 11 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA SI,DATA1
LEA DI,DATA2
LEA BX,DATA3
MOV CX,10
CLC
LL: MOV AL,[SI]
ADC AL,[DI]
MOV [BX],AL
INC SI
INC DI
INC BX
LOOP LL
MOV AH,4CH
INT 21H
CODE ENDS
END START
- 将字符串STRN(以“$”结尾)中的每一个字符均加上偶校验位,并统计有多少个字符因含有奇数个“1”而加上了校验位。统计结果存于N单元中。
DATA SEGMENT
N DB ?
STRN DB 'ABCD$'
COUNT EQU $-STRN
BUF DB COUNT DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA SI,STRN
LEA DI,BUF
MOV CX,COUNT
MOV AL,0
LL: MOV BL,[SI]
AND BL,BL
JP NEXT
INC AL
OR BL,80H
NEXT: MOV [DI],BL
INC SI
INC DI
LOOP L1
MOV N,AL
MOV AH,4CH
INT 21H
CSEG ENDS
END START
- 在FIRST开始的一片连续的数据区中存放着1O0个字节型数据,编写一个程序,统计第1个数据“0”之前的数据个数。
DATA SEGMENT
NUM DB ?
FIRST DB 10 DUP(22),89 DUP(22),0
COUNT EQU $-FIRST
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA SI,FIRST
MOV CX,COUNT
MOV AL,0
AGAIN: MOV BL,[SI]
CMP BL,00H
JNZ FUN
JMP EXIT
FUN: INC AL
INC SI
LOOP AGAIN
EXIT: MOV NUM,AL
MOV AH,4CH
INT 21H
CSEG ENDS
END START
第四次实验 子程序设计及 DOS中断调用
- 如果从键盘上依次输入的是一个数字和一个字母,则输出“RIGHT”标记后结束程序,否则输出标记“ERROR”后转向原出错处重做。试编程实现该功能。
DATA SEGMENT
MSG DB 0AH,0DH,'RIGHT',0DH,'$'
WRN DB 0AH,0DH,'ERROR',0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
AGAIN:MOV AH,01H
INT 21H
CMP AL,39H
JA EMSG
CMP AL,30H
JB EMSG
MOV AH,01H
INT 21H
CMP AL,'A'
JB EMSG
CMP AL,'Z'
JB EXIT
CMP AL,'a'
JB EMSG
CMP AL,'z'
JB EXIT
EMSG:LEA DX,WRN
MOV AH,09H
INT 21H
JMP AGAIN
EXIT:MOV DX,OFFSET MSG
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
- 编写一个程序分类统计字符个数:即接收输人的一串字符(字符个数不超过50个,该字符串用回车作为结束),并按数字、字母和其他字符分类计数,然后将结果存入dgt、letter和other3个存储单元中,并显示结果。(数字的ASCI码范围是30H39H,大写字母的ASCII码范围是41H5AH,小写字母的ASCII码范围是61H~7AH)。
DATA SEGMENT
MSG1 DB 0AH,0DH,'Number of digit.',20H,'$'
MSG2 DB 0AH,0DH,'Number of letters.',20H,'$'
MSG3 DB 0AH,0DH,'Number of other characters.',20H,'$'
BUF DB 50
DB 0
DB 50 DUP(?)
DIGIT DB ?
LETTER DB ?
OTHER DB ?
DATA ENDS
STACK1 SEGMENT STACK
DB 100 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START: MOV AX,DATA
MOV DS,AX
MOV AH,0AH
MOV DX,OFFSET BUF
INT 21H
MOV SI,OFFSET BUF
MOV CL,[SI+1]
MOV CH,00H
MOV AL,00H
MOV AH,00H
MOV BH,00H
AGAIN: MOV BL,[SI+2]
CMP BL,30H
JB OTHERA
CMP BL,3AH
JB DIGITA
CMP BL,41H
JB OTHERA
CMP BL,5BH
JB LETTERA
CMP BL,61H
JB OTHERA
CMP BL,78H
JB LETTERA
OTHERA: INC AL
JMP ENDLP
DIGITA: INC AH
JMP ENDLP
LETTERA: INC BH
ENDLP: INC SI
LOOP AGAIN
MOV DIGIT,AH
MOV LETTER,BH
MOV OTHER,AL
MOV DX,OFFSET MSG1
MOV AH,09H
INT 21H
MOV AL,DIGIT
CALL DISP
MOV DX,OFFSET MSG2
MOV AH,09H
INT 21H
MOV AL,LETTER
CALL DISP
MOV DX,OFFSET MSG3
MOV AH,09H
INT 21H
MOV AL,OTHER
CALL DISP
MOV AH,4CH
INT 21H
DISP PROC NEAR
MOV AH,00H
MOV DH,0AH
DIV DH
MOV CH,AH
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
ADD CH,30H
MOV DL,CH
MOV AH,02H
INT 21H
RET
DISP ENDP
CODE ENDS
END START
第五次实验扩展定时器/计数器接口实验
- 计数器0工作于方式3,编写初始化程序,观察OUTO信号的变化情况。修改计数初
值,观察OUTO信号的变化情况。
.486
code segment use16
assume cs:code
org 1000h
START:MOV DX,30CH ;8254计数器0初始化
MOV AL,00110110B
OUT DX,AL
MOV DX,300H ;计数器0送数
MOV AH,47000
OUT DX,AL
MOV AL,AH
OUT DX,AL
WT:JMP WT
CODE ENDS
END START
- 将计数器1和0级联,二者均工作于方式3,编写初始化程序,观察OUTl和OUTO信
号的变化,说明二者的关系。修改计数初值,观察OUT1和OUTO信号的变化情况。
.486
CODE SEGMENT USE16
ASSUME CS:CODE
ORG 1000H
START:MOV DX,30CH
MOV AL,00110110B
OUT DX,AL
MOV DX,300H
MOV AH,47000
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,30CH
MOV AL,01110110B
OUT DX,AL
MOV DX,304H
MOV AH,4700
OUT DX,AL
MOV AL,AH
OUT DX,AL
WT:JMP WT
CODE ENDS
END START
- 计数器2工作于方式1,观察通过由GATE2连接的正脉冲触发计数器开始工作的
现象。
.486
CODE SEGMENT USE16
ASSUME CS:CODE
ORG 1000H
START:MOV DX,30CH
MOV AL,10110010B
OUT DX,AL
MOV DX,308H
MOV AL,47000H
OUT DX,AL
MOV AL,AH
OUT DX,AL
WT:JMP START
CODE ENDS
END START
第六次实验
- 欲利用8255的C口输出控制两组LED小灯LO、L2、L4、L6和L1、L3、L5、L7亮、灭交替变化,请编程实现。
.486
CODE SEGMENT USE16
ASSUME CS:CODE
ORG 1000H
START:MOV DX,34CH
MOV AL,10000000B ;
OUT DX,AL
MOV DX,348H
K0: MOV AL,10101010B
OUT DX,AL
CALL DELY
MOV AL,01010101B
OUT DX,AL
CALL DELY
JMP K0
;------------------------
DELY PROC
PUSH ECX
MOV ECX,02FFFFH
DEL_AGAIN:NOP
LOOPD DEL_AGIAN
POP ECX
RET
DELY ENDP
WT:JMP WT
CODE ENDS
END START
- 利用8255的A口和B口分别实现对8个LED小灯L0L7亮灭的控制和8个开关K1K8状态的获取。现要求统计开关K1K8状态为1的个数(开关拨向前为高电平1,拨向后为低电平0),且将该数值对应的二进制数在8个LED小灯L0L7上显示出来(Li亮表示对应的二进制位为“1”,Li灭表示对应的二进制位为“0”),当开关K4的状态为1时,结束程序的运行,请编程实现。
.486
CODE SEGMENT USE16
ASSUME CS:CODE
ORG 1000H
START:MOV DX,34CH
MOV AL,10000010B
OUT DX,AL
K0: MOV DX,344H
IN AL,DX
MOV AH,AL
AND AL,00001000B
JNE WT
CALL DISP
NOT AL
MOV DX,340H
OUT DX,AL
JMP K0
DISP PROC
MOV CX,8
MOV BL,0
D1: SHL AH,1
ADC BL,0
LOOP D1
MOV AL,BL
RET
DISP ENDP
WT:JMP WT
CODE ENDS
END START
- 利用8个开关K1-K8控制8个LED小灯I0-L7的状态。要求:当开关K1拨向前,其余开关拨向后时,L0-L7从右到左逐个循环点亮直到开关状态改变;当开关K1和K2拨向前,其余开关拨向后时,L0-L7从右到左成对逐次循环点亮直到开关状态改变;当开关K1,K2和K3拨向前,其余开关拨向后时,L0~L7以3个为一组逐次循环点亮直到开关状态改变:以此类推,当全部开关拨向前时即停止运行。请编程实现。设8255的B口读开关状态,8255的C口控制LED小灯的亮、灭。
.486
CODE SEGMENT USE16
ASSUME CS:CODE
ORG 1000H
START:MOV DX,34CH
MOV AL,10000010B
OUT DX,AL
S1: MOV DX,344H
IN AL,DX
CMP AL,11111111B
JZ WT
S2: CMP AL,00000001B
JZ K1
CMP AL,00000011B
JZ K2
CMP AL,00000111B
JZ K3
CMP AL,00001111B
JZ K4
CMP AL,00011111B
JZ K5
CMO AL,00111111B
JZ K6
CMP AL,01111111B
JZ K7
JMP S1
K1: CALL L1
K2: CALL L2
K3: CALL L3
K4: CALL L4
K5: CALL L5
K6: CALL L6
K7: CALL L7
;-------------------------------------------------
L0 PROC
MOV DX,344H
IN AL,DX
RET
L0 ENDP
L00 PROC
MOV DX,348H
OUT DX,AL
RET
L00 ENDP
;-------------------------------------------
L1 PROC
L11:CALL L0
CMP AL,00000001B
JNE S1
MOV AL,11111110B
CALL L00
CALL DELY
ROL AL,1
OUT DX,AL
JMP L11
RET
L1 ENDP
L2 PROC
L21:CALL L0
CMP AL,00000011B
JNE S1
MOV AL,11111100B
CALL L00
OUT DX,AL
CALL DELY
ROL AL,1
OUT DX,AL
JMP L21
RET
L21 ENDP
;--------------------------------------
L3 PROC
L31:CALL L0
CMP AL,00000111B
JNE S1
MOV AL,11111000B
CALL L00
OUT DX,AL
CALL DELY
ROL AL,1
OUT DX,AL
JMP L31
RET
L3 ENDP
;-------------------------------------------
L4 PROC
L41:CALL L0
CMP AL,00001111B
JNE S1
MOV AL,11110000B
CALL L00
OUT DX,AL
CALL DELY
ROL AL,1
OUT DX,AL
JMP L41
RET
L41 ENDP
;----------------------------------------------
L5 PROC
L51:CALL L0
CMP AL,00011111B
JNE S1
MOV AL,11100000B
CALL L00
OUT DX,AL
CALL DELY
ROL AL,1
OUT DX,AL
JMP L51
RET
L51 ENDP
;-----------------------------------------------------
L6 PROC
L61:CALL L0
CMP AL,00111111B
JNE S1
MOV AL,110000000B
CALL L00
OUT DX,AL
CALL DELY
ROL AL,1
OUT DX,AL
JMP L61
RET
L6 ENDP
;----------------------------------------------------
L7 PROC
L71:CALL L0
CMP AL,01111111B
JNE S1
MOV AL,10000000B
CALL L00
OUT DX,AL
CALL DELY
ROL AL,1
OUT DX,AL
JMP L71
RET
L7 ENDP
DELY PROC
PUSH ECX
MOV ECX,2FFFFH
DEL_AGN:NOP
LOOPD DEL_AGN
POP ECX
RET
DELY ENDP
WT:JMP WT
CODE ENDS
END START
第七次实验
①利用实验装置上的6位8段 LED 显示器,编写一个从左到右循环显示字符“8”的程序
.486
CODE SEGMENT
ASSUME CS:CODE
ORG 1000H
START:MOV DX,34CH
MOV AL,10000000B
OUT DX,AL
MOV DX,344H;段选口
MOV AL,8DH;字符8
OUT DX,AL
K1: MOV AH,00100000B
MOV AL,AH
MOV CX,6
S1:MOV DX,340H;位选口
OUT DX,AL
CALL DELY
ROR AH,1
MOV AL,AH
LOOP S1
JMP K1
DELY PROC
MOV CX,02FFH
DELY_AGN:NOP
LOOP DELY_AGN
RET
DELY ENDP
WT:JMP WT
CODE ENDS
END START
②利用实验装置上的6位8段 LED 显示器,完成多位8段 LED 显示器的显示,即设计一个显示字符串1234.56的程序。
.486
CODE SEGMENT USE16
ASSUME CS:CODE
ORG 1000H
BEG:JMP START
MESS DB 3FH,06H,5BH,4FH,0E6H,6DH,7DH;定义0~6的字符表
DISPD DB 01H,02H,03H,04H,05H,06H;定义显缓区
START:MOV DX,34CH
MOV AL,10000000B
OUT DX,AL
S1:CALL DISP
JMP S1
;---------------------------------------------------
DISP PROC
MOV AH,01H
LEA SI,DISPD
D0: LEA BX,MESS
MOV AL,[SI]
XLAT
MOV DX,344H
OUT DX,AL
MOV DX,340H
MOV AL,AH
OUT DX,AL
CALL DELY
D1:SHL AH,1
JC END1
INC SI
JMP D0
END1:RET
DISP ENDP
;--------------------------------------------------------
DELY PROC
PUSH ECX
MOV ECX,01FFH
DELY_AGN:NOP
LOOPD DELY_AGN
POP ECX
RET
DELY ENDP
WT:JMP WT
CODE ENDS
END BEG
- 显示学号
.486
CODE SEGMENT USE16
ASSUME CS:CODE
ORG 1000H
BEG:JMP START
MESS DB 5BH,3FH,3FH,3FH,3FH,3FH,3FH,3FH ;这里填充你的学号
START:MOV DX,34CH
MOV AL,10000000B
OUT DX,AL
S1:CALL DISP
JMP S1
;-------------------------------------
DISP PROC
MOV AH,10000000B
MOV BL,0
D0: LEA SI,MESS
MOV AL,BL
XLAT
MOV DX,340H ;段选口
OUT DX,AL
MOV DX,344H ;位选
MOV AL,AH
OUT DX,AL
CALL DELY
D1:SHR AH,1
JC END1
INC BL
JMP D0
END1:RET
DISP ENDP
DELY PROC
PUSH ECX
MOV ECX,02FFH
DELY_AGN:NOP
LOOPD DELY_AGN
POP ECX
RET
DELY ENDP
WT:JMP WT
CODE ENDS
END BEG
第八次实验
1.利用扩展板并行接口模块上4×4键盘中的A、B两个键来模拟是否进行声光报警的控制。即当A键按下时,启动报警,此时蜂鸣器以2s为周期发声(响1s,停1s),实验装置中的LED小灯(D1~D8)以2s为周期闪烁:当B键按下时,停止报警,8个LED小灯全部熄灭,并结束程序。
;LED灯8255 PA
;8254 OUT1接 8255 PB7 PB3~PB0 接键盘行信号(输入) PC3~0 接列信号(输出) PC7口接蜂鸣器
.486
CODE SEGMENT USE16
ASSUME CS:CODE
ORG 1000H
BEG: JMP START
START:
MOV DX 32CH
MOV AL 00110110 ;通道0工作在3方式
OUT DX,AL
MOV AX 47000
MOV DX 320H
OUT DX AL
MOV AL AH
OUT DX AL ;让8254通道0 OUT0产生周期为1s的脉冲信号
MOV DX 32CH
MOV AL,01010110 ;通道1工作在3方式
OUT DX AL
MOV DX 324H
MOV AL 2
OUT DD AL ;OUT1产生周期为2s的脉冲信号
MOV DX,34CH
MOV AL,10000010B ;A口输出 B口输入 C口输出
OUT DX,AL
MOV AL,00H
MOV DX,348H
OUT DX,AL ;给列控制信号低电平
LP1: MOV DX,344H
IN AL,DX ;读取 行信号
AND AL,0FH
CMP AL,07H
JZ K1 ;A键被按下
CMP AL,0BH
JZ K2 ;B键被按下
JMP LP1 ;键盘没有按下继续循环
K1: CALL DLY_L0 ;消抖
CALL BAOJING
JMP LP1
K2: CALL DLY_L0 ;消抖
CALL JIESHU
WT: JMP WT
;---------------------------------------
BAOJING PROC
AGA:
MOV DX,344H
IN AL,DX ;读B口数据
AND AL,0FH
CMP AL,0FH ;判断有无按键按下
JNZ EXIT1 ;有按键按下
MOV AL,0FFH
MOV DX,340H
OUT DX,AL ;LED亮
MOV AL 80H
MOV DX 348H
OUT DX AL
CALL DLY_L0
MOV AL 00H
OUT DX AL
CALL DLY_L0
MOV DX 344H
IN AL DX ;PB7接OUT1
AND 80H
CMP AL 80H
JZ AGA ;仍为高电平跳转到AGA
AGA1:
MOV DX,344H
IN AL,DX ;读B口数据
AND AL,0FH
CMP AL,0FH ;判断有无按键按下
JNZ EXIT1 ;有按键按下
MOV AL,00H
MOV DX,340H
OUT DX,AL ;LED灭
MOV DX 344H
IN AL DX
AND 80H
CMP AL 80H
JNZ AGA1 ; 不为高电平 跳转到AGA1
JMP AGA
EXIT1: RET
BAOJING ENDP
;---------------------------------------
JIESHU PROC
MOV AL,00H
MOV DX,340H
OUT DX,AL
RET
JIESHU ENDP
;---------------------------------------
DLY_L PROC
PUSH ECX
MOV ECX,4FFFFH
DLYL_AGN:NOP
LOOPD DLYL_AGN
POP ECX
RET
DLY_L ENDP
;---------------------------------------
DLY_L0 PROC
PUSH ECX
MOV ECX,000FFH
DLYL_AGN1:NOP
LOOPD DLYL_AGN1
POP ECX
RET
DLY_L0 ENDP
;---------------------------------------
CODE ENDS
END BEG