程序编码——————程序的机器级表示

来源:互联网 发布:网络舆情监测 软件 编辑:程序博客网 时间:2024/05/18 15:08

      都说学好汇编对于写程序有很大的好处,对于我这个半路出家的程序员,不要说汇编语言,便是高级语言也都是一知半解。最近在看一本“深入理解计算机系统”。其上有一张介绍汇编的内容。虽然很难看懂,还是准备硬着头皮看下来。之所以来写博客,也是想把看书中的点滴收获和感受和大家分享,有问题提出来请大家一起帮忙解答。废话少说,讲讲我今天看的内容吧。

      今天开个头,了解个大概情况。以下大多为书中内容。

      有两个文件p1.c和p2.c,我们用Unix编译这段代码:

      unix> gcc -O2 -o p p1.c p2.c

      这个命令做了什么呢?一,C预处理器会扩展源代码,插入所有用#include命令指定的文件,并扩展所以的宏。二,编译器产生两个源文件的汇编代码,名字分别为p1.s和p2.s。三,汇编器会将汇编代码转化为二进制目标代码文件p1.o和p2.o。四,链接器将两个目标文件与实现标准Unix库函数的代码合并,并产生最终的可执行文件。

      我们比较关注的是第二阶段,汇编代码比较接近机器代码。能够理解汇编代码如何与原始C代码想对应,是理解计算机如何执行程序的关键。其实我看书的主要目的就在此哦!

      对于一段C程序code.c

      int accum = 0;

int sum(int x, int y)
{
    int t = x + y;
    accum += t;
    return t;
}

      输入 gcc -O2 -s code.c 会产生一个汇编文件code.s

 sum:
  pushl %ebp
  movl %esp,%ebp
  movl 12(%ebp),%eax
  addl 8(%ebp),%eax
  addl %eax,accum
  movl %ebp,%esp
  popl %ebp
  ret

上面每行都对应一条机器指令。

      输入 gcc -O2 -c code.c , GCC会编译并汇编改代码,产生目标代码code.o,是二进制的。

 

 

      要查看二进制代码的汇编内容,可以用“反汇编器”(disassembler)。输入

      objdump -d code.o

输出结果和源汇编码差不多。

 

 

      添加main.c

int main()
{
    return sum(1, 3);
}

输入命令 gcc -O2 -o prog code.o main.c

则生成可执行文件。反汇编prog文件:

objdump -d prog

产生的代码与code.c反汇编几乎一样。主要不同:地址;确定accum的地址。

      具体大家可以试试。还有,千万别骂我是在抄书,其实,把一些东西打出来比只看一遍效果要好。不过最终目的还是要自己理解,期待那一天早点到来!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击