【-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格式的;

程序编码(机器级代码+汇编代码+C代码+反汇编)的更多相关文章

  1. CSAPP:第三章程序的机器级表示1

    CSAPP:程序的机器级表示1 关键点:数据格式.操作数指示符. 数据格式访问信息操作数指示符举例说明 数据格式   术语字(word)表示16位数据类型,32位数为双字(double words), ...

  2. Linux下程序的机器级表示学习心得

    Linux下程序的机器级表示学习心得 上周学习完Linux程序的机器级表示后,对于其中有些还是掌握的不太透彻.对于老师提出的关于本章一些细节的问题还是有不会,所以又重新温习了一下上周的学习内容,以下为 ...

  3. CS:APP Chapter 3 程序的机器级表示-读书笔记

    3.1 程序的机器级表示 发展历史 Intel,AMD,ARM 等企业各有又是,CPU 从 8 位发展到 16 位,再到 32 位,近几年发展到 64 位,当下的 CPU 体系被称为 x86-64 体 ...

  4. CSAPP:第三章程序的机器级表示3

    程序的机器级表示3 关键点:过程.调试.指针 过程1.运行时栈2.转移控制3.数据传递4.栈上的局部存储5.寄存器中的局部存储空间理解指针使用GDB调试器 过程 1.运行时栈   x86-64的栈向低 ...

  5. CSAPP:第三章程序的机器级表示2

    CSAPP:程序的机器级表示2 关键点:算术.逻辑操作 算术逻辑操作1.加载有效地址2.一元二元操作3.移位操作 算术逻辑操作   如图列出了x86-64的一些整数和逻辑操作,大多数操作分成了指令类( ...

  6. 六星经典CSAPP-笔记(3)程序的机器级表示

    1.前言 IA32机器码以及汇编代码都与原始的C代码有很大不同,因为一些状态对于C程序员来说是隐藏的.例如包含下一条要执行代码的内存位置的程序指针(program counter or PC)以及8个 ...

  7. 【CSAPP】三、程序的机器级表示

    本章基于两种相关的机器语言:Intel IA32和x86-64,前者注重32位,后者注重64位. 本章脉络:c\汇编\机器码之间的关系,数据的表示,控制结构如何实现.运行栈,局部变量的存储,数据结构. ...

  8. 深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍

    第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9943779.html 本章汇编代码中常出现的几个指令及其含义 1.push 操作数的个数:1 将操作数(一般 ...

  9. 深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍

    第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9905345.html 机器级代码 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节. ...

  10. 深入理解计算机系统 第三章 程序的机器级表示 part1

    如题所示,这一章讲解了程序在机器中是怎样表示的,主要讲汇编语言与机器语言. 学习什么,为什么学,以及学了之后有什么用 我们不用学习如何创建机器级的代码,但是我们要能够阅读和理解机器级的代码. 虽然现代 ...

随机推荐

  1. 关于 mobile sui a外链 老是出现加载失败的解决办法

    mobile sui 框架里面的a本身都绑了了一个ajax方法,ajax只能处理同域,跨域就会出现问题 ,所以mobile sui 中的a如果是外链的话就会出现加载失败的提示,这种明显的bug,让用户 ...

  2. ASP.NET MVC- UrlHelper的用法

    UrlHelper提供了四个非常常用的四个方法 1.Action方法通过提供Controller,Action和各种参数生成一个URL, 2.Content方法是将一个虚拟的,相对的路径转换到应用程序 ...

  3. installshield basic msi 更新时覆盖不了上一个版本文件解决方案1

    1.增加dll exe程序集的版本号 2.设置IS里文件的Set key file

  4. C# List 中 Find 方法

    实例化一个集合 List<User> userCollection = new List<User>(); userCollection.Add(new User(1, &qu ...

  5. Arrays, Hashtables and Dictionaries

    Original article Built-in arrays Javascript Arrays(Javascript only) ArrayLists Hashtables Generic Li ...

  6. [p2p]UDP用打洞技术穿透NAT的原理与实现

    首先先介绍一些基本概念:            NAT(Network Address             Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的, ...

  7. div图片垂直居中 如何使div中图片垂直居中

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期 2014-04-03) 『此方法在ie7下,如果.box的高度为800等比较大的数值时,并不能起到垂直居中的作用.』 点评:关于图片垂 ...

  8. TextView 实现复制文本功能

    Android api 11 以后可以直接设置 android:textIsSelectable="true" <TextView android:layout_width= ...

  9. unicode 编码在线转换--javascript

    // unicode 编码在线转换工具--javascript 本人在网上搜索,看到有使用javascript做unicode编码转换的,感觉很好玩,所以拿来使用的. 这个功能有目前测试了两种: 1) ...

  10. The source attachment does not contain the source for the file SignatureParser.class错误

    在myeclipse整合tomcat的完毕后,再启动tomcat的时候会出现这样的错误,呵呵,错误的大致意思是什么相关联错误,其实是myeclipse新加入的tomcat的模式出现错误了,myecli ...