第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
姓名:吕松鸿
学号:20135229
( *原创作品转载请注明出处*)
( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 )
一、存储程序计算机
1.1冯诺依曼体系结构:即具有存储程序的计算机体系结构
目前大多数拥有计算和存储功能的设备(智能手机、平板、计算机等)其核心构造均为冯诺依曼体系结构
- 从硬件来看
- CPU与内存通过主线连接,CPU上的IP(可能是16、32、64位)总指向内存的某一块区域;IP指向的CS(代码段)也在内存中;CPU总是执行IP指向的指令。
2. 从软件来看
- API(应用程序编程接口,与编程人员)与ABI(程序与CPU的借口界面) 是两个比较重要的软件接口
1.2
关于ABI:指令编码;指令中涉及的寄存器布局;大多数指令可以直接访问内存
1.3
(E代表32位系统)EIP在CPU执行完一条指令之后自加一(自动加一条指令,而不是一个字节或是32位),当然也可以被其它指令,如CALL,RET等修改
二、x86汇编基础
2.1 x86(32位)的寄存器中,低16位作为16位register
2.2 关于堆栈段寄存器
EBP(堆栈基址寄存器);ESP(堆栈顶指针寄存器)。上述两个寄存器较为频繁地使用于汇编程序中
2.3 关于代码段寄存器
CPU实际取指令的时候通过cs:eip来描述
2.4 64位CPU
其实与32位在核心机制上差别不大,64位的机器中,寄存器以RXX表示
2.5 常见汇编指令
- 后缀的b,w,l,q分别代表8,16,32,64位
- 以%标识的寄存器寻址不与内存“打交道”
- 直接寻址&立即数寻址
- movl $0x123,%eax —— %eax=0x123
- movl 0x123,%eax —— 立即数是以$开头的十六进制数值。直接访问指定的内存地址(0x123)中的数据然后赋给%eax
- 变址寻址
movl 4(%ebx),%edx//edx = *(inet_32 *)(ebx+4),即ebx的值加4之后作为一个地址,将其指向的数据赋给%edx
- 大多数指令都可以直接访问内存地址
- Linux使用的A&T汇编格式与Intel汇编略有不同
几条重要的汇编指令
2.6汇编小程序练习
三、汇编一个简单的C程序
3.1 将C代码编译成汇编代码
- 将代码在实验楼环境中(64位)保存之后,建议使用 -m32将其编译为32位的汇编代码
具体如下:
gcc -S -o main.s main.c -m32
- 关于leave指令
- leave指令与enter指令一起相当于两条宏指令
- (
- enter指令相当于在原来的堆栈上再建一个新的空堆栈【因为将栈底指针%ebp挪到和栈顶指针相同的位置了】
- leave指令与enter相反,相当于撤销函数调用堆栈【把栈顶指针提上来,则撤消了该栈】
- 函数调用堆栈是由逻辑上多个堆栈叠加起来的。
- 函数的返回值默认用%eax存储,然后返回给上一级函数。
3.2 练习2
函数应该如下:
int g(int x)
{
return x+8;
}
int main(void)
{
return g(8)-8;
}
实验部分
实验步骤
实验代码:
代码汇编结果
实验分析如图:
实验总结:
1.计算机的硬件设施部分,就如第一讲中讲到的那样,除了核心CPU之外,还有寄存器、高速缓存、主存乃至外存这样种类繁多的存储设备。存储设备(这也是冯 诺依曼体系结构的一个重要支点)根本目的就是为CPU服务,存储各种各样的、区分轻重缓急的数据;
2.一步一步对汇编语言进行分析,使我对堆栈的调用认识更加深刻,对这部分的知识更加了然于胸,对我今后的课程奠定了扎实的基础
第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的的更多相关文章
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
秦鼎涛 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验一 通过汇编一个简单的C程序,分析汇编代码 ...
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处 <Linux内核分析>MOOC课程http: ...
- 第一讲 一个简单的Qt程序分析
本文概要:通过一个简单的Qt程序来介绍Qt程序编写的基本框架与一些Qt程序中常见的概念 #include <QApplication> #include <QPushButton&g ...
- 20135239益西拉姆 Linux内核分析 汇编一个简单的c程序并分析其指令过程
益西拉姆+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第一周linux内核分析 学习笔记 一.计算机 ...
- Linux内核分析第一周-通过分析汇编代码理解计算机是如何工作的
首先,我们先写一个简单的C语言程序,如下: int g(int x) { return x +3; } int f(int x) { return g(x); } int main(void) { r ...
- UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信
1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...
- Django入门第一步:构建一个简单的Django项目
Django入门第一步:构建一个简单的Django项目 1.简介 Django是一个功能完备的Python Web框架,可用于构建复杂的Web应用程序.在本文中,将通过示例跳入并学习Django.您将 ...
- ASP.NET自定义控件组件开发 第一章 第一章:从一个简单的控件谈起
第一章:从一个简单的控件谈起 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第三 ...
- IDDD 实现领域驱动设计-一个简单业务用例的回顾和理解
上一篇:<IDDD 实现领域驱动设计-由贫血导致的失忆症> 这篇博文是对<实现领域驱动设计>第一章后半部分内容的理解. Domain Experts-领域专家 这节点内容是昨天 ...
随机推荐
- github团队使用记录
Last login: Sat Nov 4 09:20:15 on ttys000 bogon:~ neveszhang$ git clone git@github.com:031502243/Cla ...
- 9.Solr4.10.3数据导入(post.jar方式和curl方式)
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.使用post.jar方式 java -Durl=http://192.168.137.168:8080/s ...
- Python3 下找不到urllib2的问题
Python 3.* 用urllib.request来代替原来的urllib2,因此调用的时候改为: >>> import urllib.request >>> u ...
- Docker技术入门与实战 第二版-学习笔记-9-Docker Compose 项目-2-Compose 命令说明
Compose 命令说明 1)命令对象与格式 对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中 的服务或者容器.如果没有特别的说明,命令对象将是项目,这意味着项目中所有 ...
- tiff和geotiff格式分析
1. tiff 文件的基本格式 TIFF(Tag Image File Format) 图像文件说明: TIFF 文件是由许多的标签 (tag) 组成 , 在 Adobe 的有关 tiff6.0 的说 ...
- css实现气泡框效果
前提:气泡框或者提示框是网页很常见的,实现它的方式有很多,我们以前最常用的就是切图片 然后通过 "定位" 方式 定位到相应的位置,但是用这种方式维护很麻烦,比如设计师想改成另外一种 ...
- A - Zebras
Oleg writes down the history of the days he lived. For each day he decides if it was good or bad. Ol ...
- day06--元组、字典、集合与关系运算
今日内容: 1.元组 2.字典 3.集合与关系运算 元组: 用途:记录多个值,当多个值没有改的需求,此时用元组更适合. 定义方式:在()内用逗号分隔开多个任意类型的值. 变量名=tuple('') 切 ...
- Swift10大开源项目记录
Alamofire : Swift编写的HTTP网络库,用于异步网络通信. Surge: Surge基于Accelerate框架开发,用于执行矩阵数学.数字信号处理以及图像处理等方面. SwiftyJ ...
- 20155234 《网络对抗》Exp 8 Web基础
基础问答 什么是表单 可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单包括两个部分:一部分是HTML源代码用于描述表单(例如,域,标签和用户在页面上看见的按钮),另一部分是脚本 ...