计算机是如何工作的

这一周我学习了计算机工作的相关知识。

最基础的,就是冯诺依曼体系结构结构,它最核心的思想是存储程序计算机,要点是:数字计算机的数制采用二进制;计算机应该按照程序顺序执行。

除了思想之外,我还复习了曾经学过的汇编相关的知识,包括操作数的类型,寻址的几种方式,还有一些具体的操作指令。这些指令我是第三次接触了,在我之前做过的一篇学习总结中已经有过详细的论述,这里就不再赘述,列出地址给予参考。

=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 计算机是如何工作的的更多相关文章

  1. 20135202闫佳歆--week2 操作系统是如何工作的--学习笔记

    此为个人学习笔记存档 week 2 操作系统是怎么工作的 一.计算机是如何工作的?--三个法宝 (一)三个法宝 1.存储程序计算机 所有计算机的基础性的逻辑框架. 2.函数调用堆栈 在低级语言中并不很 ...

  2. 20135202闫佳歆--week 7 Linux内核如何装载和启动一个可执行程序--实验及总结

    week 7 实验:Linux内核如何装载和启动一个可执行程序 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.git c ...

  3. 20135202闫佳歆--week 9 期中总结

    期中总结 前半学期的主要学习内容是学习mooc课程<Linux内核分析>以及课本<Linux内核设计与实现>. 所涉及知识点总结如下: 1. Linux内核启动的过程--以Me ...

  4. 20135202闫佳歆--week2 一个简单的时间片轮转多道程序内核代码及分析

    一个简单的时间片轮转多道程序内核代码及分析 所用代码为课程配套git库中下载得到的. 一.进程的启动 /*出自mymain.c*/ /* start process 0 by task[0] */ p ...

  5. 20135202闫佳歆--week3 跟踪分析Linux内核的启动过程--实验及总结

    实验三:跟踪分析Linux内核的启动过程 一.调试步骤如下: 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd r ...

  6. 20135202闫佳歆--week6 分析Linux内核创建一个新进程的过程——实验及总结

    week 6 实验:分析Linux内核创建一个新进程的过程 1.使用gdb跟踪创建新进程的过程 准备工作: rm menu -rf git clone https://github.com/mengn ...

  7. 20135202闫佳歆--week5 课本18章学习笔记

    第十八章 调试 内核级开发的调试工作远比用户级开发艰难的多. 一.准备开始 准备工作需要的是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 在这一章里,调试的主要思想是让bug重现 ...

  8. 20135202闫佳歆--week3 构造一个简单的Linux系统MenuOs--学习笔记

    此为个人学习笔记存档 week 3 构造一个简单的Linux系统MenuOs 复习: 计算机有三个法宝:存储程序计算机,函数调用堆栈,中断 操作系统有两把剑: 1.中断上下文的切换,保存现场和恢复现场 ...

  9. 20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结

    week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.gi ...

随机推荐

  1. PTA-B 1039 到底买不买 解题思路记录

    #include <cstdio> #include <string> #include <iostream> using namespace std; int m ...

  2. 极限编程核心价值:反馈(Feedback)

    原文:https://deviq.com/feedback 极限编程核心价值:简单(Simplicity) 极限编程核心价值:沟通(Communication) 极限编程核心价值:反馈(Feedbac ...

  3. docker tomcat 已主机名为日志输出路径

    目的:所有的日志输出到共享存储目录中 方法:将 tomcat 的日志放置到 /data/logs/主机名/  下, 1. 修改tomcat/conf下的logging.properties [root ...

  4. 如何删除VS2015中的OpenCV的配置

    首先,在C盘--用户--AppData--Local--Microsoft--MSBuild--v4.0  路径下,找到  Microsoft.Cpp.Win32.user  文件,用记事本打开,如下 ...

  5. 包学会之浅入浅出 Vue.js:开学篇

    2016年,乃至接下来整个2017年,如果你要问前端技术框架什么最火,那无疑就是前端三巨头:React.Angular.Vue.没错,什么jQuery,seaJs,gulp等都逐渐脱离了热点.面试的时 ...

  6. Dreammail V4.6.9.2 XSS漏洞利用

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 针对版本: DreamMail 4.6.9.2测试环境:windows xp sp3 python版本:2.6 测试 ...

  7. Apple 相关官方地址

    https://developer.apple.com/download/more/ 证书制作地址: https://developer.apple.com/account/ios/profile/ ...

  8. 基于Python自动发送QQ群消息

    1.准备工作 此次测试基于python3,需要安装qqbot.bs4.requests库. qqbot项目地址:https://github.com/pandolia/qqbot.git pip qq ...

  9. vi学习

    刚开始学习vi,所以,一步一步开始 先贴出一个相关的学习链接https://www.cnblogs.com/ranjiewen/p/5901181.html 这个学习链接里面的东西还是比较详细的,但是 ...

  10. iscsi target tgt架构

    tgt是用户态实现的iscsi target,而iet(iscsi enterprise target)是在内核态实现的target,tgt相比于iet来说,因为其用户态实现,方便调试,新加入一些功能 ...