采用8253作定时/计数器,其接口地址为0120H~0123H。 要求计数器0每10ms输出一个CLK脉冲宽的负脉冲;用计数器1产生10KHz的连续方波信号,计数器2在定时5ms后产生输出高电平。输入8253的时钟频率为2MHz。 要求:画线路连接图,并编写初始化程序。 计算计数初值:
输入时钟频率为2MHz, 其周期为: 1/2000000=0.5us(微秒) 确定计数初值:
CNT0: 10ms/0.5us = 20000 CNT1: 2MHz/10KHz = 200 CNT2: 5ms/0.5us = 10000 确定控制字:
CNT0:方式2,16位计数值 0011 0100B(34H) CNT1:方式3,低8位计数值 0101 0110B(56H) CNT2:方式0,16位计数值 1011 0000B(B0H) 线路连接图:
初始化程序 CNT0:
MOV DX, 0123H MOV AL, 34H OUT DX, AL MOV DX, 0120H MOV AX, 20000 OUT DX, AL MOV AL, AH OUT DX, AL CNT1:
MOV DX,0123H MOV AL,56H OUT DX,AL MOV DX,0121H MOV AX,200 OUT DX,AL CNT2:
MOV DX,0123H MOV AL,0B0H OUT DX,AL MOV DX,0122H MOV AX,10000 OUT DX,AL MOV AL,AH OUT DX,AL
8255特点:
含3个独立的8位并行输入/输出端口,各端口均具有数据的控制和锁存能力 可通过编程设置各端口的工作方式和数据传送方向(入/出/双向)。 8255工作方式:
基本输入/输出方式(方式0) A、B、C 选通输入/输出方式(方式1) A、B 双向传送方式(方式2) 仅A口
某端口工作于哪一种方式,可通过软件编程来指定。即向8255写入方式控制字来决定其工作方式 单片8259A可支持8个中断源;
采用多片8259A级连,可最多支持64个中断源。n片8259A可支持7n+1个中断源; 级连时只能有一片8259A为主片,其余的均为从属片; 涉及到的8259A引脚包括: CAS0-CAS2;SP#/EN#;IRi;INT .4请完成以下计算:
3ACH=(1110101100)B=( 100101000000 )BCD
1.6设字长为8位,用补码形式完成下列计算,要求有运算结果并讨论是否发生溢出? 120+18 -33-37 -90-70 50+84 答:120+18
其补码形式分别为:(120)补=01111000 (18)补=00010010 01111000 + 00010010 10001010
由于Cs=0 ,Cp=1,因此有溢出,结果错误 -33-37
其补码形式为:(-33)补=11011111 (-37)补=11011011 11011111 +11011011 10111010
由于Cs=1, Cp=1,所以没有溢出,结果正确 -90-70
其补码形式为:(-90)补=10011100 (-70)补=10111010 10011100 +10111010 01010110
由于Cs=1, Cp=0,所以有溢出,结果错误
3.1指出下列各指令中源操作数和目的操作数的寻址方式: ⑵ AAA ⑶ JMP 2200H ⑵ AAA
源操作数:寄存器寻址AL(也称隐含寻址);目的操作数:寄存器寻址 ⑶ JMP 2200H
程序转移段内直接寻址方式
3.2若AX=0ABCDH,BX=7F8FH,CF=1. 求分别执行8086 CPU指令 ⑺ XOR AX, BX ⑻ IMUL BL
后,AX寄存器中的内容,并指出标志寄存器SF,ZF,AF,PF,CF及OF的状态。 ⑺ AX=D442H, SZAPCO=10X100B ⑻ AX=1683H, SZAPCO=XXXX11B 3.3 若AL=78H,BL=87H, ⑴求执行指令 ADD AL,BL DAA
之后,AL=?、标志AF=?、CF=?
⑵ 若执行指令 SUB AL,BL与DAS后,AL=?、标志AF=?、CF=? ⑴ AL=65H, AF=1, CF=1。⑵ AL=91H, AF=0, CF=1。 3.4指出下列指令中哪些是错误的,并指出错在何处?
⑺ IN AL,DX ⑻ OUT 1C0H,AX ⑺ 对 ⑻ 错,输出指令的地址若是16位,必须用DX间址。
3.5连续执行以下指令,填写执行指令的结果(MEM为存储器物理地址)。 MOV AX, 3380H MOV CX, 0F000H MOV DS, AX MOV SI, CX
SUB CX, AX ;⑴CX= bc80h H , CF= 0 B MOV [SI], CX ;⑵[SI]= 80 H, [SI+1]= bc H SBB [SI], AL ;⑶[SI]= 0 H, MEM= f000 H
INC BYTE [SI] ;⑷[SI]= 1 H, ZF、CF、PF=0 、0 、1 B MOV AL, 08
SBB AX, 09 ;⑸AX= 32ff H, CF、AF= 0 、1 B AAS ;⑹AX= 3109 H, CF、AF= 1 、1 B SUB AL,68H ;⑺AL= a1 H, CF、AF= 1 、0 B DAS ;⑻AL= 41 H AND AL, 0FH MOV BX,-10
NEG BX ;⑼BX= 0a H MOV DL, 60H
MUL DL ;﹙10﹚ AX= 60 H OR AX, 0FF00H
CWD ; ﹙11﹚AX= ff60 H
IDIV BX ; ﹙12﹚AX= fff0 H, DX= 0 H MOV AH, 4CH INT 21H
3.6下列程序段执行后 AX=?
设数据段有: TABLE DW 158,258,358,458 ENTRY DW 3
代码段 对DS初始化
MOV BX, OFFSET TABLE MOV SI, ENTRY MOV AX, [BX+SI]
3.6 解答: AX=6601H
3.7 将AL中的8位二进制数按倒序方式重新排列,即AL原来为D7D6?D0,倒序后AL=D0D1?D7.
3.7参考答案 ?
MOV CX, 8 L: SHL AL, 1 RCR BL, 1 LOOP L MOV AL, BL
?
3.8 若起始地址偏移量为2000H的内存单元存放有100个ASCII码字符,现给这些字符添加奇偶校验位(bit7),使每个字符中“1”的个数为偶数,在顺序输出到地址为100H的端口. 3.8解答
MOV SI, 2000H MOV CX, 100 MOV DX, 100H
NEXT2: MOV AL, [SI] ;取字符串中字符送AL AND AL, 0FFH ;改变标志位
JPE NEXT1 ;“1”的个数为偶,bit7不变 OR AL, 80H ;“1”的个数为奇,bit7变为1 NEXT1: OUT DX, AL INC SI
LOOP NEXT2 MOV AH, 4CH INT 21H
3.9 若SS=1652H, SP=2100H, AX=1234H, BX=5678H, FR=2115,试说明执行指令 PUSH AX PUSH BX PUSHF POP CX POP
之后,SP=? SS=? CX=? DX=? 并画图指出堆栈中各单元的内容. 3.9解答: SS=1652H 地址 RAM SP=20FEH 20FAH 15 CX=2115H 20FBH 21 DX=5678H 20FCH 78 栈中各单元内容如下所示: 20FDH 56 20FEH 34 20FFH 12 4.4.3 循环程序设计 2100H XX
循环程序的结构分为单循环、双循环和多重循环3种。三重以上的循环程序比较复杂。从结构上讲,循环程序分为循环准备、循环体和循环控制3部分。通常使用寄存器或者内存单元作为循环计数器。从循环结构的程序实现上,通常分为WHILE-DO结构(当型循环)和DO-UNTIL(直到型循环)。WHILE-DO结构的主要设计思想是,当循环控制条件满足时,执行循环体程序,否则退出循环。DO-UNTIL结构的主要设计思想时,先执行循环体程序,再判断控制条件是否满足,若不满足则再次执行循环体程序,否则退出循环。循环程序的结构如图6.5所示。 【例4.4.5】找最大数。
假设从BUF单元开始为一个ASCII码字符串,找出其中的最大数送屏幕显示。程序框图如图6.6所示。 [解法1程序清单]
;FILENAME: 445_1.ASM .486
DATA SEGMENT USE16
BUF DB ′QWERTYUIOP123 ′
COUNT EQU ﹩-BUF ;统计串长度 MAX DB ′MAX= ′,?,0DH,0AH, ′﹩ ′
DATA ENDS CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX
MOV AL,0 ;无符号最小数0→AL
LEA BX,BUF ;串首址偏移量→BX MOV CX,COUNT ;串长度→CX LAST: CMP [BX],AL ;比较
JC NEXT
MOV AL,[BX] ;大数→AL NEXT: INC BX
LOOP LAST ;循环计数
MOV MAX+4,AL ;最大数→MAX+4单元 MOV AH,9
MOV DX,OFFSET MAX
INT 21H ;显示结果 MOV AH,4CH
INT 21H ;返回DOS CODE ENDS
END BEG
ASCII码字符应看作是无符号数,而无符号数的最小值为0,所以在第1次比较的时候,把0 →AL寄存器。各个数都和AL 相比,每次比较都把较大的数放入AL寄存器中。N个数需比较N次,如果把第一个数送AL作为初始化比较对象,那么N个数只需比较N -1次。
在循环程序中,循环计数控制着循环体的执行次数,通常使用寄存器或者内存单元作循环计数器,也可以使用“循环结束标志”来控制循环。我们仍以找最大数为例,在下面的解法2程序中,在BUF单元字符串的末尾,额外地增设了一个FLAG单元,其中存放“-1”,它就是字符串的结束标志。程序首先判断BX间地址的单元内容是否是-1,若是,表明在此之前的数都判断过了,可以结束循环了。什么数可以作为循环结束标志呢?不属于要比较的数据都可以作循环结束的标志。采用循环结束标志来结束循环,可以不使用循环计数器,在多重循环的程序中可以省去一重循环计数。 [解法2程序清单]
;FOLENAME:445_2.ASM .486
DATA SEGMENT USE16
BUF DB ′QWERTYUIOP123 ′
FLAG DB -1 ;设置串结束标志 MAX DB ′MAX=′,?,0DH,0AH,′﹩′ DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX
MOV AL,0 ;无符号最小数0→AL LEA BX,BUF ;串首址偏移量→BX
LAST: CMP BYTE PTR[BX],-1 ;[BX]=串结束标志? JE DISP ;是,转 CMP [BX],AL
JC NEXT
MOV AL,[BX] ;大数→AL
NEXT: INT BX JMP LAST
DISP: MOV MAX+4,AL ;最大数→MAX+4单元 MOV AH,9
MOV DX,OFFSET MAX
INT 21H ;显示结果 MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END BEG