2012年8月3日
摘要: 前两天在实验室翻书,看到《深入理解计算机系统》开头一章提到了一个问题,switch语句和if else 的效率一样么?Why?顿时萌生了很大的兴趣,准备一搞。不过google一下,发现别人的博客里面讲的也差不多了,我就学习下吧-_-简而言之,switch语句在case 里面的取值比较集中的情况下,如 case 1, case 3, case 4, case 5 ... 会构造一个地址表,地址表里面记录了依次应该跳转的标号,jmp的时候,就将switch()的变量减去最小值,获取比地址表里面的偏移量,然后将对应偏移量的地址作为jmp的目的地值。O(e)的复杂度啊。如果分部比较稀疏的话,1) ca 阅读全文
posted @ 2012-08-03 13:51 Jianfei Hu 阅读(269) 评论(0) 推荐(0) 编辑
  2012年7月15日
摘要: 代码生成,函数的返回值是个问题,如果返回值是简单类型,如int, char等,一个字节可以容纳,那编译器的做法是将值直接存在eax寄存器中.代码为证c代码:#include <stdio.h>int add(int a, int b){ return a + b;}int main(){ int a = add(2,3); return 0;}gcc -S add.cadd.s汇编代码:.globl add .type add, @functionadd: pushl %ebp movl %esp, %ebp movl 12(%ebp), %ea... 阅读全文
posted @ 2012-07-15 23:31 Jianfei Hu 阅读(3855) 评论(8) 推荐(1) 编辑
  2012年5月19日
摘要: 这是网络安全老师布置的实验,觉得是大学以来做过的最有意思的一个实验。Task Description:C语言编写程序,包含一个函数,改变函数的返回地址,使函数返回后跳转到某个指定的指令位置,而不是函数调用后紧跟的位置。先上代码:#include <stdio.h>void foo(){ int a, *p; p = (int*)((int)&a + 8); *p += 12;}int main(){ foo(); printf("First printf call\n"); printf("Second printf call\n") 阅读全文
posted @ 2012-05-19 23:17 Jianfei Hu 阅读(3061) 评论(4) 推荐(2) 编辑