微型计算机原理(第六版)姚向华编著(转载请注明出处---https://www.cnblogs.com/qingl)

时间:2024-01-30 21:34:40

微型计算机原理复习(第六版)姚向华编著(转载请注明出处---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

 

  1. 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°    试述可屏蔽中断的响应和处理过程

解:

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)

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