• 程序编码(机器级代码+汇编代码+C代码+反汇编)


    【-1】相关声明

    本文总结于csapp; 了解详情,或有兴趣,建议看原版书籍;
    

    【0】程序编码

    GCC调用了一系列程序,将源代码转化成可执行代码的流程如下:

    • (1)C预处理器扩展源代码,插入所有用#include命令指定的文件,并扩展声明的宏;
    • (2)编译器产生两个源代码的汇编代码:*.s;
    • (3)汇编器将汇编代码转化为二进制目标代码 :*.o ; (目标代码是机器代码的一种形式,它包含所有指令的二进制表示,但没有填入地址的全局值)
    • (4)链接器将目标代码与实现库函数的代码合并,最终产生可执行代码文件;

    【1】机器级代码

    对于机器级编程来说,两种抽象很重要:

    • (1)机器级程序的格式和行为,定义为指令集体系结构;
    • (2)机器级程序使用的存储器地址是虚拟地址;

    (Attention:os负责管理虚拟地址空间, 将虚拟地址翻译成实际处理器存储器中的物理地址!)


    【2】要知道处理器的状态是可见的:

    • (1)程序计数器:pc,指示将要执行的下一条指令在存储器中的地址;
    • (2)整数寄存器文件:包含8个命名的位置;
    • (3)条件码寄存器:保存着算术或者逻辑指令的状态信息;
    • (4)一组浮点寄存器存放浮点数据;

    【3】代码示例(联系开头的程序编码首文)

    3.1)gcc编译器产生汇编代码

    gcc -O1 -S code.c  generates code.s
    gcc -O1 -S p107.c  generates p107.s
    

    这里写图片描述

    3.2)gcc编译并汇编该代码

    gcc -O1 -c p107.c 产生目标代码p107.o, 它是二进制格式,所以无法直接查看。
    

    这里写图片描述

    3.3)反汇编器-disassmbler, 根据目标代码产生类似于汇编代码的格式

    objdump -d p107.o >> p107-dis.s  
    

    这里写图片描述

    3.4)生成可执行文件 prog

    gcc -O1 -o prog p107.o p107-main.c
    

    这里写图片描述

    3.5)反汇编prog文件

    objdump -d prog >> prog-dis.s   
    

    这里写图片描述

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

    (Attention)

    • A0)这段代码(L121~L128)和 p107-dis.s 的代码几乎完全一样。
    • A1)其中一个主要的区别:是左边列出的地址不同——链接器将代码的地址移到一段不同的地址范围中。
    • A2)第二个不同之处:在于链接器确定了存储全局变量accum的地址。
    • A3)在p107-dis.s的12行,很明显accum=0, 而在prog的反汇编指令中(L126),accum的地址就设置为0x8049634了。

    【4】ATT与intel 汇编代码格式

    ATT是GCC、OBJDUMP和其它一些我们使用的工具的默认汇编格式;
    其它一些编程工具, 包括Microsoft工具,以及来自intel的文档,其汇编代码是intel格式的;

  • 相关阅读:
    JS优先队列排序。出队时,先找出优先级最高的元素,再按照先进先出出队。
    使用队列对数组排列,基数排序
    一个用JS数组实现的队列
    使用栈判断给定字符串是否是回文的算法
    使用js栈stack类的实现
    Bootstrap篇:弹出框和提示框效果以及代码展示
    一个漂亮的php验证码类
    jquery单选框radio绑定click事件实现和是否选中的方法
    phpQuery—基于jQuery的PHP实现
    PHP的函数-----生成随机数、日期时间函数
  • 原文地址:https://www.cnblogs.com/pacoson/p/4893175.html
Copyright © 2020-2023  润新知