• 第一节 计算机是如何工作的——20135203齐岳


    第一节 计算机是如何工作的

    By 20135203齐岳

    存储程序计算机工作模型

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

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

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

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

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

    • ABI:程序与CPU接口界面(二进制编码)。

    X86汇编基础

    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
      

    注意:( * )表示伪指令,实际上程序员不能直接修改eip,会有安全隐患

    常用寻址方式

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

        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语言代码

    汇编代码

    堆栈变化过程

    执行leave语句时将esp指向ebp的位置,然后将ebp出栈从而释放函数所使用的堆栈。

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

    函数返回值保存在eax当中,随着函数调用的结束它的值依次被修改。

    注意:

    1.函数调用堆栈是由逻辑上多个堆栈叠加起来的

    2.函数的默认返回值通过eax寄存器存储返回给上一级函数

    参考资料

    【原创作品转载请注明出处】 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

  • 相关阅读:
    div拖拽缩放jquery插件编写——带8个控制点
    vuejs快速入门
    逗号运算笔记
    怎样用PHP制作验证码呢?
    mac下多个php版本快速切换的方法是怎么样
    HTML5 拖拽复制功能的实现方法
    CentOS下使用Percona XtraBackup对MySQL5.6数据库innodb和myisam的方法
    MySQL数据很大的时候
    Facebook MyRocks at MariaDB
    Mysql数据库知识-Mysql索引总结 mysql mysql数据库 mysql函数
  • 原文地址:https://www.cnblogs.com/July0207/p/5218597.html
Copyright © 2020-2023  润新知