计算机是如何工作的

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

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

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

=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. VS 代码整理插件推荐:CodeMaid

    一直在用,觉得很不错,其他插件基本上不用了,所以拿来记录并分享一下.CodeMaid 说明文档CodeMaid 下载安装不用说明了,使用看说明文档就好. CodeMaid和ReSharp类似,开源且免 ...

  2. SDN 第五次上机作业

    1.搭建如下拓扑并连接控制器 2.下发相关流表和组表实现负载均衡 s1: s2: s3: s4: 3.抓包分析验证负载均衡 s4-eth1: s4-eth2: s4-eth3

  3. 026.7 网络编程 URL对象

    通过一个程序理解Java的url对象. String str_url = "http://127.0.0.1:8080?name=xxx"; URL url = new URL(s ...

  4. Eclipse 中怎样自动格式化代码?

    首先 有一个 检查代码风格的工具叫checkstyle,具体怎么下载,请自行百度.. 当你在eclipse安装好 checkstyle后,对于使用google标准的人来说,选择一个项目,右键,点击ch ...

  5. python spawnv用法

    test.py import os import string def run(program, *args): file = program result = os.spawnv(os.P_WAIT ...

  6. php 两个二维数组重组新数组,数组下标不同

    Array ( [0] => Array ( [PosNum] => 27025008 [start_time] => 20180328164929 [type] => 0 ) ...

  7. Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装

    转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...

  8. windows安装wget

    windows安装wget1. 下载wget-1.11.4-1-setup.exehttps://jaist.dl.sourceforge.net/project/gnuwin32/wget/1.11 ...

  9. HDU 1203 I NEED A OFFER!(01背包+简单概率知识)

    I NEED A OFFER! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub ...

  10. EXCEL2007出错了无法使用文档中的ActiveX 控件

    EXCEL2007出错了无法使用文档中的ActiveX 控件虽说是很久之前的问题,但是正确的解决方法和原因如下!原因:系统update之后出现的问题解决方法:删除C:\Users\[username] ...