程序编码(机器级代码+汇编代码+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格式的;
程序编码(机器级代码+汇编代码+C代码+反汇编)的更多相关文章
- CSAPP:第三章程序的机器级表示1
CSAPP:程序的机器级表示1 关键点:数据格式.操作数指示符. 数据格式访问信息操作数指示符举例说明 数据格式 术语字(word)表示16位数据类型,32位数为双字(double words), ...
- Linux下程序的机器级表示学习心得
Linux下程序的机器级表示学习心得 上周学习完Linux程序的机器级表示后,对于其中有些还是掌握的不太透彻.对于老师提出的关于本章一些细节的问题还是有不会,所以又重新温习了一下上周的学习内容,以下为 ...
- CS:APP Chapter 3 程序的机器级表示-读书笔记
3.1 程序的机器级表示 发展历史 Intel,AMD,ARM 等企业各有又是,CPU 从 8 位发展到 16 位,再到 32 位,近几年发展到 64 位,当下的 CPU 体系被称为 x86-64 体 ...
- CSAPP:第三章程序的机器级表示3
程序的机器级表示3 关键点:过程.调试.指针 过程1.运行时栈2.转移控制3.数据传递4.栈上的局部存储5.寄存器中的局部存储空间理解指针使用GDB调试器 过程 1.运行时栈 x86-64的栈向低 ...
- CSAPP:第三章程序的机器级表示2
CSAPP:程序的机器级表示2 关键点:算术.逻辑操作 算术逻辑操作1.加载有效地址2.一元二元操作3.移位操作 算术逻辑操作 如图列出了x86-64的一些整数和逻辑操作,大多数操作分成了指令类( ...
- 六星经典CSAPP-笔记(3)程序的机器级表示
1.前言 IA32机器码以及汇编代码都与原始的C代码有很大不同,因为一些状态对于C程序员来说是隐藏的.例如包含下一条要执行代码的内存位置的程序指针(program counter or PC)以及8个 ...
- 【CSAPP】三、程序的机器级表示
本章基于两种相关的机器语言:Intel IA32和x86-64,前者注重32位,后者注重64位. 本章脉络:c\汇编\机器码之间的关系,数据的表示,控制结构如何实现.运行栈,局部变量的存储,数据结构. ...
- 深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍
第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9943779.html 本章汇编代码中常出现的几个指令及其含义 1.push 操作数的个数:1 将操作数(一般 ...
- 深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍
第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9905345.html 机器级代码 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节. ...
- 深入理解计算机系统 第三章 程序的机器级表示 part1
如题所示,这一章讲解了程序在机器中是怎样表示的,主要讲汇编语言与机器语言. 学习什么,为什么学,以及学了之后有什么用 我们不用学习如何创建机器级的代码,但是我们要能够阅读和理解机器级的代码. 虽然现代 ...
随机推荐
- Generic【Pluralsight】
prepare Employee Structure namespace CollectIt { public class Employee { public string Name { get; s ...
- JdkDynamicAopProxy源码
JdkDynamicAopProxy是通过接口实现动态代理类,主要方法是getProxy(ClassLoader classLoader), 代理类生成之后再调用目标方法时就会调用invoke方法. ...
- 重学HTML
http://www.imooc.com/learn/9 1.em/strong 如果想在一段话中特别强调某几个文字,这时候就可以用到<em>或<strong>标签. 但两者在 ...
- webstorm 主题设置 皮肤设置
推荐个编辑器主题下载的一个网站. Color Themes 网址:http://color-themes.com [点这里直接跳转] 但是,只支持几个编辑器. 各种颜色搭配的主题,随你选择!我个 ...
- 组合方法(ensemble method) 与adaboost提升方法
组合方法: 我们分类中用到非常多经典分类算法如:SVM.logistic 等,我们非常自然的想到一个方法.我们是否可以整合多个算法优势到解决某一个特定分类问题中去,答案是肯定的! 通过聚合多个分类器的 ...
- javascript实现继承的方式
this this表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window: 如果在函数中使用this,则this指代什么是根据运行时此函数在什么对象上被调用. 我们还可以使用a ...
- Java学习笔记(4)——JavaSE
一.HashMap HashMap以键值对的形式存储对象,关键字Key是唯一的,不重复的 1,key可以是任何对象,Value可以任何对象 2,重复的key算一个,重复添加是替换操作(会覆盖原来的元素 ...
- k-means聚类JAVA实例
<mahout in action>第六章. datafile/cluster/simple_k-means.txt数据集例如以下: 1 1 2 1 1 2 2 2 3 3 8 8 8 9 ...
- UESTC 890 Card Trick(DP 纸牌魔术)
题意 给你一些牌 所有正面朝下放桌子上 你选一个起点 翻开那张牌 牌上的数字是几就向前走几步 J,Q,K 都是向前走10步 A向前走11步 知道向前走相应的步数后超过了终点 ...
- window.showModalDialog 与window.open传递参数的不同?
简单的说,就是一个在弹出窗口之后可以做其它的事,即window.open 另一个在弹出窗口之后不能做其它的事,只能是关闭了当前的窗口之后才能做其它的事,即window.showModalDialog ...