微机(第四版)戴梅萼 第三章 习题答案

更新时间:2024-01-03 07:09:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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 指令执行时和那几个寄存器的设置有关?

MOV CX, SEG TABLE ; TABLE 为字节表表头 MOV ES, CX

MOV DI, OFFSET TABLE ; DI 指向字节表 MOV AL, ' '

MOV CX, 64H ; 字节数 CALL FILLM ; 调用数子程序 ... ...

FILLM: JCXZ EXIT ; CX 为 0 则退出 PUSH DI ; 保存寄存器 PUSH CX CLD

REP STOSB ; 方向标志清零 POP CX ; 重复填数 POP DI EXIT: RET

[ 答案 ] CLD 指令作用:方向标志清 0 ; REP STOSB 指令作用:重复 CX 次将 AL 中的字节填入 [ES:DI] 为起始的表内, DI 增量、减量根据 DF 确定: DF=0 , DI 每次增量; DF=1 , DI 每次减量。 STOSB 指令执时,与 AX 、 ES 、 DI 寄存器和 Flag 的 DF 位设置有关。流程图如右:

3.30 下程序将一个存储块的内容复制到另一个存储快,进入存储段时, SI 中为源区起始地址的偏移量, DI 中为目的区起始地址的偏移量, CX 中为复制的字节数。阅读程序并说明具体的 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 MOVEM

LOWER: CLD ; 从第一个字节开始复制 MOVEM: REP MOVSB POP CX POP SI POP DI RET

[ 答案 ] REP MOVSB 的作用是重复 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 下面的程序实现在 TABLE 为起始地址的 100 个字符长度的表中检索 “$\分析程序,然后说明 REPNE SCASB 指令的具体执行过程。

START: MOV CX, SEG TABLE ; 表段地址送 ES MOV ES, CX

MOV DI, OFFSET TABLE ; 表偏移量送 DI MOV AL, '$' ; 检索的关键字 MOV CX, 64H ; 检索的字节数 PUSH DI ; 保存起始地址 CLD ; 清除方向标志 REPNE SCASB ; 检索

JNZ NFOUN ; 如未找到,则转移 SUB DI, 1 ; 找到,则指向次字符 JMP EXIT

NFOUN: POP DI ; 恢复起始地址

EXIT: RET ;( 以上由 1007 孙成长输入 )

[ 答案 ]REPNE SCASB 指令的作用将 AL 中的字节与 [ES:DI] 中的字节比较,不相等则 DI 加或减 1 后继续比较。这样可以在 [ES:DI] 起始的内存中检索到字节 AL ,一旦找到则操作结束,一直未找到则重复 CX 次。 ( 以上 6 题由张娅琴解答

3.35 下面的一个实现 16 位非组合 BCD 码相加的程序段,阅读这一程序段后再设计一个实现 16 位非组合 BCD 码减法的程序。

ANBCD: MOV CH, AH ; 进入程序段时, AX 中为第二个操作数 ADD AL, BL ; BX 中为被加数,实现低 8 位相乘

AAA XCHG AL, CH

ADC AL, BH ; 实现高 8 位相加 AAA

MOV AH, AL ; 和保存在 AX 中 MOV AL, CH RET

[ 答案 ] SUBCD: MOV CH, AH ; AX-BX->AX ,为非组合 BCD 码 SUB AL, BL AAS XCHG AL,CH SBB AL,BH AAS MOV AH,AL MOV AL,CH RET

3.38 以下程序将一个 8 位二进转换为 2 位 BCD 数字,进入程序时, AL 中为二进制数,退出程序时,如 CF 为 0 ,则 AL 中为 BCD 数字,如 CF 为 1 ,则表示由于输入值超出范围故结果无效。阅读下面程序后,画出流程图,然后设计一个将组合的 BCD 码 (2 位 ) 转换为 8 位二进制数的程序。 [ 答案 ] 流程图如右:

START: CMP AL, 99 ; 是否超出范围? JBE STRAT

STC ; 是,则转 EXIT ,并给 CF 置 1 JC EXIT

STRAT: MOV CL, 10 ; 10 作为除数 XOR AH, AH

CBW ; 将 AL 中数扩展到 AH

DIV CL ; 除法结果 AL 中为高位, AH 中为低位 MOV CL, 4

SHL AL, CL ; 左移 4 位

OR AL, AH ; 合成 BCD 码在 AL 中

EXIT: RET ; (以上 6 题由张琼仙解答)

START: CMP AL, 99 ; 是否超出范围? JBE STRAT

STC ; 是,则转 EXIT ,并给 CF 置 1 JC EXIT

STRAT: MOV CL, 10 ; 10 作为除数 XOR AH, AH

CBW ; 将 AL 中数扩展到 AH

DIV CL ; 除法结果 AL 中为高位, AH 中为低位 MOV CL, 4

SHL AL, CL ; 左移 4 位

OR AL, AH ; 合成 BCD 码在 AL 中

EXIT: RET ; (以上 6 题由张琼仙解答)

本文来源:https://www.bwwdw.com/article/r0ox.html

Top