微机原理与接口技术+参考答案 下载本文

xor esi,0feh ; ESI=__________H ; EAX=__________B

; EAX=__________B,CF=__________ ; EAX=__________B,CF=__________ ; EAX=__________B,CF=__________ ; EAX=__________B

; EAX=__________B,CF=__________ ; EAX=__________B,CF=__________ ; EAX=__________B,CF=__________

; EAX=__________,CF=__________,OF=__________ ; ZF=__________,SF=__________,PF=__________

(2)

mov eax,1010b shr eax,2 shl eax,1 and eax,3

(3)

mov eax,1011b rol eax,2 rcr eax,1 or eax,3

(4)

xor eax,eax

〔解答〕

(1)

; ESI=9CH ; ESI=80H ; ESI=FFH ; ESI=01H

(2)

; EAX=1010B(可以有前导0,下同) ; EAX=0010B,CF=1 ; EAX=0100B,CF=0 ; EAX=0000B,CF=0

(3)

; EAX=1011B(可以有前导0,下同) ; EAX=101100B,CF=0 ; EAX=10110B,CF=0 ; EAX=10111B,CF=0

(4)

; EAX=0,CF=0,OF=0 ; ZF=1,SF=0,PF=1

〔习题3.24〕 〔解答〕

mov ax,1470h and ax,ax or ax,ax xor ax,ax not ax

test ax,0f0f0h

; AX=1470H ; AX=1470H ; AX=1470H ; AX=0000H ; AX=FFFFH ; AX=0F0F0H

CF OF 0 0 0 0 0 0 0 0 0 0

SF 0 0 0 0 1

ZF 0 0 1 1 0

PF 0 0 1 1 1

〔习题3.25〕

逻辑运算指令怎么实现复位、置位和求反功能?

〔解答〕

AND指令同“0”与实现复位,OR指令同“1”或实现置位,XOR同“1”异或实现求反。 〔习题3.26〕

说明如下程序段的功能:

mov ecx,16

- -13

next:

mov bx,ax shr ax,1 rcr edx,1 shr bx,1 rcr edx,1 loop next mov eax,edx

〔解答〕

将AX的每一位依次重复一次,所得的32位结果保存于EAX中。 〔习题3.27〕

编程将一个64位数据逻辑左移3位,假设这个数据已经保存在EDX.EAX寄存器对中。 〔解答〕

again:

; 代码段 mov ecx,3 shl eax,1 rcl edx,1 loop again

〔习题3.28〕

编程将一个压缩BCD码变量(例如92H)转换为对应的ASCII码,然后调用DISPC子程序(在输入输出子程序库中)显示。 〔解答〕

bcd

; 数据段 byte 92h ; 代码段 mov al,bcd shr al,4 add al,30h call dispc mov al,bcd and al,0fh add al,30h call dispc

〔习题3.29〕

以MOVS指令为例,说明串操作指令的寻址特点,并用MOV和ADD等指令实现MOVSD的功能(假设DF=0)。

〔解答〕

MOVS指令的功能是:

ES:[EDI]←DS:[ESI];ESI←ESI±1/2/4,EDI←EDI±1/2/4 由此可看出串操作指令的寻址特点:

源操作数用寄存器ESI间接寻址,默认在DS指向的数据段,但可以改变;目的操作数用寄存器EDI间接寻址,只能在ES指向的附加数据段;每执行一次串操作,源指针ESI和目的指针EDI将自动修改:±1(字节),±2(字)或±4(双字)。指针的增量和减量控制由DF标志确定,DF=0,进行增量;DF=1,进行减量。

push eax mov eax,[esi] mov es:[edi],eax add esi,4 add edi,4

- -14

〔习题3.30〕

说明如下程序执行后的显示结果:

msg again:

; 数据段

byte 'WELLDONE',0 ; 代码段

mov ecx,(lengthof msg)-1 mov ebx,offset msg mov al,[ebx] add al,20h mov [ebx],al add ebx,1 loop again

mov eax,offset msg call dispmsg

如果将其中语句“mov ebx,offset msg”改为“xor ebx,ebx”,则利用EBX间接寻址的两个语句如何修改成EBX寄存器相对寻址,就可以实现同样功能? 〔解答〕

显示结果:welldone EBX寄存器相对寻址:

mov al,msg[ebx] mov msg[ebx],al

〔习题3.31〕

下面程序的功能是将数组ARRAY1的每个元素加固定值(8000H),将和保存在数组ARRAY2。在空白处填入适当的语句或语句的一部分。

array1 array2 again:

; 数据段

dword 1,2,3,4,5,6,7,8,9,10 dword 10 dup(?) ; 代码段

mov ecx,lengthof array1 mov ebx,0

mov eax,array1[ebx*4] add eax,8000h mov ______________ add ebx,__________ loop again

〔解答〕

mov array2[ebx*4],eax add ebx,1

〔习题3.32〕

上机实现本章的例题程序,编程实现本章的习题程序。

第4章 汇编语言程序设计

〔习题4.1〕简答题

〔解答〕

① 当同一个程序被操作系统安排到不同的存储区域执行时,指令间的位移没有改变,目标地址采用相对寻址可方便操作系统的灵活调度。

② 数据通信时,数据的某一位用做传输数据的奇偶校验位,数据中包括校验位在内的“1”的个数恒为奇数,就是奇校验;恒为偶数,就是偶校验。

- -15

③ 无符号数和有符号数的操作影响两组不同的标志状态位,故判断两个无符号数和有符号数的大小关系要利用不同的标志位组合,所以有对应的两组指令。

④ 双分支结构中两个分支体之间的JMP指令,用于实现结束前一个分支回到共同的出口作用。 ⑤ 完整的子程序注释可方便程序员调用该子程序,子程序注释包括子程序名、子程序功能、入口参数和出口参数、调用注意事项和其他说明等。

⑥ 子程序保持堆栈平衡,才能保证执行RET指令时当前栈顶的内容是正确的返回地址。主程序也要保持堆栈平衡,这样才能释放传递参数占用的堆栈空间,否则多次调用该子程序可能就致使堆栈溢出。

⑦ “传值”是传递参数的一个拷贝,被调用程序改变这个参数不影响调用程序;“传址”时,被调用程序可能修改通过地址引用的变量内容。

⑧ INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含的是子程序库文件。

⑨ 取长补短。

⑩ Windows程序在运行时需要加载其配套的动态链接库DLL文件,当其没有被搜索到时就会提示不存在。

〔习题4.2〕判断题 〔解答〕

① 对 ⑥ 对

② 错 ⑦ 对

③ 错 ⑧ 错

④ 错 ⑨ 对

⑤ 错 ⑩ 错

〔习题4.3〕填空题

〔解答〕

① 相对寻址,间接寻址,直接寻址,间接寻址 ② 1256H,3280H③ 3721H,1④ EAH

⑤ 循环初始,循环控制⑥ REPT1标号的地址 ⑦ TEST ENDP,ENDM⑧ EBP

⑨ PUBLIC,EXTERN⑩ 38H 0DH 0AH 〔习题4.4〕

为了验证例题4-1程序的执行路径,可以在每个标号前后增加显示功能。例如使得程序运行后显示数码1234。 〔解答〕

labl1: labl2: labl3:

jmp labl1 nop

mov eax,'?' call dispc mov eax,'1' call dispc

jmp near ptr labl2 nop

mov eax,'?' call dispc mov eax,'2' call dispc

mov eax,offset labl3 jmp eax nop

mov eax,'?' call dispc mov eax,'3' call dispc

mov eax,offset labl4

; 寄存器间接寻址 ; 相对近转移 ; 相对寻址

- -16