微机原理和接口技术后习题答案解析 联系客服

发布时间 : 星期六 文章微机原理和接口技术后习题答案解析更新完毕开始阅读

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

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

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

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

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

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

⑨ 取长补短。

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

〔习题4.3〕填空题

(1)JMP指令根据目标地址的转移范围和寻址方式,可以分成四种类型:段内转移、__________,段内转移、__________和段间转移、__________,段间转移、__________。

(2)假设在平展存储模型下,EBX=1256H,双字变量TABLE的偏移地址是20A1H,线性地址32F7H处存放3280H,执行指令“JMP EBX” 后EIP=__________,执行指令“JMP TABLE[EBX]”后EIP=__________。

(3)“CMP EAX,3721H”指令之后是JZ指令,发生转移的条件是EAX=__________,此时ZF=__________。

(4)小写字母“e”是英文当中出现频率最高的字母。如果某个英文文档利用例题4-11的异或方法进行简单加密,统计发现密文中字节数据“8FH”最多,你判断该程序采用的字节密码可能是__________。

(5)循环结构程序一般有三个部分组成,它们是__________,循环体和__________部分。

(6)例题4-14程序中的RET指令,如果用POP EBP指令和JMP EBP指令替换,此时EBP内容是__________。

(7)过程定义开始是“TEST PROC”语句,则过程定义结束的语句是__________。宏定义开始是“DISP MACRO”语句,则宏定义结束的语句是__________。

(8)利用堆栈传递子程序参数的方法是固定的,例如寻址堆栈段数据的寄存器是__________。 (9)MASM汇编语言中,声明一个共用的变量应使用__________伪指令;而使用外部变量要使用__________伪指令声明。

(10)调用ReadConsole函数时,用户在键盘上按下数字8,然后回车,则键盘缓冲区的内容依次是__________。

〔解答〕

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

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

⑨ PUBLIC,EXTERN ⑩ 38H 0DH 0AH 〔习题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.9〕

指令CDQ将EAX符号扩展到EDX,即:EAX最高为0,则EDX=0;EAX最高为1,则EDX=FFFFFFFFH。请编程实现该指令功能。 〔解答1〕 test eax,8000h jz next1 mov edx,0ffffffffh jmp done next1: mov dx,0 done:

〔解答2〕

使用移位指令更好。 rol eax,1 rcr edx,1 sar edx,31 ror eax,1

〔习题4.11〕编写一个程序,先提示输入数字“Input Number:0~9”,然后在下一行显示输入的数字,结束;如果不是键入了0~9数字,就提示错误“Error!”,继续等待输入数字。 〔解答〕 ; 数据段 inmsg byte 'Input number(0~9): ',0 ermsg byte 0dh,0ah,'Error! Input again: ',0 ; 代码段 mov eax,offset inmsg ; 提示输入数字 call dispmsg again: call readc ; 等待按键 cmp al,'0' ; 数字 < 0? jb erdisp cmp al,'9' ; 数字 > 9? ja erdisp call dispcrlf call dispc jmp done

erdisp: mov eax,offset ermsg call dispmsg jmp again done:

〔习题4.12〕有一个首地址为ARRAY的20个双字的数组,说明下列程序段的功能。

sumlp:

mov ecx,20 mov eax,0 mov esi,eax

add eax,array[esi]

; 测试最高位

; 最高位为0(ZF=1),转移到标号NEXT1

; 最高位为1,顺序执行:设置EDX=FFFFFFFFH ; 无条件转移,跳过另一个分支

; 最高位为0转移到此执行:设置EDX=0

add esi,4 loop sumlp mov total,eax

〔解答〕

求这20个双字的和,保存在TOTAL变量,不关进心进位和溢出。

〔习题4.22〕编写一个子程序,它以二进制形式显示EAX中32位数据,并设计一个主程序验证。 〔解答〕 ; 代码段,主程序 mov eax,8F98FF00H call dispbd ; 代码段,子程序 dispbd proc push ecx push edx mov ecx,32 dbd: rol eax,1 push eax and al,01h add al,30h call dispc pop eax loop dbd pop edx pop ecx ret dispbd endp 〔习题4.26〕

编制3个子程序把一个32位二进制数用8位十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。

(1)采用EAX寄存器传递这个32位二进制数 (2)采用temp变量传递这个32位二进制数 (3)采用堆栈方法传递这个32位二进制数 〔解答〕

(1) ; 数据段 wvar word 307281AFH ; 代码段,主程序 mov eax,wvar call disp mov al,'H' call dispc ; 代码段,子程序 disp proc push ebx push ecx mov ecx,8 ; 8位 dhw1: rol eax,4 mov ebx,eax and al,0fh ; 转换为ASCII码

; 调用子程序

; 32位二进制数的输出

; 要输出的字符个数

; AL循环左移一位 ; 取AL最低位

; 转化成相应的ASCLL码值 ; 以二进制的形式显示

add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc mov eax,ebx loop dhw1 pop ecx pop ebx ret disp endp

(2) ; 数据段 wvar word 307281AFH temp word ? ; 代码段,主程序 mov eax,wvar mov temp,eax call disp mov al,'H' call dispc ; 代码段,子程序disp proc push ebx push ecx mov ecx,8 mov eax,temp dhw1: rol eax,4 mov ebx,eax and al,0fh add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc ; mov eax,ebx loop dhw1 pop ecx pop ebx ret disp endp

(3) ; 数据段 wvar word 307281AFH ; 代码段,主程序 push wvar call disp add esp,4 mov al,'H'

; 8位 ; 转换为ASCII码显示一个字符