答:不可以,堆栈段的范围由堆栈执政寄存器ESP的初值确定,这个位置就是堆栈的底部(不再变化),因此不能随意改变ESP的值。修改可能会导致栈里内容丢失,引起异常。 8. 大小写字母转换的规律是什么?给出转换的公式。 答:大小写字母转换利用它们的ASCII码相差20H。 SUB BL 20H:实现小写字母转换为大写; ADD BL 20H:实现大写字母转换为小写。 9. ESP是通用寄存器,是否可以随意的修改ESP的值? 答:不可以,堆栈段的范围由堆栈执政寄存器ESP的初值确定,这个位置就是堆栈的底部(不再变化),因此不能随意改变ESP的值。修改可能会导致栈里内容丢失,引起异常。 15
第五章 汇编语言程序设计 5.1.选择 1. 循环指令LOOP终止循环的条件是( )。 A.ECX=0 B. ECX=0,且ZF=0 C ECX≠0,且ZF=0 D. ECX≠0,或ZF=1 2. 循环指令LOOPNZ终止循环的条件是( )。 A.ECX=0,或ZF=1 B. ECX=0,且ZF=0 C.ECX≠0,且ZF=0 D. ECX≠0,或ZF=1 3. LOOP指令执行时,隐含计数器是( )。 A. ESP B.EBX C. ECX D.EDI 4. 当A>B时转移的条件转移指令为(A、B为无符号数)( )。 A. JA B. JAE C. JG D. JGE 5. 当A>=B时转移的条件转移指令为(A、B为 有符号数)( )。 A. JA B. JAE C. JG D. JGE 6. 条件转移指令JC Label的测试条件是( )。 A. ZF = 1 B. SF = 1 C. OF = 1 D. CF = 1 7. 若主程序通过堆栈向子程序传递了3个参数,子程序返回主程序时,在子程序中清除堆栈中3个参数正确的RET指令是( )。 A. RET 3*1 B. RET 3*2 C. RET 3*3 D. RET 3*4 8. 主程序通过堆栈向子程序传递了3个参数,子程序调用结束后,在主程序中清除堆栈中3个参数正确的指令是( )。 A. ADD ESP, 3*2 B. ADD ESP, 3*4 C. ADD EBP, 3*2 D. ADD EBP, 3*4 9. 条件转移指令JZ Label的测试条件是( )。 A. ZF = 1 B. SF = 1 C. OF = 1 D. CF = 1 10. 利用堆栈传递子程序参数的方法是固定的,若主程序通过堆栈向子程序传递了3个参数,则在子程序中, 主程序中最后一个被压入栈中的参数可以用( )的形式来访问。 A. [EBP-4] B. [EBP-8] C. [EBP+4] D. [EBP+8] 11. 通过堆栈传递参数,在子程序中使用EBP间址取得参数的原因是( )。 A. EBP没有被占用 B. EBP间址速度较快 C. EBP间址默认的段是堆栈段 D. EBP是基址指针 12. 通过寄存器传递参数比通过堆栈传递参数的优点是( )。 A. 能传递更多得参数 B. 存取效率高 C. 能确保正确调用 D. 没有副作用 13. 利用堆栈传递子程序参数的方法是固定的,在子程序中, 修改参数( )可以改变子程序的返回地址。 A. [EBP-4] B. [EBP-8] C. [EBP+4] D. [EBP+8] 14. 在用LOOP Label 指令构成的循环中,若ECX的初值为-10,则循环体将被执行( )次。 A. 10 B. 0 C. 100 D. >100 15. 在用LOOP Label 指令构成的循环中,若ECX的初值为10,在LOOP Label 指令前有一条“SUB ECX,2” 指令,则循环体将被执行( )次。 16
A. 10 B. 5 C. 4 D. >10000 5.2.名词解释 5.3.判断 1. 指令指针或者还包括代码段寄存器值的改变将引起程序流程的改变。T 2. JMP指令对应高级语言的GOTO语句,所以不能使用。F 3. 因为条件转移指令Jcc要利用标志作为条件,所以也影响标志。F 4. JA和JG指令的条件都是“大于”,所以是同一个指令的两个助记符。F 5. 控制循环是否结束只能在一次循环结束之后进行。F 6. 介绍LOOP指令时,常说它相当于DEC ECX和JNZ两条指令。但考虑对状态标志的影响, 它们有差别。LOOP指令不影响标志,而DEC指令却会影响除CF之外的其他状态标志。T 7. CALL指令用在调用程序中,如果被调用程序中也有CALL指令,说明出现了嵌套。T 8. 子程序需要保护寄存器,包括保护传递入口参数和出口参数的通用寄存器。F 9. 利用寄存器在主子程序间传递参数,其实质就是利用全局变量来传递参数。T 10. 子程序采用堆栈传递参数时,只能在主程序中修改ESP方可保持堆栈的平衡。F 11. 汇编语言中不允许递归调用子程序。F 12. 与高级语言中的自定义函数不同,汇编语言中的子程序不能将计算的结果返给主程序F 13. 汇编语言中,子程序嵌套调用就是递归调用。F 14. 在LOOP指令构成的循环结构中,允许修改ECX的值。T 15. 指令CALL或RET的执行,不改变程序执行的流程。F 16. 在软件中只使用一次的功能编写成子程序完全没有必要。F 17. 在执行CALL指令时,硬件自动将断点地址压入堆栈中。T 18. 在高级语言中,若多重循环出现\交叉”的错误,编译系统通常会给出提示来。若汇编 语言程序中也出现\交叉”错误时,汇编程序也会给出提示来。F 5.4.填空 1. JMP指令根据目标地址的寻址方式,可以分成三种类型:相对寻址、直接寻址 和间接寻址。 2. 假设在平展存储模型下,EBX=1256H,双字变量TABLE的偏移地址是20A1H,线性地址32F7H处存放3280H,执行指令“JMP EBX” 后EIP= 1256H _,执行指令“JMP TABLE*EBX+”后EIP= 3280H。 3. “CMP EAX,3721H”指令之后是JZ指令,发生转移的条件是EAX=_3721H_,此时ZF=_1__。 4. JMP指令根据目标地址的寻址方式,可以分成三种类型:相对寻址、_间接寻址 和直接寻址,通常 相对寻址 方式使用的最多。 5. 循环结构程序一般有三个部分组成,它们是_循环初始_, 循环体 和 循环控制__部分。 6. 条件转移指令 JE Label的测试标志位是__ZF__,条件转移指令 JNO Label的测试标志位是_OF__。 7. 过程定义开始是“TEST PROC”语句,则过程定义结束的语句是__TEST ENDP__。宏定义开始是“DISP MACRO”语句,则宏定义结束的语句是_ENDM_。 8. 利用堆栈传递子程序参数的方法是固定的,在子程序中通常是利用寄存器__EBP__来访问栈中的参数,采用的寻址方式是 间接寻址。 17
9. 调用程序和子程序之间的信息传送称为__参数__,而当传递的信息很大时通常通过 堆栈 来进行传递。 10. 在LOOP Label 指令构成的循环中,若ECX的初值为0,则循环体将被执行__232_次;若ECX的初值为—100,则循环体将被执行(232-100)__次。 11. 只要堆栈空间允许,子程序嵌套调用的层次无限制_,子程序也可调用本身,这称为递归调用_。 12. 通常在子程序的开始部分要保护_子程序中用到的__寄存器,但用做出口参数的通用寄存器则_ _不能保护和恢复 _。 13. 通常在子程序中的参数分为两种类型,分别称为__值参__和 形参 。 14. 通常在子程序中至少要有一条_返回__指令用于返回主程序,而汇编程序在汇编时并不检测__返回_指令是否存在。 15. 在主程序中,采用“JMP subName” 指令可以__转到_ 子程序subName, 但子程序结束后 返回地址不确定 。 5.5.简答题 1. 是什么特点决定了目标地址的相对寻址方式应用最多? 答:当同一个程序被操作系统安排到不同的存储区域执行时,指令间的位移没有改变,目标地址采用相对寻址可方便操作系统的灵活调度。 2. 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段,其中sign与sinteger均为双字变量。 if ( sinteger = 0) sign = 0; else if ( siteger > 0) sign = 1; else sign = -1; 答: .data ;数据段 定义两个双字变量(此处可以省略) sign dword ? sintegter dword ? .code ;代码段 cmp sinteger , 0 jne outjudge ;若不大于则跳转 mov sign , 0 ; sinteger = = 0 outjudge: cmp sinteger , 0 jl injudge ;若小于则跳转(将sinteger看作有符号数) ;若看作无符号数用jb来判断 mov sign , 1 ; sinteger > 0 injudge: mov sign , -1 ; sinteger < 0 done: ; 结束 3. 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段,其中ch1与caps均为字节变量。 18