第4章-程序结构习题答案
精品文档 第 4 章 程序结构 4.14.1 简答题简答题 (1)CPUID 指令返回识别字符串的首字符“G”在哪个寄存器中? EBX 的高 8 位 (2)数据的直接寻址和指令的直接寻址有什么区别? 数据的直接寻址给出数据所在的存储器地址, 指令的直接寻址给出指令所在的存储器地 址。 (3)是什么特点决定了目标地址的相对寻址方式应用最多? 指令代码中提供目标地址相对于当前指令指针寄存器EIP 的位移量, 使得同一个程序被 操作系统安排在不同的存储区时,指令间的位移并没有变化的特点。 (4)Jcc 指令能跳转到代码段之外吗? 不能,Jcc 指令采用段内相对寻址方式 (5)什么是奇偶校验? 数据通信时,数据的某一位用做传输数据的奇偶校验位, 数据中包括校验位在内的 “1” 的个数恒为奇数,就是奇校验;恒为偶数,就是偶校验 (6)助记符 JZ 和 JE 为什么表达同一条指令? 两个数相减,差值为 0(JZ)与两个数相等(JE)是一个含义 (7)为什么判断无符号数大小和有符号大小的条件转移指令不同? 判断两个无符号数的大小和判断两个有符号数大小关系要利用不同的标志组合。 判断有符号数的大小需要组合SF 和 OF 标志,并利用 ZF 标志确定相等与否。 判断无符号数的高低利用CF 标志,利用 ZF 标志确定相等。 (8)双分支结构中两个分支体之间的JMP 指令有什么作用? 用于跳过分支体 2,避免进入分支体 2 而出现错误。 (9) 如果循环体的代码量远超过128 个字节, 还能用 LOOP 指令实现计数控制循环吗? 不能,因为LOOP 指令的目标地址采用相对短转移,只能在-128~+127 字节之间循环 (10)什么是“先循环、后判断”循环结构? 指先执行循环体,然后判断是否继续循环的结构,这种结构通常至少执行一次循环体 4.24.2 判断题判断题 (1)指令指针或者号包括代码段寄存器值的改变将引起程序流程的改变。 对 (2)指令的相对寻址都是近转移。 对 (3)采用指令的寄存器间接寻址,目标地址来自存储单元。 错, (4)JMP 指令对应高级语言的 GOTO 语句,所以不能使用 错,需要使用 (5)因为条件转移指令Jcc 要利用标志作为条件, 所以也影响标志。 错 (6)JA 和 JG 指令的条件都是“大于” ,所以是同一个指令的两个助记符。 错,JA 针对无符号数,JG 针对有符号数 (7)JC 和 JB 的条件都是 CF=1,所以是同一条指令。 对。无符号小于(JB)必然借位(JC) (8)控制循环是否结束只能在一次循环结束之后进行 。1欢迎下载 精品文档 错 (9)介绍loop 指令时,常说它相当于dec ecx 和 jnz 两条指令。但是考虑对状态标志 的影响, 它们有差别。 Loop 指令不影响标志, 而 dec 指令却影响除 cf 之外的其他状态标志。 对 (10)若 ECX=0,则 LOOP 指令和 JECX 指令都发生转移。 对 4.34.3 填空题填空题 (1)JMP 指令根据目标地址的转移范围和寻址方式,可以分成4 种类型:段内转移、 () ,段内转移、 ()以及段间转移、 () ,段间转移、 () 。 相对寻址,间接寻址,直接寻址,间接寻址 (2)MASM 给短转移、近转移和远转移定义的类型名依次是___、___和___。 SHORT,NEAR,FAR (3)假设在平展存储模型下,EBX=1256H,双字变量 TABLE 的偏移地址是 20A1H,线 性地址 32F7H 处存放 3280H,执行指令“JMP EBX” 后 EIP=_______,执行指令“JMP TABLE[EBX]”后 EIP=_______。 1256H,3280H (4) “CMP EAX,3721H”指令之后是 JZ 指令,发生转移的条件是EAX=________,此时 ZF=_______。 3721H,1 (5)执行“SHR EBX,4”指令后,JNC 发生转移,说明 EBX 的 D3=_____。 0 (6) 在 EDX 等于 0 时转移, 可以使用指令 “CMP EDX,____” 、 也可以使用 “TEST EDX,_____” 构成条件,然后使用 JE 指令实现转移。 0,EDX (7)循环结构程序一般由三个部分组成,它们是() 、循环体和 ()部分。 循环初始,循环控制 (8)JECXZ 指令发生转移的条件是() ,loop 指令不发生转移的条件是() 。 Ecx=0, ecx 不等于 0 (9)loop 指令进行减 1 计数,实际应用中也常进行加 1 计数。针对例 4-14 程序,如 果删除其中的 loop 指令,则可以使用指令“cmp(),ecx”和“jb ( ) ”替代。 Ebx, jb again (10)小写字母“e”是英文当中出现频率最高的字母。如果某个英文文档利用例4-16 的异或方法进行简单加密, 统计发现密文中字节数据“8FH”最多, 则高程序采用的字节 密码可能是() 0EAh 习题习题 4.44.4 已知 var1、 var2、 var3 和 var4 是 32 位无符号整数, 用汇编语言程序片段实现如下C++ 语句: var4=(var1*6)/( var2-7)+var3 解答:解答: mov eax,var1 mov ebx,6 mul ebx ;var1*6 mov ebx,var2 。2欢迎下载 精品文档 sub ebx,7;var2-7 div ebx ;(var1*6)/( var2-7) add eax,var3;(var1*6)/( var2-7)+var3 mov var4,eax 习题习题 4.54.5 已知 var1、 var2、 var3 和 var4 是 32 位有符号整数, 用汇编语言程序片段实现如下C++ 语句: Var1=(var2*var3)/( var4+8)-47 解答:解答: Mov Imul Mov Add Idiv Sub Mov eax,var2 var3 ebx,var4 ebx,8 ebx eax,47 var1,eax 习题习题 4.64.6 参看例 4-1,假设N 小于 90000,这时求和结果只需要eax 保存,edx 为 0。修改例4-1 使其可以从键盘输入一个数值N(用 readuid子程序), 最后显示累加和 (用 dispuid子程序) 。 解答: .data Msg byte ‘ a number(0~90000):’,0 .code Start: Mov eax,offset msg Callreaduid Calldispcrlf Mov ebx,eax Add ebx,1 Imulebx Shredx,1 Rcreax,1 Calldispuid 习题习题 4.74.7 定义 COUNT (假设为 10) 个元素的 32 位数组, 输入元素编号 (0~COUNT-1) , 利用 DISPHD 子程序输出其地址、利用DISPSID 子程序输出其值。 解答: ;数据段 count= 10 arraydword 0,1,2,3,4,5,6,7,8,9 ;代码段 call readui