标签:log nbsp 地址 字节 输入 www 语言 编译 学习总结
1.转移控制——
call指令:后接被调用过程的起始的指令地址。效果是将返回地址入栈,并跳转到被调用过程的起始处。
ret指令:从栈中弹出地址,并跳转到这个位置。
练习题:
找出下列代码的错误之处?
movb $0xf,(%bl) ---目的操作数只能是一个寄存器或者一个存储器地址。(%bl)表示一个值
movw (%eax),4(%esp)---目的操作数与源操作数不能都是存储器
movb %si, 8(%ebp)---指令后缀与寄存器地址不匹配
int arith(int x,int y,int z) { int t1 = x^y;
int t2 = 3*t1;
int t3 = ~t2;
int t4 = t3-z;
return t4;
下面的代码片段常常出现在库函数的编译版本中:
call next
next:
popl %eax
A.寄存器%eax被设置成了什么值?
%eax被设置成popl的地址。
B.解释为什么这个调用没有与之匹配的ret指令
这不是一个真正的过程调用,因为根本是按照与指令相同的顺序进行的,而返回值是从栈中弹出的。
C.这段代码完成了什么功能?
这是IA32中将程序计数器中的值放到整数计数器中的唯一办法。
icode
:控制逻辑块计算指令ifun
:功能码instr_valid
:发现不合法的指令;need_regids
:包含寄存器指示符字节吗;need_valC
:包括常数字吗请说明为什么C语言代码中只有一个if语句,而汇编代码包含两个条件分支?
答:第一个条件分支是&&表达式实现的一部分。如果对p为非空的测试失败,代码会跳过对a>0的测试。
标签:log nbsp 地址 字节 输入 www 语言 编译 学习总结
原文地址:http://www.cnblogs.com/zym0728/p/6005092.html