1章 绪论
1.2 用8位二进制码,写出下列十进制数的原码和补码表示 解释:
原码:最高位为符号位,正数符号位为0,负数符号位为1。
补码:正数的补码与原码相同;负数的补码:由其原码除符号位保持不变外,其余各位按位取反,末位加1而成。 解:
(1) [+65]原 = 0100 0001B 注:65 = 64 + 1
[+65]补 = [+65]原 = 0100 0001B 注:正数补码与原码相同 (2) [+115]原 = 0111 0011B 注:115 = 64 + 32 + 16 + 2 + 1 [+115]补 = [+115]原 = 0111 0011B 注:正数补码与原码相同 (3) [-65]原 = 1100 0001B 注:65 = 64 + 1
[-65]补 = 1011 1110B + 1B = 1011 1111B 注:除符号位外,按位取反,末位加1 (4) [-115]原 = 1111 0011B 注:115 = 64 + 32 + 16 + 2 + 1 [-115]补 = 1000 1100B + 1B = 1000 1101B 注:除符号位外,按位取反,末位加1 1.3 用16位二进制码,写出下列十进制数的原码和补码表示。
(1) [+120]原 = 0000 0000 0111 1000B 注:120 = 64 + 32 + 16 + 8 [+120]补 = [+120]原 = 0000 0000 0111 1000B 注:正数补码与原码相同 (2) [-120]原 = 1000 0000 0111 1000B 注:120 = 64 + 32 + 16 + 8 [-120]补 = 1111 1111 1000 0111B + 1B = 1111 1111 1000 1000B 注:除符号位外,按位取反,末位加1
(3) [+230]原 = 0000 0000 1110 0110B 注:230 = 128 + 64 + 32 + 4 + 2 [+230]补 = 0000 0000 1110 0110B 注:正数补码与原码相同 (4) [-230]原 = 1000 0000 1110 0110B 注:230 = 128 + 64 + 32 + 4 + 2 [-230]补 = 1111 1111 0001 1001B + 1B = 1111 1111 0001 1010B 注:除符号位外,按位取反,末位加1 1.4 写出下列用补码表示的二进制数的真值。 解释:
正数的补码 = 原码
负数的补码:再次求补码得到其原码 解:
(1) 0011 0111 正数的补码 真值:32 + 16 + 4 + 2 + 1 = +55 (2) 0101 1001 正数的补码 真值:64 + 16 + 8 + 1 = +89
(3) 1000 1101 负数的补码 真值:1111 0010B + 1B = 1111 0011B = -115 (4) 1111 1001 负数的补码 真值:1000 0110B + 1B = 1000 0111B = -7
第2章 Intel 8086微处理器
2.2 在存储器中存放的数据如图所示。试读出75422H和75424H字节单元的内容是什么?读出75422H和75424H字单元的内容是什么? 解:
75422H字节单元的内容:9CH 75424H字节单元的内容:5DH 75422H字单元的内容:249CH 75424H字单元的内容:0E65DH
2.3 段地址和偏移地址为1000H:117AH的存储单元的物理地址是什么?而1109H:00EAH或1025H:0F2AH的存储单元的物理地址又是什么?这说明了什么问题? 解释:物理地址 = 段地址 × 10H + 偏移地址 解:
1000H : 117AH存储单元的物理地址1000H × 10H + 117AH = 1117AH 1109H : 00EAH存储单元的物理地址1109H × 10H + 00EAH = 1117AH 1025H : 0F2AH存储单元的物理地址1025H × 10H + 0F2AH = 1117AH
说明:不同的段地址不同的偏移地址可以指向同一个物理地址,即各个逻辑段可以相互重叠。
2.4 在存储器分段结构中,每个段区最大可占用多少地址范围,为什么?如果在8086的机器中,若段间不允许重叠,那么最多可分多少个段区? 解:
若为8086微处理器,每个段区最大可占用64KB,因为所有内部寄存器都只有16位。 若每段64KB,最多可分16个段区,因为8086微处理器有20条地址线,可访问存储器的最大容量为1MB。
2.5 如果从存储器的2000H地址开始分配段区,要求数据段占用1KB范围,堆栈段占用512B范围,代码段占用8KB范围。按数据段、堆栈段和代码段的顺序连续存放,试画出存储器分段地址分配示意图,图中应写明各段寄存器的内容? 解:
02000H 02400H 02600H
注:
1KB 512B 8KB DS:0200 SS:0240H CS:0260H
7542 0H 1H 2H 3H 4H 5H 存储器 ? 13H 78H 9CH 24H 5DH E6H 1KB:00 0000 0000B~11 1111 1111B
SS:起始物理地址2000H + 1KB = 2000H + 400H = 02400H 512B:0 0000 0000B~1 1111 1111B
CS:起始物理地址2400H + 512B = 2400H + 200H = 02600H 2.6 指出下列指令的源和目标操作数的寻址方式: 题号 指令 MOV ARRAY,BX ADC CX,ALPHA[BX][SI] 目的操作数的寻址方式 直接寻址 寄存器寻址 源操作数的寻址方式 寄存器寻址 带位移的基址变址寻址 立即寻址 寄存器寻址 寄存器间接寻址 (1) (2) (3) (4) (5) (6) AND GAMMA[DI],11011000B 带位移的变址寻址 INC BL TEST ES:[SI],DX SBB SI,[BP] 寄存器寻址 寄存器间接寻址 寄存器寻址 2.7 现有DS=2000H,BX=0100H,SI=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=B7H,(21203H)=65H,试说明下列各指令执行完后AX寄存器的内容。 题号 指令 MOV AX,1200H MOV AX,BX MOV AX,[1200H] MOV AX,[BX] MOV AX,1100H[BX] MOV AX,[BX][SI] AX寄存器的内容 1200H 0100H 4C2AH 3412H 4C2AH 7856H 简单解释 立即数赋给AX 寄存器BX值赋给AX PA=DS×16+1200H=21200H PA=DS×16+BX=20100H PA=DS×16+BX+1100H=21200H PA=DS×16+BX+SI=20102H PA=DS×16+BX+SI+1100H=21202H (1) (2) (3) (4) (5) (6) (7) MOV AX,1100H[BX][SI] 65B7H 2.8 假定DS=2000H,ES=2100H,SS=1500H,SI=00A0H,BX=0100H,BP=0010H,数据段中变量名VAL的偏移地址值为0050H,试指出下面源操作数字段的寻址方式是什么?其物理地址值是多少? 题号 指令 源操作数的寻址方式 立即寻址 寄存器寻址 直接寻址 寄存器间接寻址 寄存器间接寻址 带位移的基址寻址 基址变址寻址 直接寻址 源操作数的物理地址 在代码段中,与CS、IP有关 在寄存器中 DS×16+100H=20100H DS×16+BX=20100H SS×16+BP =15010H DS×16+BX +10=2010AH DS×16+BX +SI=201A0H DS×16+VAL=20050H (1) (2) (3) (4) (5) (6) (7) (8) MOV AX, 00ABH MOV AX,BX MOV AX,[100H] MOV AX,[BX] MOV AX,[BP] MOV AX,[BX+10] MOV AX,[BX][SI] MOV AX,VAL (9) MOV AX,ES:[BX] 寄存器间接寻址 寄存器间接寻址 带位移的基址寻址 ES×16+BX=21100H DS×16+SI=200A0H DS×16+BX+VAL=20150H (10) MOV AX,[SI] (11) MOV AX,VAL[BX] (12) MOV AX,VAL[BX][SI] 带位移的基址变址寻址 DS×16+BX+SI+VAL=201F0H 2.9 设AX=1122H,BX=3344H,CX=5566H,SP=2000H,试分析下列程序段执行后,AX、BX、CX、SP中的内容各为多少?并画出堆栈变化示意图。 解:
第1条指令 PUSH AX
第2条指令 PUSH BX
第3条指令 PUSH CX
第4条指令 POP AX
第5条指令 POP CX
AX=1122H BX=3344H SP→ 22H CX=5566H
11H SP=1FFEH
SP→ 44H AX=1122H 33H BX=3344H 22H CX=5566H
11H SP=1FFCH
SP→ 66H 55H
44H AX=1122H 33H BX=3344H 22H CX=5566H
11H SP=1FFAH
SP→ 44H AX=5566H 33H BX=3344H 22H CX=5566H
11H SP=1FFCH
AX=5566H BX=3344H SP→ 22H CX=3344H
11H SP=1FFEH
2.10 下列程序段中每一条指令执行完后,AX中的十六位进制内容是什么? 指令 MOV AX,0 DEC AX ADD AX,7FFFFH ADD AX,2 NOT AX SUB AX,0FFFFH ADD AX,8000H OR AX,0BFDFH AX中的内容 AX=0000H AX=0FFFFH AX=7FFEH AX=8000H AX=7FFFH AX=8000H AX=0000H AX=0BFDFH 指令 1100 1101 1010 1011算术左移 AND AX,0EBEDH AX=0ABCDH XCHG AH,AL SAL AX,1 RCL AX,1 AX=0CDABH AX=9B56H (CF=1,PF=1) AX=36ADH (CF=1,PF=1,OF=1) 1001 1011 0101 0110带进位循环左移 循环移位指令不影响除CF和OF以外的其他条件标志。
移位指令根据移位后的结果设置SF、ZF和PF位,AF位则无定义。 RCL:OF=1最高有效位的值发生变化;PF保留原来的值;
2.11 将十六进制数62A0H与下列各个数相加,试给出和数及标志位AF,SF,ZF,CF,OF和PF的状态。 (1) 9D60H
0110?10011000000101010110100000110000000000000 0000和数:0H
AF=0,SF=0,ZF=1,CF=1,OF=0,PF=1 (2) 4321H
0110?01000101000101010001100100101110000000001 0001和数:0A5C1H
AF=0,SF=1,ZF=0,CF=0,OF=1,PF=0
2.12 从下列各个数中减去4AE0H,试给出差值及标志位AF,SF,ZF,CF,OF和PF的状态。
(1)1234H (2)9090H 解:
0001001011100001101000000[1234H][4AE0H]
?010010101110011101010100[0C754H]AF=0,SF=1,ZF=0,CF=1,OF=0,PF=0
100100100000010010000010110110000[9090H][45B0H]?0100101011100000[4AE0H]
AF=0,SF=0,ZF=0,CF=0,OF=1,PF=0
2.13 假设BX=00E3H,字变量VALUE中存放的内容为79H,确定下列各条指令单独执行后的结果。 题号 指令 BX寄存器的内容 简单解释 009AH 0061H 00FBH 001CH 0000H 00E3H 0000 0000 1110 0011 XOR 0000 0000 0111 1001 0000 0000 1110 0011 AND 0000 0000 0111 1001 0000 0000 1110 0011 OR 0000 0000 0111 1001 0000 0000 1110 0011 XOR 0000 0000 1111 1111 TEST指令只影响标志位,不影响结果 (1) (2) (3) (4) (5) (6) XOR BX,VALUE AND BX,VALUE OR BX,VALUE XOR BX,0FFH AND BX,0 TEST BX,01H (1) XOR OSZAPC:0XXUX0 SF=0; ZF=0; PF=1 (2) AND OSZAPC:0XXUX0 SF=0; ZF=0; PF=0 (3) OR OSZAPC:0XXUX0 SF=0; ZF=0; PF=0 (4) XOR OSZAPC:0XXUX0 SF=0; ZF=0; PF=0 (5) AND OSZAPC:0XXUX0 SF=0; ZF=1; PF=1 (6) TEST OSZAPC:0XXUX0 SF=0; ZF=0; PF=0
2.14 试写出执行下列指令序列后BX寄存器的内容。执行前BX=6D16H。 MOV CL, 7 SHR BX, CL 解:
BX=6D16H= 0110 1101 0001 0110B 执行后:0000 0000 1101 1010B = 00DAH
2.15 假定DX=00B9H,CL=3,CF=1,确定下列各条指令单独执行后DX中的值。 题号 指令 (1) (2) (3) (4) SHR DX,1 DX寄存器的内容 简单解释 005CH 00B9H = 0000 0000 1011 1001B逻辑右移 00B9H = 0000 0000 1011 1001B算术右移 00B9H = 0000 0000 1011 1001B逻辑左移 B9H = 1011 1001B 逻辑左移 SAR DX,CL 0017H SHL DX,CL 05C8H SHL DL,1 0072H (5) (6) (7) (8) (9) ROR DX,CL 2017H ROL DL,CL 00CDH SAL DH,1 00B9H 00B9H = 0000 0000 1011 1001B 循环右移 B9H = 1011 1001B 循环左移 DH = 0 算术左移 00B9H = 0000 0000 1011 1001B 带进位循环左移 B9H = 1011 1001B 带进位循环右移 RCL DX,CL 05CCH RCR DL,1 00DCH
第3章 宏汇编语言程序设计
3.1 对于下面的数据定义,各条指令单独执行后,有关寄存器的内容是什么? FLDB DB ?
TABLEA DW 20 DUP(?) TABLEB DB 'ABCD'
(1) MOV AX, TYPE FLDB ; AX = 01H;字节类型 (2) MOV AX, TYPE TABLEA ; AX = 02H;字类型
(3) MOV CX, LENGTH TABLEA ; CX = 14H;DUP定义的变量,分配的单元数 (4) MOV DX, SIZE TABLEA ; DX = 28H;SIZE = LENGTH * TYPE
(5) MOV CX, LENGTH TABLEB ; CX = 01H;非DUP定义的变量,LENGTH=1 3.2 试写出完成下列操作的伪指令语句:
(1) 将56H, 78, B3H, 100存放在定义为字节变量ARRAY的存储单元中。 ARRAY DB 56H, 78, 0B3H, 100
(2) 将字数据2965H, 45H, 2965, A6H存放在定义为字变量DATA的存储单元中。 DATA DW 2965H, 45H, 2965, 0A6H
(3) 将字节数据56H, C6H, 78H, 12H存放在字变量ALPHA的存储单元中,并且不改变数据按字节存储的次序。
ALPHA DW 0C656H, 1278H
(4) 在BETA为首址的存储单元中连续存放字节数据,2个23,5个'A',10个(1, 2),20个空单元。
BETA DB 2 DUP ( 23 ), 5 DUP ( 'A' ), 10 DUP (1, 2), 20 DUP ( ? )
(5) 在STRING为首址的存储单元中存放字符串'THIS IS A EXAMPE'。 STRING DB 'THIS IS A EXAMPE' (6) 用符号COUNT替代100。
COUNT EQU 100 ( 或COUNT = 100 )
3.3 画图表示下列语句中数据在存储器中的存储情况。
(1) BYTE_VAR DB 'ABCD', 76, 57H, 3 DUP ( ? ), 2 DUP (1, 3) (2) WORD_VAR DW 5 DUP (0, 1), ?, 'AB', 'CD', 7965。 (1) 从左到右、从上到下为地址增大的方向。 41H 42 H 43 H 44 H 4CH 57 H ? ? ? 01 H 03 H 01 H 03 H (2) 从左到右、从上到下为地址增大的方向。 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 ? ? 42 41 44 43 1D 1F 3.4设置一个数据段DATA_SEG,其中连续存放下列的8个变量,用段定义语句和变量定义语句写出数据段:
(1) DATA1为字符串变量: 'DATA SEGMENT' (2) DATA2为十进制数字字节变量: 72, 65, -10 (3) DATA3 为十六进制数字字节变量: 109, 98, 21, 40 (4) DATA4为10个零的字节变量
(5) DATA5为数字的ASCII字符字节变量: 12345 (6) DATA6为十进制数的字变量: 7, 9, 298, 1967 (7) DATA7为十六进制数的字变量: 785, 13475
(8) DATA8为本段中字变量和字节变量之间的字节单元数之差。 解:
DATA SEGMENT
DATA1 DB 'DATA SEGMENT' DATA2 DB 72, 65, -10
DATA3 DB 6DH, 62H, 15H, 28H DATA4 DB 10 DUP (0) DATA5 DB '12345'
DATA6 DW 7, 9, 298, 1967 DATA7 DW 0311H, 34A3H
DATA8 DB $ - DATA6 - (DATA6 - DATA1) DATA ENDS
3.5假设程序中的变量定义如下: BUF1 DB 100 DUP ('A') BUF2 DW 1275H, 567, 0C5H BUF3 DB 20 DUP (?) BUF4 DB 7, 4, 6, 9, 8
(1) 用一条指令将BUF1的偏移地址送入BX。 MOV BX, OFFSET BUF1或 LEA BX, BUF1 (2) 将BUF2的第三字节数据送入CL。 MOV CL, BUF2+2
(3) 将A6H送入BUF3的第十个字节单元中。 MOV BUF3+9, 0A6H
(4) 用伪指令写出BUF1和BUF2二者的总长度(字节数) COUNT EQU BUF3 - BUF1
3.6 给出等值语句如下:
ALPHA EQU 100 BETA EQU 25 GAMMA EQU 2 求下列表达式的值:
(1) ALPHA * 100 + BETA ; 10025D = 2729H
(2) ALPHA MOD GAMMA + BETA ; 100 MOD 2 + 25 = 25D = 0019H (3) (ALPHA + 2) * BETA - ALPHA ; (100 + 2 ) * 25 – 100 = 2450D = 0992H (4) (BETA / 3) MOD 5 ; (25 / 3) MOD 5 = 03H
(5) BETA AND 7 ; 0001 1001 AND 0000 0111 = 01H (6) GAMMA OR 3 ; 0000 0010 OR 0000 0011 = 0003H 3.7 下列语句中,在存储器中每个变量分配到多少字节? VR1 DW 9 ; 2字节
VR2 DW 4 DUP (?), 2 ; 4 * 2 + 2 = 10字节 VR3 EQU 100 ; 0字节
VR4 DD VR3 DUP (?) ; 100 * 4 = 400字节
VR5 DB 2 DUP (?, VR3 DUP (0, 1) ) ; 2 * ( 1 + 100 * 2 ) = 402字节 VR6 DB 'HOW ARE YOU?' ; 12字节
3.8 试写出一个完整的数据段DATA_SEG,首先把10个压缩的BCD码29存放在ARRAY变量字节单元中,紧接着把-25, 4, 10, 76, 3存放在ALPHA数组变量的字单元中,接着留100个空单元作为工作单元用,它定义为字节变量BUFFER。 DATA_SEG SEGMENT ARRAY DB 10 DUP ( 29H ) ALPHA DW -25, 4, 10, 76, 3 BUFFER DB 100 DUP ( ? ) DATA_SEG ENDS
3.9 将存放在字节变量BCD1中的两个十进制数的ASCII码合并为一字节压缩型BCD码,存入字节变量BCD2,试编写程序。
DATA SEGMENT BCD1 DB '34' BCD2 DB ? DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL, BCD1 MOV CL, 4 SAL AL, CL
MOV BL, BCD1+1 AND BL, 0FH OR AL, BL
MOV BCD2, AL MOV AH, 4CH INT 21H CODE ENDS END START
3.10 分析下列程序段,并说明完成什么操作。 ADDNUM DB 28H, 46H, 95H, 26H ADDSUM DB 2 DUP (?)
MOV AL, ADDNUM ; ADDNUM第1个数据送到AL ADD AL, ADDNUM + 2 ; ADDNUM第3个数据加到AL DAA ; 加法的十进制调整指令
MOV ADDSUM, AL ; ADDNUM第1、3个数据的和放到ADDSUM MOV AL, ADDNUM + 1 ; ADDNUM第2个数据送到AL ADC AL, ADDNUM + 3 ; ADDNUM第4个数据加到AL DAA ; 加法的十进制调整指令
MOV ADDSUM + 1, AL ; ADDNUM第2、4个数据的和放到ADDSUM + 1
解:
将ADDNUM的第1、3个数据相加,并将结果进行十进制调整转换为压缩型BCD码,并放到ADDSUM的第1个字节的位置;将ADDNUM的第2、4个数据相加,并将结果进行十进制调整转换为压缩型BCD码,并放到ADDSUM的第2个字节的位置。
即:4628+2695,结果调整为压缩型BCD码,结果以字变量形式放到ADDSUM单元。
3.11 写出完成下述功能的程序段: (1) 将32H存入CH中。
(2) 将CH中的内容与2AH相加。 (3) 将CH中的内容乘2。
(4) 将CH中的内容存入以BX作为相对基址寻址的数组变量NUM的第十个字节单元中(数据段)。
问:各程序段分别执行后,CH中的内容是多少? MOV CH, 32H ; (1) CH = 32H ADD CH, 2AH ; (2) CH = 5CH MOV AL, 02H ;
MUL CH ; (3) CH = 5CH, AX = 0B8H MOV [BX + NUM + 9], CH ; (4) CH = 5CH
3.12 编写程序,计算Z = ( ( W – X ) / 10 * Y )2,r为相除所得余数。其中W, X, Y均为8位有符号二进制数。
DATA SEGMENT W DB 12 X DB 24 Y DB 48
Z DW 2 DUP (?) r db ? DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV AL, W
SUB AL, X ; W - X -> AL CBW
MOV BL, 10
IDIV BL ; (W - X) / 10 -> AL MOV r, AH ; (W - X) % 10 -> r MOV BL, Y
IMUL BL ; (W - X) / 10 * Y -> AX MOV BX, AX
IMUL BX ; ((W - X) / 10 * Y)^2 -> DX, AX MOV Z, AX
MOV Z+2, DX ; ((W - X) / 10 * Y)^2 -> Z MOV AH, 4CH INT 21H CODE ENDS END START
3.13 在数组字变量ARRAY中有10个数据,将数组中的第5个字数据求补,再放回原处,画出程序流程图和编写程序。
3.14 用重复前缀串比较指令比较两个字符串,一个是在数据段的字符串变量STR1(内容为'THIS IS A DOG'),另一个是在附加段的字符串变量STR2(内容为'THIS IS A COCK')。当比较到第一个不相同的字符时停止比较,把相同部分字符串长度存入数据段的字节变量NUM中。写出分段结构的程序段,应包括段定义,伪指令和指令序列。问:相同部分字符串长度为多少?在STR1和STR2第一个不同处的偏移地址是多少?
DATA SEGMENT
STR1 DB 'THIS IS A DOG' LEN1 DB $-STR1 NUM DB ? DATA ENDS
EDATA SEGMENT
STR2 DB 'THIS IS A COCK' LEN2 DB $-STR2 EDATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EDATA START: MOV AX,DATA MOV DS,AX MOV AX,EDATA MOV ES,AX CLD ;串操作由低地址向高地址 MOV CH,0 MOV AL,LEN1 CMP AL,ES:LEN2 JB B1L2
MOV CL,ES:LEN2 JMP CMPOK B1L2: MOV CL,AL
CMPOK: LEA SI,STR1 LEA DI,ES:STR2 REPE CMPSB MOV AX,SI
DEC AL ;不同处的字节偏移地址
MOV NUM,AL ;不同处的字节偏移地址放到NUM MOV AH, 4CH INT 21H CODE ENDS END START
答:相同长度10,不同处的偏移地址10
3.15 有两个压缩型BCD码相加,被加数(6756)和加数(7321)存放在数据段的BUFFER变量的4个连续的字节存储单元中,结果(和)存放在RESUT变量的三个字单元中(考虑到有进位的情况),编制具有数据段和代码段结构的完整程序,程序中需要作必要的注释。
注:结果存放在RESUT字节变量中,三个字单元不知要求怎么用 DATA SEGMENT
BUFFER DB 67H,56H,73H,21H RESUT DB 3 DUP (?) DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,BUFFER+1 ;第一个数据低两位->AL MOV BL,BUFFER+3 ;第二个数据低两位->BL ADD AL,BL ;低两位相加 DAA ;十进制调整 MOV DL,AL ;低两位相加结果放到DL MOV AL,BUFFER ;第一个数据高两位->AL MOV BL,BUFFER+2 ;第二个数据高两位->BL ADC AL,BL ;低两位相加 DAA ;十进制调整 MOV BL,0 JNC HCF INC BL
HCF: MOV RESUT,BL ;存放最高位 MOV RESUT+1,AL ;存放中间两位 MOV RESUT+2,DL ;存放最低两位 MOV AH, 4CH INT 21H CODE ENDS END START
3.16 将SRCBUF变量定义的80个字符串传送到DSTBUF变量定义的存储区去。当遇到0DH时,不将此字符传送到DSTBUF变量中去。试编写程序,并加以注释。
DATA SEGMENT
SRCBUF DB 'aaa',0DH,'bbb' DSTBUF DB 80 DUP (?) DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,07 ;比较次数->CX MOV SI,0 ;源串指针->SI
MOV DI,0 ;目标串指针->DI SDCMP: MOV AL,SRCBUF[SI] CMP AL,0DH JZ NSEND
MOV DSTBUF[DI],AL ;不等于0DH,保存数据,修改SI、DI INC DI
NSEND: INC SI ;等于0DH,不保存数据,修改SI LOOP SDCMP MOV AH, 4CH INT 21H CODE ENDS END START
3.17 已知有n个元素存放在以BUF为首址的字节存储区中,试统计其中负元素的个数,画出程序框图,编写程序。
DATA SEGMENT
BUF DB 92H,12H,0F3H,23H,87H LEN EQU $-BUF DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN ;比较次数->CX MOV SI,0 ;字节存储区指针 MOV DL,0 ;负元素个数初始化 NEGCMP: MOV AL,BUF[SI] CMP AL,0 JNL C0GE
INC DL ;小于0,个数加1,指针加1 C0GE: INC SI ;不小于0,指针加1 LOOP NEGCMP MOV AH, 4CH INT 21H CODE ENDS END START
3.18 已知以BUF为首址的字存储区中存放着n个有符号的二进制数,试编写程序,将大于等于0的数送以BUF1为首址的字存储区中,将小于0的数送以BUF2为首址的字存储区中,并画出程序框图。
DATA SEGMENT
BUF DW 1212H,0FF12H,3434H,8989H,5656H,9090H LEN EQU ($ - BUF) / 2 BUF1 DW LEN DUP (?) BUF2 DW LEN DUP (?) DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN ;循环次数,即BUF的单元数 MOV BX,0 ;BUF指针初始化 MOV SI,0 ;BUF1指针初始化 MOV DI,0 ;BUF2指针初始化 CLOOP: MOV AX,[BX] ;BUF数据->AX CMP AX,0 JGE TO1
MOV BUF2[DI],AX ;AX<0,AX->BUF2,DI+2->DI,BX+2->BX INC DI
INC DI
JMP CONTINUE
TO1: MOV BUF1[SI],AX ;AX>=0,AX->BUF1,SI+2->SI,BX+2->BX INC SI INC SI CONTINUE:INC BX INC BX
LOOP CLOOP MOV AH, 4CH INT 21H CODE ENDS END START
3.19 已知在以BUF为首地址的字节存储区中,存放着一个以′$′作结束标志的字符串,试编写程序,在CRT上显示该字符串,并要求将小写字母以大写字母形式显示出来。画出程序框图。
DATA SEGMENT
BUF DB 'abCDalskdjf$' DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,0 ;BUF地址指针 ALOOP: MOV DL,BUF[SI] ;BUF数据->DL CMP DL,'$' ;DL='$',EXIT JE STOP CMP DL,5AH
JBE UPPER ;大写字母,打印输出,地址指针SI加1
SUB DL,20H ;小写字母,DL减20H后打印输出,地址指针SI加1 UPPER: MOV AH,02H INT 21H INC SI
JMP ALOOP STOP: MOV AH, 4CH INT 21H CODE ENDS END START
3.20 设有三个字节变量X、Y、Z,试找出X、Y有符号数中较大者送入Z中,编写程序。
推荐检测实例:-128和127 DATA SEGMENT X DB 0F0H Y DB 12H Z DB ? DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,X ;X->AL CMP AL,Y ;X ? Y JGE NEXT ;X>=Y,X->Z MOV AL,Y ;X
END START
3.21 设在变量单元A、B和C中存放有三个数,若三个数都不为0,则求出三个数之和存入D中;若有一个为0,则将其他两个单元也清零,编写程序。
DATA SEGMENT A DB 0F0H B DB 12H C DB 22H D DW ? DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX CMP A,0 JZ STOP CMP B,0 JZ STOP CMP C,0 JZ STOP ;有一个为0,全部置0 MOV AH,0 ;否则作加法运算,放到D,注意加法运算结果为字 MOV BH,0 MOV AL,A MOV BL,B ADD AX,BX MOV BL,C ADD AX,BX MOV D,AX JMP STOP NEXT: MOV A,0 MOV B,0 MOV C,0 STOP: MOV AH, 4CH INT 21H CODE ENDS END START
3.22 试分析下列程序段,说明完成了什么操作?程序执行前后HEXNUM字节单元的内容是什么?
ASCNUM DB 41H HEXNUM DB ?
MOV AH,ASCNUM CMP AH,39H JBE NEXT SUB AH,7
NEXT:SUB AH,30H
MOV HEXNUM,AX HLT 解:
'0'~'9'与'A'~'F'组成的一位十六进制数的ASCII码转换为一位十六进制数。 程序执行前:[HEXNUM] = ? 程序执行后:[HEXNUM] = 0AH
3.23 在数据区STR1单元开始存放一长度为1~256个字符的字符串。要求对该字符串中每个字符在最高位配上一个偶校验位(即保持一字节数中1的个数为偶数),并存回到原单元中。
DATA SEGMENT
STR1 DB 'abcdefghi' LEN1 EQU $-STR1 DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN1 MOV SI,0
ALOOP: MOV AL,STR1[SI]
OR AL,0 ;与0相或,不影响原来的值
JP CONTINUE ;若1的个数为偶数,不做任何处理 OR AL,80H ; 若1的个数为偶数,最高位置1 MOV STR1[SI],AL CONTINUE:INC SI
LOOP ALOOP STOP: MOV AH, 4CH INT 21H CODE ENDS END START
3.24 已知在数据区中DATA1和DATA2开始分别存放N个字节数据,编制程序检查两数据块中的数据是否相同。若完全一致,则将标志单元FLAG置FFH,否则置0。并将第一次出现的不同数据的地址分别存放ADR1和ADR2单元中,编写程序。
;假设为按顺序比较,非无序比较 DATA SEGMENT
DATA1 DB 22H,33H,44H,55H DATA2 DB 22H,33H,44H,66H N EQU $-DATA2 FLAG DB ? ADR1 DW ? ADR2 DW ? DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,N MOV SI,0 MOV DI,0
ALOOP1: MOV AL,DATA1[SI] CMP AL,DATA2[DI] JNZ NE12 INC SI INC DI
LOOP ALOOP1 MOV FLAG,0FFH
JMP EXIT NE12: MOV FLAG,0 MOV ADR1,SI MOV ADR2,DI EXIT: MOV AH, 4CH INT 21H
CODE ENDS END START
3.25 定义一数组GRADE存放有100个学生某门功课的考试成绩,要求编一程序,统计各分数段的人数,即要求统计90~100分,80~89分,70~79分,60~69分以及60分以下的各有多少人。
DATA SEGMENT
GRADE DB 12,65,77,88,98,23,94,75,85,62 LEN EQU $-GRADE A DB 0 B DB 0 C DB 0 D DB 0 E DB 0 DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN ALOOP1: MOV SI,CX DEC SI
CMP GRADE[SI],60
JB GRE ;<60, E+1->E CMP GRADE[SI],70
JB GRD ;<70, D+1->D CMP GRADE[SI],80
JB GRC ;<80, C+1->C CMP GRADE[SI],90
JB GRB ;<90, B+1->B INC A ;>=90, A+1->A JMP GOON GRB: INC B
JMP GOON GRC: INC C
JMP GOON GRD: INC D
JMP GOON GRE: INC E
JMP GOON GOON: LOOP ALOOP1 MOV AH, 4CH INT 21H CODE ENDS END START
3.26 编一程序,在以BUF为首址的字节单元中存放了COUNT个无符号数,找出其中最大数送MAX单元。
DATA SEGMENT
BUF DB 11,23,43,45,67,82,38,48,98,34,67 COUNT EQU $-BUF MAX DB ? DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,COUNT MOV AL,0 ;AL用力存放最大数,初值为0
ALOOP: MOV SI,CX DEC SI
CMP AL,BUF[SI] ;从后面取数据,与AL比较 JAE GOON
MOV AL,BUF[SI]
GOON: LOOP ALOOP MOV MAX,AL MOV AH, 4CH INT 21H CODE ENDS END START
3.27 利用系统功能调用从键盘输入10个一位无符号数,求出其中最大和最小数,在显示器上输出显示。
DATA SEGMENT
IN_STR DB 'Please Input 10 Num of 0~9:$' MAX_STR DB 0DH,0AH,'MAX Num is:$' MIN_STR DB 0DH,0AH,'MIN Num is:$' MAX DB ? MIN DB ? DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,IN_STR MOV AH,09H
INT 21H ;提示输入10个数字 IND: MOV AH,01H
INT 21H ;输入一个字符 CMP AL,30H
JB IND ;<30H,ERROR CMP AL,39H
JA IND ;>39H,ERROR SUB AL,30H
MOV MIN,AL ;第一个数初始化MIN MOV MAX,AL ;第一个数初始化MAX MOV CX,3 ALOOP: MOV AH,01H
INT 21H ;输入一个字符 CMP AL,30H
JB ALOOP ;<30H,ERROR CMP AL,39H
JA ALOOP ;>39H,ERROR SUB AL,30H ;ASCII->数 CMP AL,MIN
JB GOMIN ;小于最小数,AL->MIN,输入下一个数 CMP AL,MAX
JA GOMAX ;大于最大数,AL->MAX,输入下一个数 JMP GOON GOMIN: MOV MIN,AL JMP GOON
GOMAX: MOV MAX,AL
GOON: LOOP ALOOP LEA DX,MAX_STR MOV AH,09H
INT 21H ;提示输出最大数 MOV DL,MAX ADD DL,30H MOV AH,02H
INT 21H ;输出最大数 LEA DX,MIN_STR MOV AH,09H
INT 21H ;提示输出最小数 MOV DL,MIN ADD DL,30H MOV AH,02H
INT 21H ;输出最小数 MOV AH, 4CH INT 21H CODE ENDS END START
3.28 利用系统功能调用,完成将键盘输入的小写字母转换成大写字母输出显示,直到输入$字符时,停止输出。
CODE SEGMENT ASSUME CS:CODE START: MOV AH,01H
INT 21H ;输入一个字符 CMP AL,'$'
JE STOP ;'$'符,退出 CMP AL,'a' JB START CMP AL,'z' JA START ;非小写字母,继续输入 SUB AL,20H MOV DL,AL MOV AH,02H INT 21H ;小写字母转换成大写字母输出 JMP START STOP: MOV AH, 4CH INT 21H CODE ENDS END START
3.29 设有一字符串已存放在STRBUF为首址的数据区中,编一程序找出其中的$字符,并将其存放地址送ADRBUF单元中。
DATA SEGMENT
STRBUF DB 'a;sldkfjasldkf$asdf' LEN EQU $-STRBUF ADRBUF DB ? DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV CX,LEN ;最多查询次数 MOV BX,0
ALOOP: CMP STRBUF[BX],'$'
JZ STOP ;找到,地址送ADRBUF,退出程序 INC BX
LOOP ALOOP STOP: MOV ADRBUF,BL MOV AH, 4CH INT 21H CODE ENDS END START
3.30 用子程序结构编程计算:S=1!+2!+3!+4!+?+8! 修改原有答案结果,SUM2为结果
STACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD STACK ENDS
DATA SEGMENT BUFF DB 1,2,3,4,5,6,7,8 SUM DW 0000H SUM2 DW 0 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX
MOV SP,OFFSET TOP MOV CH,0 MOV CL,8
MOV SI,OFFSET BUFF LOP1:
MOV AX,OFFSET SUM PUSH AX MOV AH,0 MOV AL, [SI] PUSH AX
CALL FAR PTR FACT MOV DX,SUM ADD SUM2,DX INC SI
LOOP LOP1 MOV AH,4CH INT 21H CODE ENDS
CODES SEGMENT ASSUME CS:CODES FACT PROC FAR PUSH BP MOV BP,SP PUSH BX PUSH AX
MOV BX,[BP+8] MOV AX,[BP+6] CMP AX,0 JE DONE PUSH BX DEC AX PUSH AX CALL FACT MOV BX,[BP+8] MOV AX,[BX]
MUL WORD PTR [BP+6] JMP RETURN
DONE: MOV AX,01H RETURN:MOV [BX],AX POP AX POP BX POP BP
RET 4
FACT ENDP CODES ENDS END START
第5章 半导体存储器
(1)Intel 1024(1K×1位) (2)lntel 2ll4(1K×4位) (3)Intel 2128(2K×8位) (4)Inte1 2167(16K×1位) (5)Inte1 2164(64K×1位) 128KB=128×8位
(1) 128K×8/(1K×1) = 1024 (2) 128K×8/(1K×4) = 256 (3) 128K×8/(2K×8) = 64 (4) 128K×8/(16K×1) = 64 (5) 128K×8/(64K×1) = 16
1. 若用以下的器件构成容量为128KB的存储器,试指出各需多少片?
2. 若用1024×1位的RAM芯片组成16K×8位的存储器,需要多少芯片?在地址总线中有多少位参与片内寻址?至少需要多少位用作芯片组选择信号(片间寻址)?
(1) 16K×8/(1024×1) = 128,需要128块芯片 (2) 10位,10位寻址范围位1K,即1024
(3) 需要4位地址线用作芯片组选择信号,8片1024×1位的芯片构成一个1K×8位的芯片组,一共有16个芯片组,所以要选择16个芯片组,而16=24,需要4位地址线。
3.EPROM存储器芯片还没有写入信息时,各个单元的内容是什么?
全为1
4.对只读存储器和半导体随机存取存储器,若发生掉电现象,那种存储器中仍保留有原来的数据?
只读存储器
5. 写出Intel 2716、2732、2764、27128、27256芯片容量,从中找出规律来。EPROM是怎样编程写入的?又是怎样擦除信息的?
2716:2k×8bit 2732:4k×8bit 2764:8k×8bit 27128:16k×8bit 27256:32k×8bit
规律:编号中去掉前两位除以8即为芯片容量(单位为字节)。
在EPROM芯片制造好时,每个EPROM管的硅栅上无电荷,这时存储矩阵内容全为1。 编程写入:当写入时,施加12.5V(或更高)、宽度约50mS的编程脉冲,这时所选中的单元在该电源的作用下,就会有电子注入硅栅,硅栅就为负,于是就形成了导电沟道,从而使EPROM单元导通,输出为0。
檫除信息:EPROM封装上方有一个石英玻璃窗口,当用紫外线照射这个窗口时,经过 6~40分钟,所有电路中硅栅上的电荷会形成光电流泄漏走,从而把写入的全部信息擦去,电路恢复成初始(全1)状态,以便重新编程。
6.电擦写可编程只读存储器E2PROM与EPROM有何异同点?它是怎样进行写入和擦除信息的?
相同点:断电情况下保存的数据信息不丢失
不同点:EPROM需要编程器,E2PROM不需要专门的编程设备。 E2PROM写入信息:在线读写
E2PROM檫除信息:外加高电压檫除或写入的过程中自动檫除
7.已知某微机控制系统中的RAM容量为4K×8位,首地址为4800H,求其最后一个单元的地址。
4K:0000 0000 0000B~1111 1111 1111B,000H~0FFFH 4800H + 0FFFH = 57FFH
8.某单板机中ROM为6KB,最后一个单元的地址为9BFFH,RAM为3KB,已知其地址为连续的,且ROM在前,RAM在后,求该存储器的首地址和末地址。
8000H 9BFFH 9C00H A7FFH
? ? 6K:0 0000 0000 0000B~1 1011 1111 1111B,0000H~1BFFH 3K:0000 0000 0000B~1011 1111 1111B,000H~0BFFH 首地址:9BFFH - 1BFFH = 8000H 末地址:9C00H + 0BFFH = 0A7FFH
9. 一台8位微机,地址总线16根。具有用8片2114构成的4K字节RAM,连线图如图5.29所示。若以每1K字节RAM作为一组,则4组RAM的基本地址是多少?地址有没有重叠区,每一组的地址范围为多少?
2114:1K×4位,2个一组。一组为:1K×8位。 A15A14:片间寻址
A9A8A7A6A5A4A3A2A1A0:片内寻址 A13A12 A11A10:未用
芯片组 A15A14 0# 1# 2# 3# 00 01 10 11 A13A12 A11A10 0000 0000 0000 0000 A9A8A7A6A5A4A3A2A1A0 0000000000~1111111111 0000000000~1111111111 0000000000~1111111111 0000000000~1111111111 基本地址范围 0000~03FFH 4000~43FFH 8000~83FFH C000~C3FFH 0#:0000~3FFFH 1#:4000~7FFFH 2#:8000~BFFFH 3#:C000~FFFFH 地址无重叠
10.8088 CPU工作于最小方式,原有系统RAM的容量为128KB,其首地址为00000H。现需用8K×8位的SRAM 6264芯片扩充16KB的容量,地址和原有系统RAM的地址相连接,试画出该扩充RAM和8088 CPU系统总线的连接图。(采用全译码,译码器自选,能说明逻辑关系即可。)
原有RAM 扩充RAM1 扩充RAM2 A19A18A17A16A15A14 A13A12A11A10A 9A 8A7A 6A 5A 4A 3A 2A 1A 0 0 0 0 0 0 0 00000000000000 0 0 0 1 1 1 1 1111111111111 0 0 1 0 0 0 00000000000000 0 0 1 0 0 0 0 1111111111111 0 0 1 0 0 0 10000000000000 0 0 1 0 0 0 1 1111111111111 地址 00000H 1FFFFH 20000H 21FFFH 22000H 23FFFH A0~A12片内寻址; 74LS138译码器的输出端Y0、Y1分别接SRAM6264的片选引脚; A15A14A13分别接74LS138译码器的C、B、A端; A16接74LS138译码器的G2A; A17接74LS138译码器的G1;
A19 A18相或后输出接74LS138译码器的G2B。
11.8088 CPU(地址总线20位,数据总线8位,其他引脚信号与8086基本相同)工作于最小方式,试用EPROM 2732、SRAM 2114、译码器74LS138以及若干门电路,构成一个8KB的ROM,2KB的RAM存储器系统。(采用全译码,EPROM的起始地址为01000H,RAM的起始地址为00000H。)
EPROM2732:4k×8bit SRAM2114: 1K×4bit
需要2732芯片2片,2114芯片4片(先位扩充,再字扩充) A19A18A17A16A15A14 A13A12A11A10A 9A 8A7A 6A 5A 4A 3A 2A 1A 0 地址 RAM1 RAM2 ROM1 ROM2
0 0 0 0 0 0 00000000000000 0 0 0 0 0 0 00001111111111 0 0 0 0 0 0 00010000000000 0 0 0 0 0 0 0 0011111111111 0 0 0 0 0 0 01000000000000 0 0 0 0 0 0 0 1111111111111 0 0 0 0 0 0 10000000000000 0 0 0 0 0 0 1 0111111111111 00000H 003FFH 00400H 007FFH 01000H 01FFFH 02000H 02FFFH
A15~A17相或后接G2A,A18~A19相或后接G2B 片内寻址的地址线、数据线没有标注
12.为什么8086/8088微机系统的主储存器中,总是将RAM存储器安排于低位地址空间,而将ROM存储器安排于高位地址空间?
这是由8086/8088CPU的初始化时CS、IP的值决定的。CPU复位时,CS置为FFFFH,IP清零,CPU从FFFF0H开始执行程序。
13.某微机系统中,用2片EPROM 27128和2片SRAM 6264以及一个译码器74LS138来组成一个8位存储系统,要求起始地址为00000H,画出系统连接图,并写出每一存储芯片的地址空间范围。
27128是16K×8位EPROM芯片 6264是8K×8位SRAM芯片 EPROM1#:00000~03FFFH EPROM2#:04000~07FFFH SRAM1# :08000~09FFFH SRAM2# :0A000~0BFFFH
14.CPU与存储器连线时,主要应考虑哪几个方面?数据总线扩展首先组成8位数据线宽的存储体,其选通信号是什么?而16位CPU其奇偶两个存储体,选通信号是什么?32位CPU则需4个存储体,其选通信号又是什么?
CPU与存储区相连时,主要考虑:
(1)存储器类型选择 (2)CPU总线的负载能力
(3)存储器的地址分配和片选问题
(4)CPU的时序和存储器的存取速度之间的配合问题 8位选通信号:译码器的输出信号或直接用高位地址线。
16位选通信号:CPU的地址总线最低位A0与偶存储体的片选信号CE相连,CPU的总线高允许信号BHE与奇存储体的片选信号CE相连。
32位选通信号:CPU的地址总线A1和A0通过CPU内部编码产生字节选通信号BE0、BE1、BE2、
BE3分别选通存储体0、1、2、3。
15. 某系统的存储器中配备有两种芯片:容量分别为2K×8的EPROM和容量为1K×8的RAM。它采用74LS138译码器产生片选信号,Y0、Y1、Y2直接接到三片EPROM(1#、2#、3#),Y4、Y5则通过一组门电路产生四个片选信号接到四片RAM(4#、5#、6#和7#),如图5.30所示,试确定每一片存储器的寻址范围。
EPROM1# EPROM2# EPROM3# RAM4# RAM5# RAM6# RAM7# A15A14 A13A12A11 A10A 9A 8A17A 6A 5A 4A 3A 2A 1A 0 1 0 0 0 0 00000000000 1 0 0 0 0 11111111111 1 0 0 0 1 00000000000 1 0 0 0 1 11111111111 1 0 0 1 0 00000000000 1 0 0 1 0 11111111111 1 0 1 0 0 00000000000 1 0 1 0 0 01111111111 1 0 1 0 0 1 0000000000 1 0 1 0 0 1 1111111111 1 0 1 0 1 0 0000000000 1 0 1 0 1 0 1111111111 1 0 1 0 1 1 0000000000 基本地址 8000H 87FFH 8800H 8FFFH 9000H 97FFH A000H A3FFH A400H A7FFH A800H ABFFH AC00H 1 0 1 0 1 1 1111111111
AFFFH 16.扩展内存(XMS)与扩充内存(EMS)有何不同?
扩展内存是指CPU能直接寻址的、地址大于1MB以上的内存存储空间。 扩充内存是在微机的CPU寻址范围之外所扩展的物理存储器。
17.简述高速缓冲存储器在微机系统中的作用。
第6章 I/O接口技术
1.CPU与外部设备通讯为什么要使用接口?
2.CPU与输入/输出设备通信时所用到的接口电路通常应具备的功能?
3.I/O端口有哪两种寻址方式?各有何优缺点?
4.8086CPU在执行输入/输出指令时,CPU的哪些控制管脚起作用?什么样的电平有效?
5.计算机输入/输出有哪几种控制方式?各有何优缺点?
6.在输入/输出的电路中为什么常常要用锁存和缓冲器?
7.利用三态门(74LS244)作为输入接口,接口地址规定为04E5H,试画出其与8086总线的连接图。
04E5H = 0000 0100 1110 0101B 部分译码
A2A1A0作为138的CBA输入,即CBA=101,Y5接74LS244的1G、2G引脚 A10A7A6A5=1111作为138的G1使能信号 A4A3=00相或后作为G2A使能信号 A9A8=00相或后作为G2B使能信号
8.在IBM PC机接口开发中用到某一大规模集成电路芯片,其内部占16个I/O端口地址300H~30FH,试设计一个片选信号CS形成电路。
300H = 11 0000 0000B 30FH = 11 0000 1111B
部分译码
A3A2A1A0:接芯片的地址线
A6A5A4:作为138的CBA输入,即CBA=000 A7:作为G2AG2B使能信号
A9A8:相与后作为G1使能信号
9.在某8086微机系统中有一外设,使用存储器映像的I/O寻址方式,要求该外设地址为01000H,试画出其译码器的连接电路,使其译码器输出满足上述地址要求,译码器使用74LS138芯片。
01000H = 0000 0001 0000 0000 0000B
A2A1A0作为138的CBA输入,即CBA=000 A12=1,作为G1使能信号
其他相或后作为G2A、G2B使能信号
10.若第9题中的外设要求用I/O映像的I/O寻址,端口地址为38H,试画出其译码器的连接图。
部分译码
38H = 011 1000B
A2A1A0作为138的CBA输入,即CBA=000 A5A4A3=111,三位地址相与后作为G1使能信号 A7A6=00,可分别作为G2A,G2B使能信号
A5A4A3A7A6A2A1A0&+Y0G1Y1G2AY2G2BY374LS138Y4CY5BY6AY7译码信号M/IO
11.试根据图6.22所示的接口原理,编写一程序段,使从键盘输入一行字符(最大长度为80个字节),该行字符以回车符结尾,输入的字符存放在BUFF开始的内存缓冲区中,并要求每读入一个字符,在终端上显示出来(使用BIOS中断或系统功能调用)。
INPUT1 PROC MOV CX,80 LEA DI,BUFF
LOP1: CMP CX,0 JZ DONE
IN AL,29H AND AL,01H JZ LOP1 IN AL, 28H CMP AL,0DH JZ DONE MOV [DI],AL MOV DL,AL MOV AH,02H
INT 21H DEC CX INC DI JMP LOP1
DONE: RET INPUT1 ENDP
12.试画一个流程图,说明如何用程序控制的I/O把N个字节的数据块输入到存储器中。
13.CPU响应DMA请求和响应中断请求有什么本质性的区别?
14. DMAC(8237A)占几个端口地址?这些地址在读写时的作用是什么?叙述DMAC由内存向端口传送一个数据块的过程。若希望利用8237A把内存中的一个数据块传送到内存的另一个区域,应当如何处理?当考虑8237A工作在8086系统,数据是由内存的某一段向另一段传送且数据块长度大于64K时,应当如何考虑?
15.当DMA8237A获得总线控制权后,它是怎样发出20位地址信号的?写出DMA在PC/XT机中4个通道的分工情况。
16.设8237A口址为00~0FH,编写一个以请求方式进行数据块传送,数据块长为1000H,从内存00000H传送到01000H,传送完不自动预置,DREQ、DACK均为高电平有效的程序。
第7章 中断系统
1.什么是中断?简述一个中断的全过程。
2.8086的可屏蔽中断与非屏蔽中断有何不同?
3.中断向量表的作用是什么?如何设置中断向量表,常用的方法有哪些?
4.类型26H的中断向量在存储器的哪些单元里?
5.已知SP=0100H,SS=0300H,FLAGS=0240H,00020H至00023H单元内容分别是40H,00H,00H,01H,同时还已知INT 8的偏移量00A0H在段基址为0900H的CS段内,试指出在执行INT 8指令并进入该指令相应的中断程序时,SP、SS、IP、CS、FLAGS和堆栈最上面三个字的内容。
解:
(1) 中断响应时,将当前的FLAGS(0240H)、CS(0900H)和IP(00A0H)内容依次压入堆栈,以便返回时恢复。
0300 : 00FA 0300 : 00FB 0300 : 00FC 0300 : 00FD 0300 : 00FE 0300 : 00FF
A0H 00H 00H 09H 40H 02H SS = 0300H,SP = 00FAH
(2) 将FLAGS中的IF标志和TF标志清零
0240H = 0000 0010 0100 0000H(从左到右:第15~0位) IF = 1(第9位),TF = 0(第8位),清零后,FLAGS = 0040H (3) 根据中断类型码,转入中断服务程序入口。 向量地址 = 08H × 4 = 00020H CS = 0100H,IP = 0040H
6.假设中断类型9的中断服务程序的起始地址为INT-POUT,试写出主程序为建立对应中断向量的程序段。
; 设置中断向量-方法1 PUSH DS ; 数据段地址压栈 MOV AX, 0 ; 中断向量表段地址→DS MOV DS, AX MOV BX, 9*4 ; 中断向量地址→BX MOV AX, OFFSET INT-POUT ; 中断向量填入中断向量表 MOV [BX], AX MOV AX, SEG INT-POUT MOV [BX+2], AX POP DS ; 恢复数据段地址 ; 设置中断向量-方法2 PUSH DS MOV AX, SEG INT-POUT MOV DS, AX MOV DX, OFFSET INT-POUT
MOV MOV INT POP AH, 25H AL, 9 21H DS
7.设备D1、D2、D3、D4、D5是按优先级次序排列的,D1的优先权最高,而中断请求的次序如下所示,试给出各设备的中断处理程序的运行次序。假设所有的中断服务程序开始后就有STI指令,并在中断返回之前发出结束命令。
(1) D3和D4同时发出中断请求。
(2) 在D3的中断服务程序完成之前,D2发出中断请求。 (3) 在D4的中断服务程序完成之前,D5发出中断请求。
(4) 以上所有的中断服务程序完成并返回主程序后,D1、D3、D5同时发出中断请求。
8.在上题中,假设所有中断中都没有STI指令,而它们的IRET指令都可以由于FLAGS出栈而使IF=1,则各设备的中断服务程序的运行次序应是怎样的?
9.试定义一个软中断,中断类型码为79H,要求:
(1) 在中断服务程序中,完成ASCII码到BCD码的转换,ASCII码首地址为ASCMM,字节数为NUMB,转换后的BCD码放在BCDMM为首地址的存储区中;
(2) 能正确地转到中断服务程序,即需给出中断向量。试编写出中断服务程序和主程序片断。 解:(完成的是数字的ASCII码到数字的转换) ; 主程序片断
; 设置中断向量-方法1 PUSH DS ;数据段地址压栈 MOV AX, 0 ;中断向量表段地址→DS MOV DS, AX MOV BX, 79H*4 ;中断向量地址→BX MOV AX, OFFSET ATOBCD ;中断向量填入中断向量表 MOV [BX], AX MOV AX, SEG ATOBCD MOV [BX+2], AX POP DS ;恢复数据段地址 ; 设置中断向量-方法2 PUSH DS MOV AX, SEG ATOBCD MOV DS, AX MOV DX, OFFSET ATOBCD MOV AH, 25H MOV AL, 79H INT 21H POP DS ; 中断服务程序
ATOBCD: MOV CX, NUMB
LEA SI, ASCMM LEA DI, BCDMM CLD
ALOOP: LODSB
AND AL, 0FH ; ASCII码到BCD码的转换 STOSB
LOOP ALOOP IRET
10.编写出只有一片8259A的8088系统中8259A的初始化程序,8259A的地址为02C0H和02C1H,要求:
(1) 中断请求输入采用电平触发; (2) IRQ0请求的中断类型是16; (3) 采用缓冲器方式;
(4) 采用普通的EOI命令。 ; ICW1初始化
MOV DX, 02C0H
MOV AL, 0001 1011B ; 1BH OUT DX, AL ; ICW2初始化
INC DX
MOV AL, 0001 0000B ; 10H OUT DX, AL ; ICW4初始化
MOV AL, 0000 1001B; (09H)或0000 1101B(0DH) OUT DX, AL
11.编写一将8259A中的IRR、ISR和IMR的内容传送至存储器中REG-ARR为首地址的数组中的程序段,假设CPU为8088,8259A的偶地址为050H,奇地址为051H。
; 读IRR的内容
MOV AL, 0AH ; 写入OCW3,读IRR OUT 050H, AL
NOP ; 延时,等待8259A操作结束 IN AL, 050H ; 读出IRR
MOV REG-ADDR, AL ; IRR送到存储器 ; 读ISR的内容
MOV AL, 0BH ; 写入OCW3,读ISR OUT 050H, AL
NOP ; 延时,等待8259A操作结束 IN AL, 050H ; 读出ISR
MOV REG-ADDR+1, AL ; ISR送到存储器 ; 读IMR的内容
MOV DX, 051H IN AL, DX
MOV REG-ADDR+2, AL ; IMR送到存储器
12.某系统中有5个中断源,它们从中断控制器8259A的IRQ4~IRQ0中以脉冲方式引入系统,它们的中断类型码分别为4BH、4CH、4DH、4EH和4FH,中断入口分别为3500H、4080H、4505H、5540H和6000H。允许它们以完全嵌套方式工作,请编写相应的初始化程序,CPU响应一级中断时,能正确地进入各自的中断服务程序入口。
13.BM PC/AT机中两片8259A的硬件连接图如图7.29所示,请指出8259A主片及从片,并如何从硬件连接中的哪些部分来区分主片和从片?
1#:主片,2#:从片
2#芯片的INT引脚接的是1#芯片的IRQ2引脚。
14.上题中,两片8259A的初始化程序如下:
;主8259A初始化 INTA00 EQU 020H ;8259A主片端口0 INTA01 EQU 021H ;8259A主片端口1 ┇ ; 边沿触发,多片8259级联,需要ICW4 MOV AL, 11H ;ICW1 OUT INTA00, AL ; 中断类型码的基值为8 MOV AL, 8 ;ICW2 OUT INTA01, AL ; IRQ2接从8259A MOV AL, 04H ;ICW3 OUT INTA01, AL ; 全嵌套方式,非缓冲方式,非自动结束,8086/8088模式 MOV AL, 01H ;ICW4 OUT INTA01, AL ;从8259A初始化 INTB00 EQU 020H ;8259A从片端口0 INTB01 EQU 021H ;8259A从片端口1 ┇ ; 边沿触发,多片8259级联,需要ICW4 MOV AL, 11H ;ICW1 OUT INTB00, AL ; 中断类型码的基值为70H MOV AL, 70H ;ICW2 OUT INTB01, AL
; 从属8259接主控的IRQ2 MOV AL, 02H ;ICW3 OUT INTB01, AL
; 全嵌套方式,非缓冲方式,非自动结束,8086/8088模式 MOV AL, 01H ;ICW4 OUT INTB01, AL 请说明两片8259A的4个初始化命令字的意义。
15.某系统中设置3片8259A级联使用,一片为主8259A;两片为从8259A,它们分别接入主8259A的IRQ2和IRQ4端。若已知当前主8259A和从8259A的IRQ3上各接有一个中断源,它们的中断类型码分别为A0H、B0H、C0H,已知它们的中断入口均在同一段中,其段基址为2050H,偏移地址分别为11A0H、22B0H和33C0H,所有中断均采用电平触发方式、完全嵌套、普通EOI结束。
(1) 画出它们的硬件连接图; (2) 编写全部初始化程序。
解:(中断类型码认为是三片8259的中断类型基码) (1)
(2)
; 利用DOS功能调用设置中断向量 PUSH DS ; A3H设置
MOV AX,2050H MOV DS,AX MOV DX,11A0H MOV AX,25A3H INT 21H ; B3H设置
MOV DX,22B0H MOV AX,25B3H INT 21H ; C3H设置
MOV DX,33C0H MOV AX,25C3H INT 21H POP DS
; 8259A初始化,先定义各8259端口地址,依次为主控、从1#、从2# INTA0 EQU 020H INTA1 EQU 021H INTB0 EQU 0A0H INTB1 EQU 0A1H INTC0 EQU 0B0H INTC1 EQU 0B1H ; 主8259初始化 MOV DX, INTA0
MOV AL, 0001 1001B OUT DX, AL
MOV AL, 1010 0000B MOV DX, INTA1 OUT DX, AL
MOV AL, 0001 0100B OUT DX, AL
MOV AL, 0001 0001B OUT DX, AL ; 从1#初始化
MOV DX, INTB0
MOV AL, 0001 1001B OUT DX, AL
MOV AL, 1011 0000B MOV DX, INTB1 OUT DX, AL
MOV AL, 0000 0010B OUT DX, AL
MOV AL, 0001 0001B OUT DX, AL ; 从2#初始化
MOV DX, INTC0
MOV AL, 0001 1001B OUT DX, AL
MOV AL, 1100 0000B MOV DX, INTC1 OUT DX, AL
MOV AL, 0000 0100B OUT DX, AL
MOV AL, 0001 0001B OUT DX, AL
; ICW1:电平触发,多片8259级联,需要ICW4 ; ICW2:中断类型码基值为0A0H ; ICW3:IRQ4、IRQ2接从属8259 ; ICW4:完全嵌套、非缓冲方式、普通EOI结束、8086/8088模式 ; ICW1:电平触发,多片8259级联,需要ICW4 ; ICW2:中断类型码基值为0B0H ; ICW3:从属8259接主控的IRQ2 ; ICW4:完全嵌套、非缓冲方式、普通EOI结束、8086/8088模式 ; ICW1:电平触发,多片8259级联,需要ICW4 ; ICW2:中断类型码基值为0C0H ; ICW3:从属8259接主控的IRQ4 ; ICW4:完全嵌套、非缓冲方式、普通EOI结束、8086/8088模式 16.IBM PC/XT中8259A的IRQ2输入一中断请求信号,当其有效时转入中断服务程序执行。中断服务程序的功能是从外设(口地址为200H)读入数据,并判断是否有偶校验,有则输出给另一个外设(口地址201H),否则在屏幕显示字符“N”,并关闭IRQ2中断。试编写主程序(与中断有关部分)和中断服务程序。
; 主程序部分 PUSH DS
MOV AX, SEG INTPR MOV DS, AX LEA DX, INTPR MOV AH, 25H
MOV AL, 0AH ; 未知 INT 21H POP DS
MOV DX, 021H ; 读取中断屏蔽命令字 IN AL, DX
AND AL, 0FBH ; 0FBH = 1111 1011B,开放IRQ2中断 OUT DX, AL ; 送回IMR STI ; 开中断
; 中断服务程序
INTPR: MOV DX, 200H ; 从200H端口读入数据
IN AL, DX OR AL, AL JNP NEXT
MOV DX, 201H ; 偶校验,输入的数据输出到端口201H OUT DX, AL JMP DONE
NEXT: MOV DL, ’N’ ; 非偶校验,显示“N”,并关闭IRQ2中断
MOV AH, 2 ; 显示“N” INT 21H
MOV DX, 021H ; 关闭IRQ2中断 IN AL, DX OR AL, 00000100B OUT DX, AL
DONE: IRET
17.中断与异常有何异同?
18.32位机的异常分为几类?
19.中断描述符与一般段描述符有何不同?
20.中断描述符表与中断向量表有何异同?
第8章 常用接口芯片
1.假定8255A的地址为0060H~0063H,试编写下列各种情况的初始化程序:
(l)将A组和B组设置为方式0,端口A和C作为输入口,端口B作为输出口。 (2)将A组设置为方式2,B组设置为方式1,端口B作为输出口。
(3)将A组设置为方式1,且端口A作为输入,PC6和PC7作为输出;B组设置为方式1,且端口B为输入口。
2.IBM PC/XT机中8255A与系统总线的连接如图8.74所示,试分析8255A的 A口、B口、C口及控制寄存器的基本地址。
解: 0 0 0 1 1 图8.74
图8.75
A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 × × × × × A口:060H B口:061H C口:062H
控制寄存器:063H
3.某外设引脚如图8.75所示,当BUSY为低电平时,表示外设可以接收数据。外设通过8255A接到系统总统上,CPU利用查询方式将BUFFER开始的100字节数据输出。
(1)规定8255A的口地址为ECH—EFH,试画出8255A和系统总线及外设的连接图。
(2)编写包括8255A初始化程序在内的输出程序。
4.图8.76为开关状态检测电路和继电器控制电路,当开关闭合时,将驱动对应的继
图8.76
电器(有驱动电流流过继电器线圈);若某开关处于断开状态,则无电流流过继电器线圈。系统每隔10ms检测一次开关状态和对继电器作相应控制,定时控制由8253完成,试完成对8255A的初始化编程(初始状态所有继电器的线图都无电流流过)和检测控制程序(假定8255A地址为3COH~3C3H)。
5.图8.23的8253应用实例中,若通道0和通道1都采用二进制计数,扬声器的发声频率为500HZ,问程序应作何变动?
解: ;主程序
MOV AL,15H(改为14H) ;计数器0初始化 OUT 43H,AL
MOV AL,50H(改为50) OUT 40H,AL
STI ;开中断 LOP:HLT ;等待中断 JMP LOP ;中断服务程序
INIP:MOV AL,01H ;GATE1置1,启动计数 OUT 80H,AL
MOV AL,77H(改为76H);计数器1初始化 OUT 43H,AL
MOV AL,00H(改为0F0H);1.4×106/500=2800=0AF0H OUT 41H,AL
MOV AL,07H(改为0AH) OUT 4lH,AL
CALL DLSS ;延时5秒
MOV AL,0 ;GATE1置0,停止计数 OUT 80H,AL IRET
6.若8253可利用8088的外设接口地址D0D0H~D0D3H,试画出电路连接图。若加到8253上的时钟信号为2MHz,
(1)若利用计数器0、1、2分别产生周期为10?S的对称方波以及每1S和10s产生一个负脉冲。试说明8253如何连接并编写包括初始化在内的程序。
(2)若希望利用8088程序通过接口控制GATE,当CPU使GATE有效开始,20?S后在计数器0的OUT端产生一个正脉冲,试设计完成此要求的硬件和软件。 解: (1)
①产生周期为10?s的对称方波,计数器:0,工作方式:方式3,初值:10?S=0.1MHZ,2/0.1=20 MOV AL,00010111B MOV DX,0D0D3H OUT DX,AL MOV AL,20H MOV DX,0D0D0H OUT DX,AL
②每1S产生一个负脉冲,计数器:0、1,工作方式:3、2,初值:200、10000
MOV AL,00110111B;计数器0 MOV DX,0D0D3H OUT DX,AL MOV DX,0D0D0H MOV AL,00H OUT DX,AL MOV AL,02H OUT DX,AL MOV AL,01110101B;计数器1 MOV DX,0D0D3H OUT DX,AL MOV DX,0D0D1H MOV AL,00H OUT DX,AL OUT DX,AL
③每10S产生一个负脉冲,计数器:0、1,工作方式:3、2,初值:2000、10000
MOV AL,00110111B;计数器0 MOV DX,0D0D3H OUT DX,AL MOV DX,0D0D0H MOV AL,00H OUT DX,AL MOV AL, 20H OUT DX,AL MOV AL,01110101B;计数器1 MOV DX,0D0D3H OUT DX,AL MOV DX,0D0D1H MOV AL,00H
OUT DX,AL OUT DX,AL
(2)8255控制计数器0的GATE信号,OUT0接反相器,工作方式:方式5,初值:20?S=0.05MHZ,2/0.05=40
MOV AL,00011011B MOV DX,0D0D3H OUT DX,AL MOV AL,40H MOV DX,0D0D0H OUT DX,AL
7.若加到8253上的时钟频率为0.5MHz,则一个计数器的最长定时时间是多少?若要求10分钟产生一次定时中断,试提出解决方案。
8.假设一片 IBM PC机I/O卡的8253连到一个1KHz的时钟,用该8253以BCD格式保持一天中的时间,精度为秒。在DATA1、DATA2、DATA3(时、分、秒)等字节装入当前时间后,启动8253开始计时。试编写一个8253的初始化程序和一个在每秒结束时修改时间的中断眼务程序。(8253的地址为02C0H~02C3H)。
说明;8253产生的中断请求信号连接到PC总线的IRQ2。
9.设有某微机控制系统,采用定时器8253产生定时中断信号。CPU响应中断后更执行数据采集、数字滤波和相应的控制算法,以控制输出。如图8.77所示。采用两个计数器串联的方法实现定时控制。一旦定时时间到,OUT1信号由高变低,经反相后送IRQ2。IRQ2的中断类型号为0AH,中断处理程序首址存储在28H~2BH。8253端口地址为230H~233H。试编制8253的初始化及设置中断处理程序首地址程序段。
图8.77
10.某系统中使用825lAI作在异步方式、7位字符、不带校验、停止位长2位、波特率系数为16、允许发送、也允许接收。若已知其控制口地址为FFAOH,数据口地址为FFA1H,请编写初始化程序。
11.若8251A的收、发时钟(RxC、TxC)频率为38.4KHz,它的RTS和CTS引脚相连,试完成以下要求的初始化程序设计:
(1)半双工异步传送,每个字符的数据位数为7,停止位数为1,偶校验,波持率为600位/秒,处于发送状态。
(2)半双工同步通信,每个字符的数据位数为8,无校验位,双同步字符,内同步方式,同步字符采用ASCII码的同步控制符SYN(16H),处于接收状态(同时使DTR有效).8251A的口地址为02C0H和02C1H。
12.若两台计算机利用8251A进行串行通信,半双工方式,如图8.78所示。通信规程如下:异步传送,波特率为600,每个字符的数据位数为7,1位停止位,偶校验。试完成以下程序设计:
(1)发送程序:将数据段中以TBUF为起站地址的一组ASCII字符码发送给对方,字符串的长度存在字节变量TLEN中。发送时,先发一个起始符SOH(01H),发送完全部数据字符之后,再发送两个结束符EOT(04H)作为发送结束标志。
(2)接收程序:将接收到的一组ASCII字符存放于从RBUF开始的接收缓冲区中,所收到的字符长度存在于字节变量RLEN中,只统计数据字符数。若接收正确,将字节变量ERROR置为00H,否则置为FFH。
图8.78 解:查询方式传送
(1)发送程序:控制口地址:TCONT;数据口地址:TDATA
STT: MOV DX,TCONT ;方式选择控制字:将825lA定义为异步方式,8位数据, MOV AL,7AH ;l位停止位,偶校验,波特率系数16 OUT DX,AL
MOV AL,0lH ;操作命令控制字:允许发送 OUT DX,AL ; 传送起始符
NEXT1: MOV DX,TCONT ;状态字:读取状态字 IN AL,DX
AND AL,0lH ;TxRDY有效否? JZ NEXT1 ;无效,继续等待
MOV DX,TDATA ;有效,向8251A输出起始符SOH(01H)
MOV AL,01H
OUT DX,AL
; 传送数据
MOV DI,TBUF ;发送数据块首地址送DI MOV CH,0
MOV CL,TLEN ;计数器赋初值
NEXT2:MOV DX,TCONT ;状态字:读取状态字 IN AL,DX
AND AL,0lH ;TxRDY有效否? JZ NEXT ;无效,继续等待
MOV DX,TDATA ;有效,向8251A输出一字节数据 MOV AL,[DI] OUT DX,AL
INC DI ;修改指针 LOOP NEXT2
; 传送两个结束符
MOV CX,2 ;计数器赋初值
NEXT3:MOV DX,TCONT ;状态字:读取状态字 IN AL,DX
AND AL,0lH ;TxRDY有效否? JZ NEXT ;无效,继续等待
MOV DX,TDATA ;有效,向8251A输出结束符EOT(04H) MOV AL, 04H OUT DX,AL LOOP NEXT3 HLT
(2)接收程序:控制口地址:RCONT;数据口地址:RDATA;不检测结束符
SRR: MOV DX,RCONT ;方式选择控制字:送方式选择控制字 MOV AL,7AH OUT DX,AL
MOV AL,14H ;操作命令控制字:清除错误标志,允许接收
OUT DX,AL ;接收起始符
COMT:MOV DX,RCONT ;状态字:读取状态字 IN AL,DX
TEST AL,02H ;RxRDY有效否? JZ COMT ;无效,继续等待
MOV DX,RDATA ;无错,输入一字节数据 IN AL, DX
MOV DI,RBUF ;接收数据缓冲区首地址送DI
MOV CX,TLEN ;计数器赋初值:发送数据个数 MOV RLEN,0 ;正确接收数据个数 ;接收数据
COMT:MOV DX,RCONT ;状态字:读取状态字 IN AL,DX
TEST AL,02H ;RxRDY有效否? JZ COMT ;无效,继续等待
AND AL,38H ;有效,查询接收过程有无错误?
JNZ ERR ;有错,转出错处理程序 ADD RLEN,1 ;无错,接收正确个数加1
ERR:MOV DX,RDATA ;无错,输入一字节数据 IN AL, DX MOV [DI],AL
INC DI ;修改指针 LOOP COMT
CMP RLEN,TLEN JZ OK
MOV ERROR,0FFH JMP EXIT
OK:MOV ERROR,0 EXIT:HLT
13.利用单缓冲接法的DAC0832产生正向三角波,设三角波的频率为10Hz,一个周期由200个点组成,试编程。(延时可调用延时子程序)
解: SUB3: LOP1: LOP2:
MOV DX,PORTA; MOV AL,00H; OUT DX,AL;
CALL DELAY;延时0.1/200=0.0005s INC AL; CMP AL,100; JE LOP2; JMP LOP1; OUT DX,AL; CALL DELAY; DEC AL; CMP AL,00H; JE LOP1; JMP LOP2; RET;
14.用8255作为A/D并行接口。如图8.79所示。8255A的A组工作于方式1,为输入口,端口C的PC7位设定为输出端,与A/D变换器的变换启动信号相连,由PC7端产生正脉冲信号以启动A/D变换。A/D的忙端经反向后作为采样保持器的控制信号,并且忙端经下降沿触发单稳电路,再经反向输出一个负方波的波形到PC4端,作为A的数据输入锁存信号,将A/D转换结果存入A口的数据输入寄存器。假设8255A的A,B,C和控制寄存器的I/O地址分别为300H,301H,302H,303H。写出8255A的初始化程序及启动A/D变换的程序片段。
图8.79
15.从DATA开始的数据区中有一组数据需要用示波器显示出来。数据长度为LENGTH。利用两片DAC0832作为输出接口,一片输出数据,送示波器的Y轴;另一片输出锯齿波,同时送示波器的X轴。试画出DAC0832和系统总线及示波器的连接图,编写显示数据曲线的程序。
16. . ADC0809和系统总线连接如图8.80所示。用中断方式从IN5读入一个模拟量,放到BUF单元,试编程。设8259的地址为020H、021H,IRQ2中断类型号为0AH,8259已初始化。
解:
;设置中断向量表 PUSH DS
MOV AX,SEG ADINT
图8.80
MOV DS,AX
MOV DX,OFFSET ADINT MOV AL,0AH MOV AH,25H INT 21H POP DS
;主程序,开放IRQ2中断 MOV DX,021H IN AL,DX
AND AL,1111 1011B OUT DX,AL STI ;开中断 MOV DX,84H MOV AL,05H
OUT DX,AL;启动0809 HLT;等待中断 ;中断服务程序
ADINT PROC NEAR IN AL,DX MOV BUF,AL PUSH DX
MOV DX,20H MOV AL,20H
OUT DX,AL POP DX IRET
ADINT ENDP
17.ADC0809和8255A连接如图8.81所示。8255A的A口工作于方式1输入。当ADC0809转换结束时,EOC的上升沿触发单稳态电路DW,DW输出的负脉冲作为选通脉冲,将ADC0809的输出数据锁存进A口。用中断方式依次将IN7~IN0采样一遍,放到BUFFER开始的数据缓冲区,试编程。设8255A口地址为200H~203H,8259的地址为020H、021H,IRQ2中断类型号为0AH,8259已初始化。
图8.81 解:
8255的PC7为1输出启动信号,PC0~PC2实现通道选择,A/D转换结束信号可从PC4获得,PC3为1输出中断。 ;主程序
STACK SEGMENT STACK STA DB 20 DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT
BUFFER DB 8 DUP(?) DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX
MOV SP,OFFSET TOP
PUSH DS ;中断向量送中断向量表 MOV AX,SEG ADINT MOV DS,AX
MOV DX,OFFSET ADINT MOV AL,0AH MOV AH,25H INT 21H
POP DS
MOV DX,021H ;开放IRQ2中断 IN AL,DX
AND AL,1111 10llB OUT DX,AL
MOV DI,OFFSET BUFFER ;缓冲区起始地址送DI STD ;DF置1
STI ;开中断 MOV CX,8 MOV BL,90H
NEXT:MOV DX,202H
MOV AL,BL
OUT DX,AL ;启动0809 AND AL,7FH OUT DX,AL
WAIT:IN AL,DX TEST AL,10H
JNZ WAIT ;检测PC4状态,非0,A/D转换没结束 MOV AL,07H MOV DX,203H
OUT DX,AL ;PC3置1,输出中断 HLT
INC BL LOOP NEXT
CLI ;采集完8口,结束 MOV AH,4CH INT 2IH ;中断服务程序
ADINT PROC NEAR
PUSH DX
MOV DX,200
IN AL,DX ;读取转换结果 STOSB ;送指定内存单元 MOV DX,20H ;发中断结束命令 MOV AL,20H OUT DX,AL POP DX
IRET
ADINT ENDP CODE ENDS
END START
18.ADC的引线图及工作时序如图8.82所示。试将此ADC与8255相连接,并编写包括初始化程序在内的、变换一次数据并将数据放在DATA中的程序。
图8.82
19. 试利用8255A、ADC0809设计一 IBM PC机 A/D转换接口卡,8255A的地址为02C0H~02C3H,由系统板上的8253定时器0控制每隔5秒采样一遍ADC0809的8路模拟输入,并将采集的数字量显示于CRT屏幕上。
解:
20.简述82380DMA控制器与8237的兼容性。
21.82380DMA控制器中,如果设置为全循环优先级,通道2最低优先级,通道4最低优先级。则开始时各通道的优先顺序是怎样排列的?若通道2完成DMA服务后,各通道的优先顺序又是如何排列的?
22.简述82380中断控制器PIC的功能。