2024年6月12日发(作者:)

3.12 用乘法指令时,特别要注意先判断用有符号数乘法指令还是用无符号数乘法指令,这是为什么?

[ 解答 ] 用乘法指令时,特别要注意先判断用有符号数乘法指令还是用无符号数乘法指令,是因为在执行

乘法运算时,要想使无符号数相乘得到正确的结果,有符号数相乘时,就得不到正确的结果;要想使有符

号数相乘得到正确的结果,无符号数相乘时,就得不到正确的结果。

3.13 字节扩展指令和字扩展指令用在什么场合?举例说明。

[ 解答 ] 遇到两个字节相除时,要预先执行 CBW 指令,以便产生一个双倍长度的被除数。否则就不能正

确的执行除法操作。 CWD 同理。

3.14 什么叫 BCD 码?什么叫组合的 BCD 码?什么叫非组合的 BCD 码? 8086 汇编语言在对 BCD 码进

行加、减、乘、除运算时,采用什么方法?

[ 解答 ] 在计算机中,可用 4 位二进制码表示一个十进制码,这种代码叫 BCD 码;用一个字节表示 2 位

BCD 码就是 BCD 码;计算机对 BCD 码进行加、减、乘、除运算,通常采用两种办法:一种是在指令系统

中设置一套转专用于 BCD 码的指令;另一种方法是利用对普通二进制数的运算指令算出结果,然后用专门

的指令对结果进行调整,或者反过来,先对数据进行调整,再用二进制数指令进行运算。(以上 7 题由陈

军解答)

3.15 用普通运算指令执行 BCD 码运算时,为什么要进行十进制调整?具体讲 , 在进行 BCD 码的加、减、

乘、除运算时,程序段的什么位置必须加上十进制调整指令?

[ 解答 ] 在 BCD 码中,只允许 0?/FONT>9 这 10 个数字出现,但有时候的运算结果会超过此范围,因此

要进行十进制调整。进行加、件或乘法运算时,调整指令必须紧跟在算术指令后面,在进行除法运算时,

调整指令放在除法指令之前。

3.18 用串操作指令设计实现以下功能的程序段:首先将 100H 个数从 2170H 处搬到 1000H 处,然后,从

中检索相等于 AL 中字符的单元,并将此单元值换成空格符。

[ 解答 ] BUFF1 EQU , 1000H

BUFF2 EQU , 2170H

START : MOV SI , OFFSET BUFF2

LEA DI , BUFF1

MOV CX , 100H

CYCLE : MOV AL , [SI]

MOV [DI] , AL

INC SI

INC DI

LOOP CYCLE

ANOTHER : MOV DI , OFFSET BUFF1

MOV CX , 100

CLD

AGE : SCASB

DEC CX

JZ FIN

JNZ AGE

JMP OVER

FIN : MOV [DI] , 20H

CMP CX , 0

JNZ AGE

OVER : RET

3.20 带参数的返回指令用在什么场合?设栈顶地址为 3000H ,当执行 RET 0006 后, SP 的值为多少?

[ 解答 ] 带参数的返回指令可用在这样的情况:主程序为某个子程序提供一定的参数或者参数地址先送到

堆栈中,通过堆栈传递给子程序。当栈顶指针 SP=3000H ,执行 RET 0006 时,弹出 3000H 和 3001H 处

的返回地址,腾出 3002H?/FONT>3007H 的空间,所以 SP=3008H 。(以上 6 题由张丽解答)

.22 中断指令执行时,堆栈的内容有什么变化?中断处理子程序的人口地址是怎样得到的?

[ 答案 ] 中断指令执行时,堆栈内容变化如下:标志寄存器被推入堆栈,且 SP 减 2 ,然后 CPU 将

主程序的下一条指令地址即断点地址的段值和偏移量推入堆栈,且 SP 减 4 。

某中断处理子程序的入口地址即中断向量,由该中断类型号的 4 倍为内存地址,在该地址处的 4 个字节

内容即该中断向量。

3.23 中断返回指令 IRET 和普通子程序返回指令 RET 在执行时,具体操作内容什么不同?

[ 答案 ] IRET 须弹出堆栈中标志寄存器的值,而 RET 则不需要。

3.29 下面的程序段将 ASCII 码的空格字符填满 100 个字节的字符表。阅读这一程序,画出流程,并说明

使用 CLD 指令和 REP STOSB 指令的作用,再指出 REP STOSB 指令执行时和那几个寄存器的设置有关?