
CSAPP
Nestler
这个作者很懒,什么都没留下…
展开
-
关于结构体指针的细节
先来看段程序:gcc -S test.c -O1:原创 2014-07-09 10:37:39 · 869 阅读 · 0 评论 -
函数过程调用
每个过程(函数)都有一块内存区域用来保存参数、返回地址、局部变量、寄存器值等信息,这块内存叫栈帧。栈帧由两个指针来界定:帧指针(%esp)和栈指针(%ebp)。帧指针固定指向栈底,栈指针则始终指向栈顶。当P调用Q时,传给Q的参数和P的返回地址都保存在过程P的栈帧中(P149),过程Q从过程P的栈帧中取参数和返回地址。这就是为什么带参数的函数的汇编代码开头会有类似语句:movl 8(原创 2014-07-09 10:27:26 · 929 阅读 · 0 评论 -
条件码及其访问
条件码寄存器中保存着单个位的条件码,由CPU维护,如:CF:进位标志ZF:零标志SF:符号标志OF:溢出标志有几类指令能够修改条件码:算术指令:既改变操作数,也有肯能改变条件码。CMP指令:右操作数减左操作数,只可能改变条件码。TEST指令:两操作数相与,只可能改变条件码。条件码寄存器不能直接读取,有三种方法:set指令:根据条件原创 2014-04-15 21:29:27 · 4823 阅读 · 0 评论 -
数据传送指令
C代码:汇编代码(部分):原创 2014-07-09 10:35:48 · 1061 阅读 · 0 评论 -
条件码及其访问
条件码寄存器中保存着单个位的条件码,由CPU维护,如:CF:进位标志ZF:零标志SF:符号标志OF:溢出标志有几类指令能够修改条件码:算术指令:既改变操作数,也有肯能改变条件码。CMP指令:右操作数减左操作数,只可能改变条件码。TEST指令:两操作数相与,只可能改变条件码。条件码寄存器不能直接读取,有三种方法:set指令:根据条件原创 2014-07-09 10:32:33 · 2856 阅读 · 0 评论 -
条件传送指令
先上一段C代码:gcc不做优化的编译:gcc -S test.c:可以看到汇编代码出现了jle这样的跳转指令。对于使用了流水线的CPU,这样的跳转是存在隐患的(P140),分支预测失败就会刷新掉所有流水线中取到而未执行的指令,影响运行性能。现在添加优化选项:gcc -S O1 test.c可以看到经过优原创 2014-07-09 10:34:08 · 4447 阅读 · 0 评论 -
可重定位目标文件
目标文件分三种格式可重定位目标文件:二进制代码和数据,由各个数据节(section)构成,从地址0开始。可执行目标文件:可运行的二进制代码和数据。共享目标文件:一种特殊类型的可重定位目标文件,动态加载链接。Linux上,目标文件的格式称为可执行和可链接格式(ELF)。gcc -c可以生成可重定位目标文件,然后用readelf -a可以查看文件内容。ELF原创 2014-07-09 10:43:02 · 11058 阅读 · 3 评论 -
程序链接后的变化
用一个实验来说明1.gcc -O1 -S test.c // 编译出汇编文件test.s可以看到全局变量accum被引用,这是因为编译器还不能确定它所处的内存地址。2.gcc -O1 -c test.c // 编译、汇编出test.o然后查看目标文件的反汇编代码:原创 2014-07-09 10:31:47 · 824 阅读 · 0 评论