20135202闫佳歆--week1 计算机是如何工作的
计算机是如何工作的
这一周我学习了计算机工作的相关知识。
最基础的,就是冯诺依曼体系结构结构,它最核心的思想是存储程序计算机,要点是:数字计算机的数制采用二进制;计算机应该按照程序顺序执行。
除了思想之外,我还复习了曾经学过的汇编相关的知识,包括操作数的类型,寻址的几种方式,还有一些具体的操作指令。这些指令我是第三次接触了,在我之前做过的一篇学习总结中已经有过详细的论述,这里就不再赘述,列出地址给予参考。
=link
在过往的学习中我了解到,汇编语言是一种机器语言,通过对堆栈,对存储器,对寄存器,等等的操作,来实现一系列的指令。我们日常所使用的诸如c语言这种高级语言,落到具体操作的时候,在计算机的层面,还是依靠汇编语言来执行的,高级语言中简单的一行代码,汇编语言就可能需要很多很多行来逐一实现。这种实现是顺序进行的,通过一些转移指令进行跳转,跳转时又依赖堆栈来保持数据和栈指针。
这种机理,作业中的实验可以很直接的表现出来。
具体实验的步骤,在上学期的课程中已经实践过了,参见上述地址对应总结中最后的作业部分,有实验所用代码,执行语句,精简后的反汇编代码,以及简略的堆栈变化分析。由于当时堆栈分析并不是很详细,所以我重新推演一遍,以求更精准更细致的理解。
我使用的代码(test.c)如下:
#include<stdio.h>
int add(int x)
{
return x+9;
}
int sec(int x)
{
return add(x);
}
int main(void)
{
return sec(15)+9;
}
经过gcc -S -o test.s test.c -m32的指令反汇编后,得到的文件保存在test.s中,精简后得到如下内容:
1 add:
2 pushl %ebp
3 movl %esp, %ebp
4 movl 8(%ebp), %eax
5 addl $9, %eax
6 popl %ebp
7 ret
8
9 sec:
10 pushl %ebp
11 movl %esp, %ebp
12 subl $4, %esp
13 movl 8(%ebp), %eax
14 movl %eax, (%esp)
15 call add
16 leave
17 ret
18
19 main:
20 pushl %ebp
21 movl %esp, %ebp
22 subl $4, %esp
23 movl $15, (%esp)
24 call sec
25 addl $9, %eax
26 leave
27 ret
设空栈如下:
从main开始执行,以下为逐句解释:
最开始的时候ebp和esp都指向标号0的位置
pushl %ebp :ebp入栈,保存当前ebp0,esp-4指向标号1
movl %esp, %ebp :将ebp指向标号1
subl $4, %esp :esp-4,指向标号2
movl $15, (%esp) :esp指向的栈中标号2对应的地方存储15
call sec :将eip(25)入栈,esp-4指向标号3,跳转至sec执行
接下来执行sec中的代码:
pushl %ebp :将ebp(1)入栈,esp-4指向标号4
movl %esp, %ebp :ebp指向标号4
subl $4, %esp :esp-4,指向标号5
movl 8(%ebp), %eax :将ebp指向的地址加八对应地址中的数据放入eax,即标号2对应存储数据15,所以(eax)=15
movl %eax, (%esp) :把eax放入esp对应位置,即栈中标号5对应位置
call add :将eip(16)入栈,esp-4指向标号6,跳转至add执行
接下来执行add中的代码:
pushl %ebp :ebp(4)入栈,esp-4指向标号7
movl %esp, %ebp :ebp指向标号7
movl 8(%ebp), %eax :ebp+8位置中的数据赋给eax,即标号5位置,(eax)=15
addl $9, %eax :eax中数据+9,即15+9=24
popl %ebp :ebp(4)出栈,即ebp指向标号4,esp+4指向标号6
ret :eip(16)出栈,esp+4指向标号5,跳转至第16行继续执行
接下来又回到sec中继续执行:
leave :把ebp赋给esp,即esp指向标号4,ebp(1)出栈,esp+4指向标号3,ebp指向标号1
ret :eip(25)出栈,esp+4指向标号2,跳转至第25行继续执行
接下来回到main中继续执行:
addl $9, %eax :eax中的数据+9,即24+9=33
leave :把ebp赋给esp,即esp指向标号1,ebp(0)出栈,ebp指向标号0,esp+4指向标号0
ret :此时栈已经空了,恢复最开始的状态,运行结束,最后的结果保存在eax中,为33.
附图三张:
20135202闫佳歆--week1 计算机是如何工作的的更多相关文章
- 20135202闫佳歆--week2 操作系统是如何工作的--学习笔记
此为个人学习笔记存档 week 2 操作系统是怎么工作的 一.计算机是如何工作的?--三个法宝 (一)三个法宝 1.存储程序计算机 所有计算机的基础性的逻辑框架. 2.函数调用堆栈 在低级语言中并不很 ...
- 20135202闫佳歆--week 7 Linux内核如何装载和启动一个可执行程序--实验及总结
week 7 实验:Linux内核如何装载和启动一个可执行程序 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.git c ...
- 20135202闫佳歆--week 9 期中总结
期中总结 前半学期的主要学习内容是学习mooc课程<Linux内核分析>以及课本<Linux内核设计与实现>. 所涉及知识点总结如下: 1. Linux内核启动的过程--以Me ...
- 20135202闫佳歆--week2 一个简单的时间片轮转多道程序内核代码及分析
一个简单的时间片轮转多道程序内核代码及分析 所用代码为课程配套git库中下载得到的. 一.进程的启动 /*出自mymain.c*/ /* start process 0 by task[0] */ p ...
- 20135202闫佳歆--week3 跟踪分析Linux内核的启动过程--实验及总结
实验三:跟踪分析Linux内核的启动过程 一.调试步骤如下: 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd r ...
- 20135202闫佳歆--week6 分析Linux内核创建一个新进程的过程——实验及总结
week 6 实验:分析Linux内核创建一个新进程的过程 1.使用gdb跟踪创建新进程的过程 准备工作: rm menu -rf git clone https://github.com/mengn ...
- 20135202闫佳歆--week5 课本18章学习笔记
第十八章 调试 内核级开发的调试工作远比用户级开发艰难的多. 一.准备开始 准备工作需要的是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 在这一章里,调试的主要思想是让bug重现 ...
- 20135202闫佳歆--week3 构造一个简单的Linux系统MenuOs--学习笔记
此为个人学习笔记存档 week 3 构造一个简单的Linux系统MenuOs 复习: 计算机有三个法宝:存储程序计算机,函数调用堆栈,中断 操作系统有两把剑: 1.中断上下文的切换,保存现场和恢复现场 ...
- 20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结
week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.gi ...
随机推荐
- 使用Python+opencv2时的文件命名及路径问题
最近在做一个数字图像的小项目,在最后的界面与程序结合阶段总是出现单个程序可以运行,但是使用界面传递的参数就运行不了的情况.在网上查了很多相关错误,最终确定是文件命名问题. 错误如下: cv2.erro ...
- 【CSS】Sass理解
原文在 https://github.com/zhongxia245/blog , 欢迎 star! Sass理解 时间:2016-09-24 22:56:12 作者:zhongxia 这里就不讲解S ...
- Django商城项目笔记No.18商品部分-数据表创建
数据库表设计 在电商中对于商品,有两个重要的概念:SPU和SKU SPU = Standard Product Unit (标准产品单位) SPU是商品信息聚合的最小单位,是一组可服用.易检索的标准化 ...
- Swift 并行编程现状和展望 - async/await 和参与者模式
这篇文章不是针对当前版本 Swift 3 的,而是对预计于 2018 年发布的 Swift 5 的一些特性的猜想.如果两年后我还记得这篇文章,可能会回来更新一波.在此之前,请当作一篇对现代语言并行编程 ...
- elk平台定制化查询规则
一.查询某IP在某时间内TOP10的请求 步骤: 点击“Visualize”选项卡 创建“Data table” 点击“From a new search” 下拉选择“F5-access” 在“buc ...
- MetaMask/json-rpc-engine
https://github.com/MetaMask/json-rpc-engine RpcEngine——MetaMask/json-rpc-engine https://github.com/M ...
- scrapy模拟登陆的几种方法
方法一: 方法二: 方法三:
- pyspider爬取数据存入mysql--2.测试数据库能否连通
做一个简单的测试,看数据能否存入mysql 1 #!/usr/bin/env python 2 # -*- encoding: utf-8 -*- 3 # Created on 2017-10-26 ...
- Vue 下拉列表 组件模板
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 大数据入门第二十一天——scala入门(一)并发编程Actor
注:我们现在学的Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃 一. ...