存储程序计算机工作模型

存储程序计算机——冯诺依曼体系结构

  • IP:寄存器,总是指向内存的代码段。IP(16位) 32位(EIP) 64位(RIP)。

  • 内存:保存数据和指令。

  • CPU:CPU从IP指向的内存地址取指令执行,执行之后IP自加一,然后继续执行

    for(;;){
    next instruction
    }
  • API:应用程序编程接口。程序员与计算机的接口界面。
  • ABI:程序与CPU接口界面(二进制编码)。

X86寄存器

通用寄存器

段寄存器

CS:代码段寄存器,存储指令。CPU取指令时根据CS+eip来确定指令的地址。

DS:数据段寄存器,存储数据段的段值。

SS:堆栈段寄存器,存储堆栈段的段值。

FS、GS、ES:附加段寄存器,存储附加数据段的内容。

常用汇编指令

movl

pushl %eax:将eax寄存器放进堆栈的栈底。

subl $4,%esp movl %eax,(%esp)

popl %eax:将栈顶的数值放入eax里面。

movl (%esp),%eax addl $4,%esp

call 0x12345:函数调用,调用0x12345这个地址。

pushl %eip(*) movl $0x12345,%eip(*)

ret:将函数调用时候保存的eip出栈,执行函数调用之后的下一条指令。

popl %eip(*)

enter:将栈置为空

pushl %ebp movl %esp,%ebp

leave:撤销函数堆栈,释放内存空间

movl %ebp,%esp popl %ebp

常用寻址方式

  • 寄存器寻址:%+寄存器名称,与内存无关。

    movl %eax,%edx      edx=eax;
  • 立即寻址:$+16进制的数字,将数值直接放进寄存器当中,与内存无关。

    movl $0X123,%edx    edx=123;
  • 直接寻址:一个16进制数字表示一个地址。

    movl 0x123,%edx     edx=*(int32_t*)0x123;
  • 间接寻址:寄存器的值表示一个内存地址,将这个内存地址中的值放进寄存器中。

    movl (%ebx),%edx    edx=*(int32_t*)ebx;
  • 变址寻址:括号外面的数字表示寄存器地址加一个立即数。

    movl 4(%ebx),%edx   edx=*(int32_t*)(ebx+4);

注意:AT&T汇编格式与Intel汇编格式略有不同,linux内核使用的是AT&T汇编格式。

汇编一个简单的C程序分析其汇编指令执行过程

由于理论知识在上学期的博客中详细写过,所以这里直接用课后作业来说明

C语言代码

Linux内核第一节的更多相关文章

  1. 嵌入式C语言自我修养 04:Linux 内核第一宏:container_of

    4.1 typeof 关键字 ANSI C 定义了 sizeof 关键字,用来获取一个变量或数据类型在内存中所占的存储字节数.GNU C 扩展了一个关键字 typeof,用来获取一个变量或表达式的类型 ...

  2. linux内核第一宏 container_of

    内核第一宏 list_entry()有着内核第一宏的美称,它被设计用来通过结构体成员的指针来返回结构体的指针.现在就让我们通过一步步的分析,来揭开它的神秘面纱,感受内核第一宏设计的精妙之处. 整理分析 ...

  3. linux内核第一二章总结

    1 Linux内核简介 1 Unix的历史 1.Unix演化版实现了任务管理.换页机制.TCP/IP等新的特性. 2.Unix的特点: Unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目 ...

  4. Linux内核第二节

    作者:武西垚 深入理解函数调用堆栈 堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间 堆栈的作用 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 esp,堆栈指针,指 ...

  5. 『Linux』第一节: 部署虚拟环境

    一. 准备工具 1. VMware Workstation Pro下载 1.1 VMware Workstation Pro 激活许可证 UY758-0RXEQ-M81WP-8ZM7Z-Y3HDA V ...

  6. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #2 如何编译Linux内核

    HACK #2 如何编译Linux内核 本节介绍编译Linux内核的方法.当发现bug而修改源代码或者添加新功能时,就需要对内核进行重新编译,生成二进制映像文件.另外,如果想要使用发布版内核中无效的功 ...

  7. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #1 如何获取Linux内核

    HACK #1 如何获取Linux内核 本节介绍获取Linux内核源代码的各种方法.“获取内核”这个说法看似简单,其实Linux内核有很多种衍生版本.要找出自己想要的源代码到底是哪一个,必须首先理解各 ...

  8. 《Linux内核分析》 第一节 计算机是如何工作的

    第一节 计算机是如何工作的 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...

  9. 《Linux内核分析》第一周学习报告

    第一周:计算机是如何工作的 姓名:王玮怡  学号:20135116 第一节 存储程序计算机工作模型(冯诺依曼体系结构) IP指向的内存地址,取指令执行,完成后,IP值自加一,取下一条指令再执行. AP ...

随机推荐

  1. python 安装opencv 安装pycocotools

    pip3 install opencv-python https://blog.csdn.net/lsh894609937/article/details/72841359 pip3 install  ...

  2. shiro实战系列(十五)之Spring集成Shiro

    Shiro 的 JavaBean 兼容性使得它非常适合通过 Spring XML 或其他基于 Spring 的配置机制.Shiro 应用程序需要一个具 有单例 SecurityManager 实例的应 ...

  3. WorldWind源码剖析系列:挂件类Widgets

    WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D ...

  4. aips初步设想

    2018年5月10日星期四 目标:设计一个高并发,高性能,可扩展的现代化综合大前置机. 具备以下功能: 协议支持:http.socket.mq 报文支持:xml.json.8583 Tps:500笔/ ...

  5. Android An unexpected exception occurred while creating a change object. see the error log for more details

    今天再给Android项目工程中的包重命名时出现了这个错误(之前重命名的时候就没有出现,郁闷):An unexpected exception occurred while creating a ch ...

  6. Django进阶(2)

    1.在D盘创建mysite工程项目:  django-admin startproject mysite manage.py ----- Django项目里面的工具,通过它可以调用django she ...

  7. activiti发布APP时报错:关联的流程无效

    解决办法: 1.检查流程命名和任务命名以及其他命名中是否有特殊字符,有一些字符是不支持的.(中文是可以的,中文标点符号可能不行,我的经验是顿号会报错) 2.检查流程图,把鼠标放到每一根连接线上,观察它 ...

  8. POJ 1068&&2632&&1573&&2993&&2996

    这次的题目是著名的模拟(水逼)专题 题目难度都不大,思维也不深,就是一个字——烦 同时很多题目都有很多坑点 1608 题意是告诉你一个只有()的字符串(且匹配正确),每个)的左边有几个(,让你求每一对 ...

  9. Oracle中,如何查看FRA(Flashback Recovery Area)的利用率

    例子: SQL> set linesize 300SQL> select * from V$RECOVERY_AREA_USAGE; FILE_TYPE PERCENT_SPACE_USE ...

  10. 汇编 OR运算

    知识点:  OR运算  逻辑或  按位或 一.OR运算 12||1=1; 1||01=1; 0||0=0; || //逻辑或 | //按位或 int _tmain(int argc, _TCHA ...