微型计算机原理复习(第六版)姚向华编著(转载请注明出处---https://www.cnblogs.com/qingl)
第一章P37
05. 设机器字长为8位,最高位为符号位,试对下列各算式进行二进制补码运算:
(2)8 + 18 = ?[8]补=[8]原 [18]补=[18]原
(4)-25 + 6 = ?[-25]补=[[-25]补]补 [6]补=[6]原
(6)9 - (-7)= ?[9]补=[9]原 [-7]补=[[-7]补]补
(8)-25 – 6 = ?[-25]补=[[-25]补]补 [6]补=[6]原
解:
2)0000 1000 + 0001 0010 = 0001 1010 符号位为0,结果为正
4)[25]原=0001 1001 [-25]补=1110 0111
1110 0111 + 0000 0110 = 1110 1101 符号位为1,结果为负
对结果再次求补,得 0001 0011 即结果为-19
6)即为9 + 7
0000 1001 + 0000 0111 = 0001 0000 符号位为0,结果为正
8)[25]原=0001 1001 [-25]补=1110 0111
[6]原=0000 0110 [-6]补=1111 1010
1110 0111 + 1111 1010 = 1110 0001 符号位为1,结果为负
对结果再次求补,得 0001 1111 即结果为-31
06. 设机器字长为8位,最高位为符号位,试用“双高位”判别法判断下列二进制运算有没有溢出产生。若有,是正溢出还是负溢出?
(2)-52 + 7 = ?
(4)72 – 8 = ?
(6)-90 + (-70) = ?
解:
2)[52]原=0011 0100 [-52]补=1100 1100
1100 1100 + 0000 0111 = 1101 0011 Cs =0,Cp = 0 无溢出
4)[8]原=0000 1000 [-8]补=1111 1000
0100 1000 + 1111 1000 =(1) 0100 0000 Cs =1,Cp = 1 无溢出
6)[90]原=0101 1010 [-90]补=1010 0110
[70]原=0100 0110 [-70]补=1011 1010
1010 0110 + 1011 1010 = (1)0110 0000 Cs =1,Cp = 0 负溢出
Cs 表示最高位(符号位)的进位,Cp 表示数值最高位的进位。
一个正数和一个负数相加,和肯定无溢出。若和为正数,则Cs = 1,Cp = 1; 若和为负数,则Cs =0,Cp = 0
08. 将下列十进制数变为8421 BCD码:
(2)5324
解:0101 0011 0010 0100B
11. 写出下列各数的ASCII代码:
(1)51
(3)AB
解:(1)35H31H
(2)41H42H
第二章P69
- 8086/8088 CPU中BIU部件和EU部件各包括哪些部件?各自的功能是什么?追踪指令地址的寄存器是什么?
答:
总线接口部件BIU包括4个16位段寄存器、1个16位指令指针、1个地址加法器、1个指令流队列和总线控制电路。 主要功能:负责完成CPU与存储器或I/O设备之间的数据传送。
执行部件EU包括算术逻辑单元、16位标志寄存器、寄存器阵列、指令译码器及控制电路。 主要功能:负责指令译码和指令执行。
追踪指令地址的寄存器是IP(指令指针寄存器)。根据IP内容和CS(代码段寄存器)的内容确定出该要执行指令的地址。
05. 若已知一个字串的起始逻辑地址为2000H:1000H,试求该字串中第16个字的逻辑地址和物理地址。
解:
物理地址 = 段地址 × 10H + 偏移地址
起始逻辑地址为2000H:1000H
第n个字的逻辑地址为
段地址:偏移地址首址 + (n - 1)× 2
第16个字的逻辑地址为
段地址:偏移地址首址 + (16 - 1)× 2 = 2000H:101EH
物理地址为:2000 × 10H + 101EH = 2101EH
06. 若已知当前栈顶的逻辑地址为3000H:200H,试问压入两个字后栈顶的逻辑地址和物理地址是什么?若又弹出3个字后,则栈顶的逻辑地址和物理地址又是什么?
解:
压入两个字后,SP的内容为
(SP)- 字数 × 2 = 0200H – 2 × 2 = 01FCH 01FC + 3 × 2 = 0202H
所以逻辑地址为3000H:01FCH
物理地址为301FCH
第三章P118
1. 指出下列指令中源操作数和目的操作数的寻址方式:
源操作数 目的操作数
(1)MOV SI,1000 立即数寻址 寄存器寻址
(3)MOV [SI],1000 立即数寻址 寄存器间接寻址
(5)AND DL,[BX + SI + 20H] 相对的基址加变址寻址 寄存器寻址
(7)POP AX 寄存器寻址 寄存器寻址
(8)MOV EAX,COUNT[EDX*4] 寄存器相对寻址 直接寻址
2. 指出下列指令语法是否正确,若不正确请说明原因。
(01)MOV DS,0100H
(02)MOV BP,AL
(03)XCHG AX,2000H
(04)OUT 310H,AL
(07)MOV AX,[SI + DI]
(09)AND AX,BL
(11)MOV [BX],[SI]
(12)MOV CS,[1000]
解:
01)不能直接向DS中送立即数。改为:MOV AX,0100H
MOV DS,AX
02)源操作数和目的操作数的类型不同。改为:MOV BP,AX
03)立即数不能用于交换指令
04)直接寻址的输出指令中,端口号只能在O~FFH范围内
07)SI、DI不能一起用。改为:MOV AX,[BX + DI]
09)源操作数和目的操作数的类型不同。改为:AND AX,BX
11)MOV指令不能源操作数和目的操作数都是寄存器。改为:MOV BX,[SI];源操作数为寄存器,目的操作数是存储器。或MOV [BX],SI;源操作数为存储器,目的操作数是寄存器。
12)MOV的操作数不能是CS
7. 执行下列程序段,指出此程序段功能。
(1)MOV CX,10;
LEA SI,First;//将数据段First的地址偏移量送SI
LEA DI,Second;//将数据段Secnd的地址偏移量送DI
REP MOVSB;//将源串一字节传送到目地串,并自动修改指针值
功能:将源字符串First的10个字节移送至目标字符串Second
(2)CLD;
LEA DI,ES:[0404H];
MOV CX,0080H;
XOR AX,AX;
REP STOSW;
功能:将内存中从0404H单元开始的128个字单元清零
另:1° 分别填写下列操作数的寻址方式和物理地址
设(DS)= 2000H,(ES)= 2100H,(SS)= 1500H,(SI)= 00A0H,(BX)= 0100H,(BP)= 0010H。数据段中变量名VAL的偏移量地址值为0050H,试指出下列源操作数字段的寻址方式是什么,其物理地址值是多少或者有没有物理地址?
(1)MOV AX,OABH
(2)MOV AX,[100H]
(3)MOV AX,ES:[BX]
(4)MOV AX,VAL[BX]
(5)MOV AX,[BX][SI]
解:
1) 立即寻址, 没有物理地址
2) 直接寻址, 物理地址= 10 × 段地址(DS)+ 偏移量(EA)
= 10 × 2000H + 100H = 20100H
3)寄存器间接寻址, 物理地址 = 10 × 段地址(ES)+ 偏移量(EA)
= 10 × 2100H + 0100H = 21100H
4)寄存器相对寻址, 物理地址= 10 × 段地址(DS)+ 偏移量(EA)
= 10 × 2000H + 0050H = 20150H
5)基址变址寻址, 物理地址 = 10 × 段地址(DS)+ 偏移量(EA)
=10 × 2000H + 0100H + 00A0H = 201A0H
2°分别填写下列操作数的值
已知DS= 091DH,AX= 1234H,BX= 0024H,CX= 5678H,SI= 0012H,DI= 0032H,(09226H)= 00F6H,(09228H)= 1E40H,(1E4F6H)= 091DH,试求单独执行下列指令后的结果。
1) MOV CL,20H[BX][SI]; (CL)= 00F6H
2) LEA BX,20H[BX][SI]; (BX)= 0056H
3) LDS SI,[BX][DI]; [SI] = 00F6H
4) MOV [SI],BX; [SI] = 0024H
5) XCHG CX,32H[BX]; (CX) = 00F6H
第四章P195
3. 设下列指令语句中的标识符均为字变量,请指出哪些指令是非法的,并指出其错误之处。.
(02)MOV AX,WORD1[DX] DX不能作为基址寄存器
(03)MOV WORD1,WORD2 源操作数和目的操作数不能均在存储器
(04)MOV SWORD,DS √
(07)MOV AX,WORD1+WORD2 两个变量不能直接相加
(10)MOV SI,OFFSET WORD2[BX] OFFSET后应跟变量或标号
5. 试编制一程序,统计出某数组中相邻两数之间符号变化的次数。
DATA SEGMENT
N = 20H
ARRAY DB 20 DUP(?)
NUM DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
STARTUP:LEA SI,ARRAY;SI指向数组首址
MOV AL,[SI] ;取第一个字符
MOV BL,0 ;结果计数器清零
MOV CX,19 ;置循环计数器
AGAIN: INC SI ;指向下一数组单元
XOR AL,[SI] ;两个数按位进行逻辑异或操作
JNS NEXT ;符号位非负表明两数符号相同,跳过不计数
INC BL ;结果计数器BL加1
NEXT: MOV AL,[SI] ;当前数组元素送AL
LOOP AGAIN
MOV NUM,BL ;保存结果
MOV AH,4CH ;返回DOS
INT 21H
CODE ENDS
END START
11. 试编制一程序,把20个字节的数组分成正数组和负数组,并分别计算两个数组中数据的个数。
解:程序如下:
DATA SEGMENT
BUF DB 12H,34H, 56H,……
N=20
BUF1 DB N DUP(0),0
BUF2 DB N DUP(?),0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV DX,DATA
MOV DS,DX
LEA SI,BUF
LEA DI,BUF1
LEA BX,BUF2
MOV CX,N
LOP: MOV AL,[SI]
INC SI
CMP AL,O
JGE PLUS
MOV [BX],AL
INC BUF2+N
INC BX
JMP NEXT
PLUS:MOV [DI],AL
INC BUF1+N
INC DI
NEXT:LOOP LOP
MOV AH,4CH
INT 21H
CODE ENDS
END START
第八章P345
- 一般来说,中断的处理过程有哪几步?中断处理程序包含哪几部分?
解:
中断处理过程应该包括:中断请求,中断排队或中断判优,中断响应,中断处理,中断返回等环节。
中断处理程序包含:保护现场、中断服务程序、恢复现场、中断返回。
另:1° 试述可屏蔽中断的响应和处理过程
解:
1)中断允许标志IF置1,没有异常,没有非屏蔽中断NMI=0,没有总线请求,CPU响应可屏蔽中断请求;
2)外部设备向8259A发出中断请求信号,经过8259A处理后得到相应的中断矢量号,并同时向CPU申请中断INT=1
3)如果指令不是HLT或者WAIT,则CPU执行完当前指令后便向8259A发出中断信号INTA=0,表明CPU响应该可屏蔽中断请求
处理过程:
1、若指令是HLT,则中断请求信号INTR的产生使处理器退出暂停状态,响应中断,进入中断处理程序
2、若指令是WAIT。且TSET引脚加入低电平信号,则中断请求信号INTR产生后,使处理器脱离等待状态,进入中断处理程序 处理过程包括四部分:保护现场、中断服务程序、恢复现场、中断返回。
2° 试述单片8259A中断处理过程
解:
(1) 当中断请求输入线IR0~IR7中有一条或多条变高时,则中断请求寄存器IRR的相应位置“1”。
(2) 若中断请求线中至少有一条是中断允许的,则8259A由INT引脚向CPU发出中断请求信号。
(3) 如CPU是处于开中断状态,则在当前指令执行完后,用信号作为响应。
(4) 8259A在接收到CPU的信号后,使最高优先级的ISR位置“1”,而相应的IRR位清“0”。但在该中断响应周期中,8259A并不向系统总线发送任何信息。
(5) CPU(8086/8088和80X86)输出第二个信号,启动第二个中断响应周期。在此周期中,8259A向数据总线输送一个8位的中断类型号(也叫指针或向量号);CPU读取此类型号
后将它乘以4(左移2位),即可从中断服务程序向量表(即入口地址表)中取出中断服务程序的入口地址,包括段地址和段内偏移地址。据此CPU便可转入中断服务程序。
(6) 如8259A工作在AEOI(Automatic End Of Interrupt)模式,则在第二个脉冲信号结束时,将使被响应的中断源在ISR中的对应位清“0”;否则,直至中断服务程序结束,发出EOI命令,才使ISR中的对应位清“0”。
考点
01,取指令时,段地址由CS寄存器 提供,偏移地址由IP寄存器 提供。
02,16位有符号二进制补码范围为-32768~32767
03,8086 20根地址总线,16根数据总线
04,8086可访问偶数存储体的选择信号是A0
05,8259A中,采用2个从片,有n*8+(8-n)= 22 个中断
06,堆栈的工作方式是“先进后出”,入栈时,SP减小。
07,DOS功能调用功能号在AH 寄存器里面
08,ROL的功能是循环左移
09,对于5片8259A形成的级联共有8+7×4 = 36 级中断
10,给出指令,判断寻址方式(第三章 1 )
11,试述单片8259A中断处理过程&试述外部可屏蔽中断的响应和处理过程
12,输入输出指令间接寻址必须通过DX 寄存器
13,标志寄存器有9 位标志位,其中3 位控制标志位,6 位状态标志位
14,BIU和EU 两个单元并行工作在CPU 中
15,8086的中断向量表位于内存的00000H~003FFH区域,它可以容纳256个中断向量,每个向量占4个字节
16,每个中断向量分配4个连续的字节单元,两个高字节单元存放入口的段地址CS,两个低字节单元存放入口的段内偏移量IP
17,在DEBUG环境下,利用T命令可以跟踪一条指令
18,在存储器分段结构中,每段最大长度为64KB
19,段内偏移地址从0000到FFFFH。
20,8259A地址线A0和A1 相连
21,零标志位ZF=1 时,结果全为0
22,计算BUF开始的数组中的100个元素中非零元素的个数,并将其存入COUNT单元,补全指令
BUF DB 100 DUP (?)
COUNT DB 0
..............
STARTUP: MOV AX,DATA
MOV DS,AX
LEA SI, (1) BUF
MOV CX ,(2) 100
CON:MOV AL,[SI]
CMP AL ,(3) 0
JZ NEXT
INC (4) COUNT
NEXT: INC SI
LOOP (5) CON
HLT
23,程序执行后寄存器的值:
MOV AX,01H
MOV BX ,02H
PUSH BX
PUSH AX
POP BX 执行后BX= 01H
POP AX 执行后AX=(1) 02H
MOV AX ,3F5FH 执行后AL=(3) 5FH
MOV CX ,4
ROR AL,CL 执行后AL=(4) 0F5H
AND AL ,0FH 执行后AL=(5) 05H
24,试编制一程序,统计出某数组中相邻两数之间符号变化的次数&编制一个程序将20个字节的数组分为正数和负数组,并计算两个数组中数据的个数(第四章 5、11 )
25,实验
显示AL中的两位十六进制数的程序 (显示分两步,先显示3,后显示e)
CODE SEGMENT
ASSUME CS:CODE
START MOV AL,3EH
PUSH AX
MOV DL,AL
MOV CL,4
SHR DL,CL ;逻辑右移
CMP DL,9 ;DL是否小于等于9
JBE NEXT1 ;BE(小于等于)即满足DL≤9跳转NEXT1
ADD DL,7
NEXT1: ADD DL,30H ;要转换或ASC码显示0~9 30H~39H
MOV AH,2
INT 21H ;2号功能调用,显示字符放入入口参数DL中
POP AX ;保护AX
MOV DL,AL
AND DL,0FH ;屏蔽高4位
CMP DL,9
JBE NEXT2
ADD DL,7
NEXT2: ADD DL,30H ;显示A-F
MOV AH,2
INT 21H
MOV AH,40H
INT 21H
CODE ENDS
END START
显示键入字符程序
CODE SEGMENT
ASSUME CS:CODE
START: MOV AH,1
INT 21H ;1号功能调用,出口参数要显示字符存AL中
CMP AL,0DH ;与回车比较
JZ DONE ;ZF=1时跳转
CMP AL,’0’
JB NEXT ;小于0转NEXT
CMP AL,’9’
JA CHRUP ;大于9转CHRUP
MOV DL,AL ;AL传DL,用于显示
MOV AH,2
INT 21H
JMP START ;0~9直接显示
CHRUP: CMP AL,41H ;与A比较
JB NEXT ;小于A跳NEXT
CMP AL,5AH ;与Z比较
JA CHRDN ;大于Z跳CHRDN
DISPC: MOV DL,’c’ ;否则显示c
MOV AH,2
INT 21H
NEXT: JMP START
CHRDN:CMP AL,61H ;a
JB NEXT
CMP AL,7AH ;z
JA NEXT
JMP DISPC
DONE: MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END START
偶校验程序清单 (多少个字符加了校验位)
DSEG SEGMENT
STRN DB ’ABCDEfghijkLMNOPQuvw’,’$’
N DB? ;统计结果
DSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
LEA SI,STRN ;首地址传到SI
MOV DL,0
AGAIN: MOV AL,[SI] ;取字符
CMP AL,’$’ ;与‘$’比较
JE DONE
TEST AL, OFFH ;与操作
JPE NEXT ;PE=1,则1的个数为偶
OR AL,80H ;最高位补1
MOV [SI],AL
INC DL ;DL+1
NEXT: INC SI ;修改指针
JMP AGAIN
DONE: MOV N,DL
MOV AH,4CH
INT 21H
CSEG ENDS
END START
加法程序
CODE SEGMENT
ASSUME CS: CODE,DS: CODE
START: MOV AX,CS
MOV DS,AX ;DS←CS
LEA SI,DAT1
LEA DI,DAT2
LEA BX,DAT3 ;指针
MOV CX,10
XOR AL,AL ;对AL清零
AGAIN: MOV AL,[SI]
ADC AL,[DI] ;第一个字节相加
MOV [BX],AL
INC SI
INC DI
INC BX ;自动加1
LOOP AGAIN ;CX减1处理循环
MOV AH,4CH
INT 21H
DAT1 DB 70H,80H,90H,A0H,A1H,A2H,A3H
DB 74H,65H,56H
DAT2 DB 45H,67H,89H,1AH,2BH,3CH,
DB 4DH,5EH,6FH,04H
DAT3 DB 10 DUP(?)
CODE ENDS
END START
26,20根地址线最大内存容量是2^20 =1048576B,即1MB
27,SP和BP是指针寄存器,SP指示栈顶的偏移地址
28,中断矢量表存放在存储器最低位
29,条件转移指令多路分支,输入5路分支需要3条件转移指令
30,8086存储器采用分体式结构:偶地址存储体(AO)和奇地址存储体(BHE),各为512K