通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
秦鼎涛 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
实验一
通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
一、C语言源代码:
- int g(int x)
- {
- return x + 3;
- }
- int f(int x)
- {
- return g(x);
- }
- int main(void)
- {
- return f(8) + 1;
- }
二、实验楼截图:


三、分析汇编代码的工作过程中堆栈的变化:
跟C语言一样,汇编代码也是从main函数开始执行的,计算机利用eip从main开始获取指令并执行,每次自加一,顺序执行,具体如下注释:
g:
pushl %ebp //ebp压栈
movl %esp,%eax
addl $3,%eax //eax=8+3=11
popl %ebp //ebp弹栈
ret //popl eip,跳转f函数eip(15)即leave处
f:
pushl %ebp //ebp压栈
movl %esp,%ebp //ebp跟esp指向同一位置
subl $4,%esp //esp-4
movl 8(%ebp),%eax //变址寻址8,对应值赋值给eax
movl %eax,(%esp) //把eax赋值给esp对应位置
call g //push eip;movl g,eip
leave //movl %ebp,%esp;popl %edp
ret //popl eip,执行main函数里addl $1,%eax
main:
pushl %ebp //把ebp压栈,ESP的值加一个字节
movl %esp,%ebp //ebp指向esp同一位置
subl $4,%esp //esp减4
movl $8,(%esp) //esp所指向位置存储立即数8
call f //push eip;movl f eip 即跳转函数f的指令
addl $1,%eax //eax=11+1=12
leave //movl %ebp,%esp;popl %edp,又一次变成空栈
ret //popl eip
P.S. 1.函数返回值默认使用eax寄存器存储返回给上一级函数。
四、总结
这次实验利用一个简单的c语言小程序,转换成汇编语言,通过对汇编代码的分析了解了计算机如何工作。汇编语言是介于高级编程语言
和机器语言之间的一种语言,更易于分析计算机工作过程。
计算机利用一系列的寄存器,获取内存中的指令,通过依次执行,来完成指令流所对应的函数或者说功能。
通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的的更多相关文章
- 第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
姓名:吕松鸿 学号:20135229 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- 通过反汇编一个简单的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内核分析 学习笔记 一.计算机 ...
- UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信
1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...
- Linux内核分析第一周-通过分析汇编代码理解计算机是如何工作的
首先,我们先写一个简单的C语言程序,如下: int g(int x) { return x +3; } int f(int x) { return g(x); } int main(void) { r ...
- 《Linux内核分析》第一周 计算机是如何工作的?
刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK ONE(2. ...
- 《Linux内核分析》 第一节 计算机是如何工作的
第一节 计算机是如何工作的 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...
- Flink源码分析 - 剖析一个简单的Flink程序
本篇文章首发于头条号Flink程序是如何执行的?通过源码来剖析一个简单的Flink程序,欢迎关注头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech) ...
随机推荐
- SA387Gr91
SA387Gr91 在DTCMS中,我做了一个SA387Gr91的网站,挺好看的.
- 前后端交互之封装Ajax+SpringMVC源码分析
为什么需要封装呢?因为用的多,我想将其封装成函数,当我想用它时,只需将那个函数对应的js文件引入即可,而不要重复写很多相同代码,利于开发效率的提高. 无论是$.ajax或$.post.$.get等,在 ...
- android 解决小米手机上选择照片路径为null情况
昨天测试帅哥说他手机选择图库崩溃了,这是一个上传头像的功能,相信很多应用都有这个功能,于是我就把手机拿过来打log看了下返回的路径 为null,在网上搜索了下解决方案,现在把解决方案记录下: 这是在o ...
- 学习笔记---gson
1.gson变量定义注解 @SerializedName("char") private String charm;//mongo转化char 2.gson中json文件转化成类 ...
- day47
高级布局 一.文档流(normal flow) 1.概念 本质为normal flow(普通流.常规流)将窗体自上而下分成一行一行,块级元素从上至下.行内元素在每行中从左至右的顺序依次排放元素. v_ ...
- lwip Packet buffers (PBUF) API 操作 集合
struct pbuf * pbuf_alloc (pbuf_layer layer, u16_t length, pbuf_type type) struct pbuf * pbuf_all ...
- Fiddler无法抓取某些APP的HTTPS请求,无解!!!
遇到有些APP的HTTPS请求无法抓取!错误提示: !SecureClientPipeDirect failed: System.Security.Authentication.Authenticat ...
- Sqlite 快速批量插入数据 测试
public static int insertDbBatch() { string sql = ""; SQLiteConnection conn = new SQLiteCon ...
- 20155216 Exp9 Web安全基础实践
Exp9 Web安全基础实践 基础问题回答 1.SQL注入攻击原理,如何防御? 1.对用户的输入进行校验,可以通过正则表达式,双"-"进行转换等. 2.不要使用动态拼装sql,可以 ...
- 20155233 刘高乐 Exp9 Web安全基础
WebGoat 输入java -jar webgoat-container-7.1-exec.jar 在浏览器输入localhost:8080/WebGoat,进入WebGoat开始实验 Cross- ...