80X86汇编语言程序设计教程(杨季文)习题答案二

时间:2022-09-01 07:54:48

第二章 答案
Tarzan 版

题2.1 8086/8088通用寄存器的通用性表现在何处?8个通用寄存器各自有何专门用途?哪些
      寄存器可作为存储器寻址方式的指针寄存器?

答:8086/8088通用寄存器的通用性表现在:
    这些寄存器除了各自规定的专门用途外,他们均可以用于传送和暂存数据,可以保存
    算术逻辑运算中的操作数和运算结果;
    8个通用寄存器的专门用途如下:
    AX 字乘法,字除法,字I/O
    BX 存储器指针
    CX 串操作或循环控制中的计数器
    DX 字乘法,字除法,间接I/O
    SI 存储器指针(串操作中的源指针)
    DI 存储器指针(串操作中的目的指针)
    BP 存储器指针(存取堆栈的指针)
    SP 堆栈指针
   
    其中BX,SI,DI,BP可作为存储器寻址方式的指针寄存器

题2.2  从程序员的角度看,8086/8088有多少个可访问的16位寄存器?有多少个可访问的8位
       寄存器?

答:   从程序员的角度看,8086/8088有14个可访问的16位寄存器;有8个可访问的8位寄存器;


题2.3  寄存器AX与寄存器AH和AL的关系如何?请写出如下程序片段中每条指令执行后寄存器
      AX的内容:
      MOV AX,1234H
      MOV AL,98H
      MOV AH,76H
      ADD AL,81H
      SUB AL,35H
      ADD AL,AH
      ADC AH,AL
      ADD AX,0D2H
      SUB AX,0FFH

答:  MOV AX,1234H        AX=1234H
      MOV AL,98H          AX=1298H
      MOV AH,76H          AX=7698H
      ADD AL,81H          AX=7619H
      SUB AL,35H          AX=76E4H
      ADD AL,AH           AX=765AH
      ADC AH,AL           AX=D15AH
      ADD AX,0D2H         AX=D22CH
      SUB AX,0FFH         AX=D12DH

题2.4  8086/8088标志寄存器中定义了哪些标志?这些标志可分为哪两类?如何改变这些标志
       的状态?

答:  8086/8088标志寄存器中定义了9个标志,如下:
      CF: Carry Flag
      ZF: Zero Flag
      SF: Sign Flag
      OF: Overflow Flag
      PF: Parity Flag
      AF: Auxiliary Carry Flag
      DF: Direction Flag
      IF: Interrupt-enable Flag
      TF: Trap Flag
     
      这些标志可分为两类,分别为:
      1、运算结果标志;
      2、状态控制标志;

      采用指令SAHF可把AH中的指定位送至标志寄存器低8位SF、ZF、AF、PF、CF;
      采用CLC可清除CF,置CF到0
      采用STC可置CF到1
      采用CLD可置DF到0
      采用sTD可置DF到1
      采用CLI可置IF到0
      采用STI可置IF到1
      另外,在某些指令执行过程中会改变部分标志的状态;

题2.5  请说说标志CF和标志OF的差异。

答:   如果把指令中处理的数据按照无符号数看待,则处理结果达到进位是,置CF为1;
       如果把该处理中的数据按照有符号数看待,则处理结果超过有符号数表达范围的,
       置OF为1;两个标志同步进行,CPU并不知道该数的类型;

题2.6  8086/8088如何寻址1M字节的存储器物理地址空间?在划分段时必须满足的两个条件
       是什么?最多可把1M字节空间划分成几个段?最少可把1M字节地址空间划分成几个段?

答:   8086/8088通过对存储器分段和使用段寄存器的方式寻址1M字节的存储器物理地址空间;
       在划分段时必须满足的两个条件是:
       1、逻辑段的开始地址必须是16的倍数;
       2、逻辑段的嘴道长度是64K;
       1M的字节空间划分为64K个逻辑段;最少可把1M字节地址划分成16个逻辑段;

题2.7  在8086/8088上运行的程序某一时刻最多可访问几个段?程序最多可具有多少个段?
       程序至少几个段?

答:   在8086/8088上运行的程序某一时刻最多可访问4个当前段:代码段,数据段,堆栈段
       和附加段;程序最多可具有4种类型的段,最少要有一个代码段;

题2.8  存储单元的逻辑地址如何表示?存储单元的20位物理地址如何构成?

答:   存储单元的逻辑地址由段值和偏移两部分组成:段值:偏移;
       存储单元的20位物理地址可以表示为:
       物理地址=段值×16+偏移;


题2.9  当段重叠时,一个存储单元的地址可表示成多个逻辑地址。请问物理地址12345H可表示
       多少个不同的逻辑地址?偏移最大的逻辑地址是什么?偏移最小的逻辑地址是什么?

答:   12345H可表示1000H(4096)个不同的逻辑地址,偏移最大的逻辑地址是235:0FFF5H
       偏移最小的逻辑地址是1234:0005H

题2.10 为什么称CS为代码段寄存器?为什么称SS为堆栈寄存器?

答:   因为在取指令的时候,规定的段寄存器就是CS,所以CS为代码段寄存器;
       而堆栈操作时规定的寄存器是SS,所以SS为堆栈寄存器;

题2.11 请举例说明何为段前缀超越。什么场合下要使用段前缀超越?

答:   在存取一般存储器操作数时,段寄存器可以不是DS;当偏移设计BP寄存器时,段寄存器
       也可以不必是SS;如Mov AX,[si] 默认段地址在DS中,也可以改变:Mov AX, ES:[si]
       当数据并不在默认的DS指定段时,可以采用段前缀超越;

题2.12 8086/8088的基本寻址方式可分为哪三类?他们说明了什么?

答:   8086/8088的基本寻址方式可分为以下三类:
       1、存储器寻址;
       2、立即寻址;
       3、寄存器寻址;
       他们说明了cpu有三类合计七种方式进行基本寻址;


题2.13 存储器寻址方式分为哪几种?何为存储器的有效地址?

答:   存储器寻址方式分为以下几种:
       1、立即寻址;
       2、直接寻址;
       3、寄存器寻址;
       4、寄存器间接寻址;
       5、寄存器相对寻址;
       6、基址加变址寻址;
       7、相对基址加变址寻址;

       存储器的有效地址是一个16bit的无符号数;

题2.14 什么场合下缺省的段寄存器是SS?为什么这样安排?

答:   当使用堆栈时,缺省的段寄存器是SS;
       因为SS定义为堆栈段寄存器,配合SP堆栈指针,用来指向堆栈的栈顶;

题2.15 请说明如下指令中源操作数的寻址方式,并作相互比较:
       MOV BX,[1234H]
       MOV BX,1234H
       MOV DX,BX
       MOV DX,[BX]
       MOV DX,[BX+1234H]
       MOV DX,[BX+DI]
       MOV DX,[BX+DI+1234H]

答:   MOV BX,[1234H]               ;直接寻址
       MOV BX,1234H                 :立即寻址
       MOV DX,BX                    :寄存器寻址
       MOV DX,[BX]                  :寄存器间接寻址
       MOV DX,[BX+1234H]            :寄存器相对寻址
       MOV DX,[BX+DI]               :基址加变址寻址
       MOV DX,[BX+DI+1234H]         :相对基址加变址寻址

题2.16 8086/8088提供了灵活多样的寻址方式,如何适当的选择寻址方式?

答:   每种寻址方式都有其特点,首先应该掌握不同寻址方式之间的区别,以及
       适用的范围,结合程序中的需要进行灵活选择。

题2.17 设想一下这些寻址方式如何支持高级语言的多种数据结构?

答:   自己设想!


题2.18 为什么目标操作数不能采用立即寻址方式?

答:   立即寻址表示是一个操作数,并非一个存储空间,作为目标操作数是不合适的;


题2.19 处理器的通用寄存器是否越多越好?通用寄存器不够用怎么办?

答:   处理器的通用寄存器并非越多越好,因为如果处理器的通用寄存器数量太多,势必
       造成处理器的成本增加,同时也增加了处理器设计的复杂度;
       如果通用寄存器不够用,应该采用内存中的存储单元代替,不过速度上要有所牺牲;

题2.20 哪些存储器寻址方式可能导致有效地址超出64K的范围?8086/8088如何处理这种
       情况?

答:   寄存器相对寻址,基址加变址寻址,相对基址加变址寻址这三种寻址方式有可能导致
       有效地址超出64K的范围,8086/8088将取其64K的模进行访问;

题2.21 什么情况下根据段值和偏移确定的存储单元地址会超出1M?8086/8088如何处理这种
       情况?

答:   当物理地址的计算超过FFFFFH时,存储单元地址会超出1M,8086/8088将取其1M的模
       覆盖存取;

题2.22 8086/8088的指令集可分为哪6个子集?


答:   8086/8088的指令集可分为以下6个子集:
       1、数据传输
       2、算术运算
       3、逻辑运算
       4、串操作
       5、程序控制
       6、处理器控制

题2.23 8086/8088的指令集合中,最长的指令有几个字节?最短的指令有几个字节?

答:   8086/8088的指令集合中,最长的指令4个字节,最短的指令2个字节;
       MOV AX,[BX+SI+1234H]


题2.24 8086/8088的算术逻辑运算指令最多一次处理多少二进制位?当欲处理的数据
       长度超出该范围怎么办?

答:   8086/8088的算术逻辑运算指令最多一次处理16bit的二进制位;如果处理的数据
       长度超出则分成若*分进行逻辑运算,最后进行整合;

题2.25 如何时序数据段和代码段相同?

答:   将数据段的内容写入代码段中,并将代码段的段值赋给DS即可;

题2.26 通常情况下源操作数和目的操作数不能同时是存储器操作数。请给出把存储器操作
       数甲送到存储器操作数乙的两种方法。

答:  
       法一:
       MOV AX, [BX]
       MOV [SI],AX       DS:[BX]=甲,DS:[SI]=乙
       法二:
       MOV AX,[BX]
       XCHG AX,[SI]
       法三:
       PUSH WORD PTR [BX]
       POP  WORD PTR [SI]

题2.27 请用一条指令实现把BX的内容加上123并把和送到寄存器AX。

答:   LEA AX, [BX+123H]

题2.28 堆栈有哪些用途?请举例说明。

答:   堆栈的用途主要有:
       1、现场和返回地址的保护;
       MOV AX, OFFSET ADDRESS
       PUSH AX
       JMP XXX
       ...
       RET

       2、寄存器内容的保护;
       PUSH AX
       PUSH BX
       ...
       POP BX
       POP AX

       3、传递参数;
       PUSH [BX]
       CALL XXX
       ...
       XXX:
       POP AX
       ...

       4、存储局部变量;
       PUSH DS
       PUSH CS
       POP DS
       ...
       POP DS

题2.29 在本章介绍的8086/8088指令中,哪些指令把寄存器SP作为指针使用?8086/8088指令
       集中,哪些指令把寄存器SP作为指针使用?

答:   以下指令把寄存器SP作为指针使用:
       1、PUSH
       2、POP
       3、PUSHF
       4、POPF

       5、PUSHA
       6、POPA
       7、RET
       8、CALL
       9、RETF
    
题2.30 请说说标志CF的用途。请至少给出使标志CF清0的三种方法。

答:   CF的用途主要有:
       1、配合条件转移语句进行条件转移;
       2、配合移位指令实现操作数之间的位转移;
       3、常作为子程序的出口参数;如DOS磁盘文件管理功能调用等;

       CF清0的方法:
       法一:
       CLC
       法二:
       ADD AX,0FFFFH
       法三:
       CMP AX,0

题2.31 请写出如下程序片段中每条算术运算指令执行后标志CF、ZF、SF、OF、PF和AF的状态。
       MOV AL,89H
       ADD AL,AL
       ADD AL,9DH
       CMP AL,0BCH
       SUB AL,AL
       DEC AL
       INC AL
      
答:   INSTRUCTION           CF    ZF    SF    OF    PF    AF
       MOV AL,89H            0     0     0     0     0     0
       ADD AL,AL             1     0     0     1     1     1
       ADD AL,9DH            0     0     1     0     1     0
       CMP AL,0BCH           1     0     1     0     1     0
       SUB AL,AL             0     1     0     0