zoukankan      html  css  js  c++  java
  • 计算机是如何工作的

    1.冯诺依曼体系结构(存储程序计算机)

    1.1 解释

    • 从硬件角度可以抽象为一下模型:

    be6fe966-3e5e-4681-a7d9-ce9cad853fb0

    CPU与内存通过总线连接,CPU中有很多寄存器(总是指向内存的某一块区域),如IP(Instruction Pointer)。假如指向CS(Code Segment,代码段),CPU从IP指向的内存的地址,取指令执行,执行过后IP自加1,取下一条指令,重复上述步骤。

    • 从程序员的角度可以抽象为一下模型:

    359c1e16-2ff6-4e8b-a906-99edb280f4f1

    CPU不断执行next instruction,从内存取指令不断执行。

    内存保存数据和指令,CPU负责解释和执行指令。

    1.2 API和ABI

    cpu识别什么指令,怎么定义?

    API:程序员与计算机的接口界面

    ABI:程序与CPU的接口界面

    2.×86寄存器

    2.1 通用寄存器

    5e6f01fe-8045-497e-848c-3073198b1d9b

    2.2 段寄存器

    bc05bf30-707c-4553-814e-cd1b95b95ba5

    CPU在实际取指令是根据cs:eip来确定一个指令

    3.×86汇编指令

    指令

    含义

    模式/模型

    movl %eax,%edx

    edx=eax

    register mode,以%开头的寄存器标示符

    movl $0x123,%edx

    edx=0x12

    immediate,立即数以$开头的数值

    movl 0x123(没有$符表示地址),%edx

    edx=*(int32_t*)0x123

    direct,直接访问一个指定的内存地址的数据

    movl (%ebx)(ebx寄存器存的值——内存地址,加括号表示内存地址存的数据放在ebx),%edx

    edx=*(int32_t*)ebx

    indirect,将寄存器的值作为一个内存地址来范围内存

    movl 4(%ebx),%edx

    edx=*(int32_t*)(ebx+4)

    displaced,在间接寻址时改变寄存器的值

    pushl %eax

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

    clip_image002

    popl %eax

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

     

    call 0x12345(调用0x12345地址)

    pushl %eip(*)(当前的eip压栈)
    movl $0x12345,%eip(*)(立即数放在eip)

     

    ret

    popl %eip(*)

     

    enter

    pushl %ebp
    movl %esp,%ebp

     

    leave

    movl %ebp,%esp
    popl %ebp

     

    b,w,l,q分别代表8位,16位,32位,64位

    eip指向内存的指令,自加一(一条指令),*代表这些指令不能被程序员直接使用,程序不能直接修改eip寄存器

    4.汇编代码分析

     1 #include <stdio.h>
     2 
     3 int g(int x)
     4 
     5 {
     6 
     7 return x + 3;
     8 
     9 }
    10 
    11  
    12 
    13 int f(int x)
    14 
    15 {
    16 
    17 return g(x);
    18 
    19 }
    20 
    21  
    22 
    23 int main(void)
    24 
    25 {
    26 
    27 return f(8) + 1;
    28 
    29 }

    gcc -S -o main.s main.c -m32,对应的汇编代码

     1 g:
     2 
     3 pushl    %ebp
     4 
     5 movl    %esp, %ebp
     6 
     7 movl    8(%ebp), %eax
     8 
     9 addl    $3, %eax
    10 
    11 popl    %ebp
    12 
    13 ret
    14 
    15 f:
    16 
    17 pushl    %ebp
    18 
    19 movl    %esp, %ebp
    20 
    21 subl    $4, %esp
    22 
    23 movl    8(%ebp), %eax
    24 
    25 movl    %eax, (%esp)
    26 
    27 call    g
    28 
    29 leave
    30 
    31 ret
    32 
    33 main:
    34 
    35 pushl    %ebp
    36 
    37 movl    %esp, %ebp
    38 
    39 subl    $4, %esp
    40 
    41 movl    $8, (%esp)
    42 
    43 call    f
    44 
    45 addl    $1, %eax
    46 
    47 leave
    48 
    49 ret

    动画演示:

    6

  • 相关阅读:
    84. Largest Rectangle in Histogram (Solution 2)
    84. Largest Rectangle in Histogram (Solution 1)
    73. Set Matrix Zeroes
    【JavaScript】Symbol 静态方法
    【JavaScript】Date
    【JavaScript】Math
    725. Split Linked List in Parts把链表分成长度不超过1的若干部分
    791. Custom Sort String字符串保持字母一样,位置可以变
    508. Most Frequent Subtree Sum 最频繁的子树和
    762. Prime Number of Set Bits in Binary Representation二进制中有质数个1的数量
  • 原文地址:https://www.cnblogs.com/boyiliushui/p/5385106.html
Copyright © 2011-2022 走看看