80X86汇编语言程序设计教程杨季文课后习题答案.docx
80X86汇编语言程序设计教程杨季文课后习题答案 第二章答案 题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.48086/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.68086/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,89H000000 ADD AL,AL10011 1 ADD AL,9DH001010 CMP AL,0BCH101010 SUB AL,AL010010 DEC AL00101 1 INC AL01001 1 题2.32 什么是除法溢出?如何解决16位被除数8位除数可能产生的溢出? 答:除法溢出是指除数如果是0,或者在8位除数时商超过8位,或者在16位除时商超过16位,则认为是除法溢出,引起0中断; 首先要确定8位除数不能为0,其次要确定商的最大值不能超过8位,如果超过8位,则可采用16位的除法; 题2.33 请写出如下程序片段中每条逻辑运算指令执行后标志ZF、SF、PF的状态:MOV AL,45H AND AL,0FH OR AL,0C3H XOR AL,AL 答:INSTRUCTION ZF SF PF MOV AL,45H000 AND AL,0FH00 1 OR AL,0C3H010 XOR AL,AL10 1 题2.34 “MOV AX,0”可寄存器AX清0。另外再写出三条可使寄存器AX清0的指令。 答:法一: XOR AX,AX 法二: AND AX,0 法三: SUB AX,AX 题2.35 请写出如下程序片段中每条移位指令执行后标志CF、ZF、SF和PF的状态。 MOV AL,84H SAR AL,1 SHR AL,1 ROR AL,1 RCL AL,1 SHL AL,1 ROL AL,1 答: INSTRUCTION CF ZF SF PF MOV AL,84H0000 SAR AL,10010 SHR AL,10000 ROR AL,11000(该命令不影响SF位) RCL AL,11000 SHL AL,10010 ROL AL,11010 题2.36 8086/8088中,哪些指令把寄存器CX作为计数器使用?哪些指令把寄存器BX作为基指针寄存器使用? 答:8086/8088中,以下指令把寄存器CX作为计数器使用: 1、LOOP 2、LOOPE 3、LOOPZ 4、LOOPNZ 5、LOOPNE 6、JCXZ 以下指令把寄存器BX作为基指针寄存器使用: 1、MOV 2、XCHG 3、LEA 4、LDS 5、LES 6、ADD . 题2.37 请不用条件转移指令JG、JGE、JL和JLE等指令实现如下程序片段的功能:CMP AL,BL JGE OK XCHG AL,BL OK: . 答:如下命令可实现同样功能: PUSH CX;Reserve CX XOR CX,CX;CX=0 MOV CH,02H;CH=02H MOV CL,AL;CL=AL MOV BH,0H;BH=0 SUB CX,BX;If CH=2, AL>=BL; If CH=1, AL<BL SHR CX,8;CX=2 or 1 LOOP OK;If CX=2 jmp to OK; If CX=1 Exchange AL,BL XCHG AL,BL OK: POP CX;Revert CX . 题2.38 段间转移和段转移的本质区别是什么?8086/8088哪些指令可实现段间转移? 答:段间转移和段转移的本质区别是有没有对CS进行设置,如果设置了新的CS代码寄存器,程序将转移到另一个段中,即实现了段间转移;否则CS和原来一致,则在同一代码段中继续进行,只是IP指针进行了调整,即为段转移; 8086/8088中如下指令可以实现段间转移: 1.JMP FAR PTR LEAEL 2.JMP OPRD 3.CALL 4.RET/RETF 题2.39 8086/8088的条件转移指令的转移围有多大?如何实现超出围的条件转移? 答:8086/8088的条件转移指令的转移围只能从126到129之间,如果出现超出 围的条件转移,要借助无条件转移命令JMP;