汇编语言第6章流程控制答案.doc

第6章 流程控制 习题1. 指令指针EIP是通用寄存器还是专用寄存器?有指令能够直接给它赋值吗?哪些指令的执行会改变它的值? 解答:EIP是专用寄存器,不能通过指令直接给它赋值。可以改变其值的指令有: (1)无条件分支,包括:跳转(jmp)、调用(call)、中断(int)。 (2)条件分支,与标志位CF、OF、PF、SF、ZF相关的条件跳转指令。 (3)循环指令,LOOP、LOOPE等。 3. 相对于BASIC语言中GOTO语句作用的IA-32处理器指令是哪条? 跳转指令 jmp 习题4. IA-32处理器通过改变EIP寄存器的数值就可以改变程序,如果程序需要无条件跳转到标号done位置执行,使用“MOVL done, %EIP”语句是否可以达到,为什么?如果不能实现该功能,应该使用哪条指令? 解答:不能。不能对EIP寄存器直接赋值。使用指令jmp done可以实现。 习题6 条件转移指令Jxx所利用的条件保存在何处?有多少个不同条件的转移指令? 保存在EFLAGES寄存器中 共16个(P107) 习题7 JA和JG指令发生跳转的条件都是“大于”,它们有什么区别? 在处理带符号值和无符号值时有所区别。计算无符号值时,使用JA,对于带符号值,使用JG。 习题8. 执行如下程序片断后,CMP指令分别使得5个状态标志CF、ZF、SF、OF和PF为0还是为1?它会使得哪些条件转移指令条件成立、发生转移? movl $0x20, %eax movl $0x80, %ebx cmpl %ebx,%eax 解答:CF=1 ZF=0 SF=1 OF=0 PF=1 可以使得发生转移的指令有:JC JS JP JNZ JNO 习题9. 有如下程序片断,请使用一条指令代替其中的两条指令: (1) again: ... jz next jmp again next: (2) again: ... jle next jmp again next: 解答: (1)jnz again (2)jg again 10. 假设EAX和ESI存放的是有符号整数,EDX和EDI存放的是无符号整数,请用比较指令和条件转移指令实现以下判断: (1)若EDX EDI,转到above执行; CMP %EDI,%EDX JA above (2)若EAX ESI,转到greater执行; CMP %ESI,%EAX JG greater (3)若ECX = 0,转到zero执行; CMP $0,%ECX JE zero (4)若EAX-ESI产生溢出,转到overflow执行; CMP %ESI,%EAX JO overflow (5)若ESI≤EAX,转到less_eq执行; CMP %EAX,%ESI JLE less_eq (6)若EDI≤EDX,转到below_eq执行。 CMP %EDX,%EDI JBE below_eq 11. Pentium Pro处理器为IA-32指令系统增加了一条实用的条件传送指令CMOVxx,其中的条件xx与条件转移指令Jxx的条件xx相同。请用一条CMOV指令代替如下程序片断中的条件转移指令和其后的传送指令(含标号): (1) decl %ecx jz contiune movl %eax,%ebx contiune: (2) addl $1,%ecx jnc contiune movl %eax,%ebx contiune: (3) cmpl %ebx,%eax jbe contiune movl %eax,%ebx contiune: 解答 (1)CMOVNZ %eax, %ebx (2)CMOVC %eax, %ebx (3)CMOVA %eax, %ebx 12. 现代处理器当中,简单的多条指令常比一条复杂的指令执行速度快。例如,GCC编译器就不使用LOOP指令,而是使用与其功能相同的两条指令,这两条指令是什么? dec %ecx jnz loop 习题13. 请问如下LOOP指令执行了多少次? movl $0, %ecx repeat: loop repeat 解答: loop执行时,先将ecx中的值减1,使之变为-1(0xFFFFFFFF),然后进行判断是否为0。这里32位整数的最大值为232,故loop执行了232次。 14. 请用两条指令实现JECXZ指令的功能。 cmp $0,%ecx je address

文档评论(0)

1亿VIP精品文档

相关文档