〔习题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
〔习题3.30〕
说明如下程序执行后的显示结果:
msg
; 数据段
byte 'WELLDONE',0 ; 代码段
mov ecx,(lengthof msg)-1
- -17
again: 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”的个数恒为奇数,就是奇校验;恒为偶数,就是偶校验。
③ 无符号数和有符号数的操作影响两组不同的标志状态位,故判断两个无符号数和有符号数的大小关系要利用不同的标志位组合,所以有对应的两组指令。
④ 双分支结构中两个分支体之间的JMP指令,用于实现结束前一个分支回到共同的
- -18
出口作用。
⑤ 完整的子程序注释可方便程序员调用该子程序,子程序注释包括子程序名、子程序功能、入口参数和出口参数、调用注意事项和其他说明等。
⑥ 子程序保持堆栈平衡,才能保证执行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:
jmp labl1 nop
mov eax,'?' call dispc mov eax,'1' call dispc
jmp near ptr labl2 nop
mov eax,'?' call dispc mov eax,'2'
; 相对寻址
; 相对近转移
- -19
labl3:
labl4: call dispc
mov eax,offset labl3 jmp eax ; 寄存器间接寻址 nop
mov eax,'?' call dispc mov eax,'3' call dispc
mov eax,offset labl4 mov nvar,eax jmp nvar ; 存储器间接寻址 nop
mov eax,'?' call dispc mov eax,'4' call dispc
〔习题4.5〕
使用“SHR EAX,2”将EAX中的D1位移入CF标志,然后用JC/JNC指令替代JZ/JNZ指令完成例题4-3的功能。 〔解答〕
mov eax,56h shr eax,2 jnc nom ...
; 假设一个数据 ; D1位移入CF标志
; D1=0条件成立,转移 ; 余同原程序
〔习题4.6〕
执行如下程序片断后,CMP指令分别使得5个状态标志CF、ZF、SF、OF和PF为0还是为1?它会使得哪些条件转移指令指令Jcc的条件成立、发生转移?
mov eax,20h cmp eax,80h
〔解答〕
CF=1 ZF=0 SF=1 OF=0 PF=1
可以使得条件成立、发生转移的指令有:JC JS JP JNZ JNO 〔习题4.7〕
将例题4-4程序修改为实现偶校验。建议进一步增加显示有关提示信息的功能,使得程序具有更加良好的交互性。 〔解答〕
include io32.inc .data
msg1 byte 'Please input a character: ',0
msg2 byte 'The ASCII code of the charater you entered is: ',0 msg3 byte 'The code with even parity is: ',0 .code start: mov eax,offset msg1 call dispmsg call readc
- -20