1、微机原理习题答案第五章习题答案一、 问答题1. 断点中断是指怎样一种中断?在程序调试中有什么作用? 断点中断指令有什么特点?设置断点过程对应了一种什么操作?这种操作会产生什么运行结果?答: 断点中断即中断类型3,一般该中断处理程序进行程序调试,主要功能是显示一些寄存器的值,并给出一些重要的信息。在程序调试中,断点中断就是从一个较长的程序中分离出一个较短的存在问题的程序段。断点中断的特点是指令占一个字节。设置断点过程对应int 3替换那条指令,在中断处理程序中再恢复该被替换的指令,并修改堆栈中的断点地址为中断处的地址而不是下一条指令地址。这种操作使断点中断不会影响程序的功能。2. 用普通运算指令
2、执行BCD码运算时,为什么要进行十进制调整?具体讲,在进行BCD码的加、减、乘、除运算时,程序段的什么位置必须加上十进制调整指令?答: 在BCD码中,只允许0?/FONT9这10个数字出现,但有时候的运算结果会超过此范围,因此要进行十进制调整。进行加、件或乘法运算时,调整指令必须紧跟在算术指令后面,在进行除法运算时,调整指令放在除法指令之前。3. 普通移位指令(带CF的和不带CF的两类)在执行操作时,有什么差别?在编制乘法程序时,为什么常用移位指令来代替乘除法指令?试编写一个程序段,实现将BX中的数除以10,结果仍放在BX中。答: 带CF和不带CF的普通移位指令的差异:前者用于算术运算,后者用
3、于逻辑运算。程序段: MOV CL,0AH MOV AX,BX IDIV CL MOV BX,AX二、 程序改错及编程1.下面的程序段将ASCII码的空格字符填满100个字节的字符表。阅读这一程序,画出流程,并说明使用CLD指令和REP STOSB指令的作用,再指出REP STOSB指令执行时和那几个寄存器的设置有关? MOV CX, SEG TABLE ; TABLE为字节表表头 MOV ES, CX MOV DI, OFFSET TABLE ; DI指向字节表 MOV AL, MOV CX, 64H ; 字节数 CALL FILLM ; 调用数子程序 . .FILLM: JCXZ EXIT
4、 ; CX为0则退出 PUSH DI ; 保存寄存器 PUSH CX CLD REP STOSB ; 方向标志清零 POP CX ; 重复填数 POP DIEXIT: RET答: CLD指令作用:方向标志清0;REP STOSB指令作用:重复CX次将AL中的字节填入ES:DI为起始的表内,DI增量、减量根据DF确定:DF=0,DI每次增量;DF=1,DI每次减量。STOSB指令执时,与AX、ES、DI寄存器和Flag的DF位设置有关。流程图如下: 2. 下程序将一个存储块的内容复制到另一个存储快,进入存储段时,SI中为源区起始地址的偏移量,DI中为目的区起始地址的偏移量,CX中为复制的字节数。
5、阅读程序并说明具体的REP MOCSB指令使用与那些寄存器有关? PUSH DI ; 保存寄存器 PUSH SI PUSH CX CMP DI, SI ; 看源区和目的区的地址哪个高 JBE LOWER ; 如目的区地址底,则转移 STD ; 如目的区地址高,则设方向标志为1 ADD SI, CX ; 从最后一个字节开始复制 DEC SI ; 调整源区地址 ADD DI, CX DEC DI ; 调整目的区地址 JMP MOVEMLOWER: CLD ; 从第一个字节开始复制MOVEM: REP MOVSB POP CX POP SI POP DI RET答: REP MOVSB 的作用是重复
6、CX次将DS:SI中字节传送到ES:DI中。SI、DI加或减1由DF确定,DF=0,加。REP使CX减1,到0后结束传送。所以 REP MOVSB 指令与CX、SI、DI、ES、DS寄存器和Flag的DF位设置有关。3. 下面的程序实现两个32位带符号数的乘法,其中调用了题3.33中的非符号数相乘的程序MUL64,结果放在DX、CX、BX、AX四个寄存器中,进入程序时,DX、AX中为被乘数,CX、BX中为乘数。读懂程序后再设计一个16位带符号数和32位带符号数相乘程序。MULS64: MOV 1000, 0 ; 1000单元作为负数标志 CMP DX, 0 ; 乘数为负数吗? JNS CHKK
7、 ; 否,则转CHKK NOT AX ; 是,则取补码 NOT DX ADD AX, 1 ADC DX, 0 NOT 1000 ; 负数标志置1CHKK: CMP CX, 0 ; 乘数为负数吗? JNS GOMUL ; 否,则转GOMUL NOT BX ; 是,则取补码 NOT CX ADD BX, 1 ADC CX, 0 NOT 1000 ; 将负数标志取反; -GONUL: CALL MUL64 ; 调用非符号数乘法程序 CMP 1000, 0 ; 结果为正数吗? JZ EXIIT ; 是正数,则转移 NOT AX ; 是负数,则取补码 NOT BX NOT CX NOT DX ADD A
8、X, 1 ADC BX, 0 ADC CX, 0 ADC DX, 0EXIIT: RET答: (DX、AX)*CX-DX、CX、AX,为有符号数MULS48: MOV 1000, 0 ; 1000单元作为负数标志 CMP DX, 0 ; 乘数为负数吗? JNS CHKK ; 否,则转CHKK NOT AX ; 是,则取补码 NOT DX ADD AX, 1 ADC DX, 0 NOT 1000 ; 负数标志置1CHKK: CMP CX, 0 ; 乘数为负数吗? JNS GOMUL ; 否,则转GOMUL NOT CX ; 是,则取补码 ADD CX, 1 NOT 1000 ; 将负数标志取反 GONUL: CALL MUL48 ; 调用32位*16位无符号数乘法程序 CMP 1000, 0 ; 结果为正数吗? JZ EXIT0 ; 是正数,则转移 NOT AX ; 是负数,则取补码 NOT CX NOT DX ADD AX, 1 ADC CX, 0 ADC DX, 0EXIT0: RET