zoukankan      html  css  js  c++  java
  • 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

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

    (1)知识概念

    冯诺依曼体系结构

    从硬件角度来看:CPU和内存,由总线连接,CPU中有一个名为IP的寄存器,总是指向内存的某一块:CS,代码段,执行命令时就取IP指向的一条指令,然后IP自加1,就指向下一条指令。

    从程序员角度来看:即存储程序计算机,内存存储数据和指令,CPU就是一个for循环,总是在执行下一条指令,CPU负责解释和执行这些指令。

    CPU如何识别这些指令?

    定义API:程序员与计算机的接口界面
    ABI:程序与CPU的接口界面,二进制指令编码,只涉及汇编指令。

    IP可被CALL,RET,JMP指令修改。

    X86汇编基础

    CPU寄存器

    通用寄存器+段寄存器+标志寄存器

    加E:32位 加R:64位

    汇编指令

    mov指令:b,w,l,q分别代表8位,16位,32位,64位

    寻址方式:寄存器寻址,立即数寻址,直接寻址,间接寻址,变址寻址

    汇编指令:push,pop,call,ret

    程序员不能直接修改EIP寄存器

    (2)实验部分(以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同)

    使用

    1. gcc –S –o main.s main.c -m32

    命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同

    1. int g(int x)
    2. {
    3.   return x + 3;
    4. }
    5.  
    6. int f(int x)
    7. {
    8.   return g(x);
    9. }
    10.  
    11. int main(void)
    12. {
    13.   return f(8) + 1;
    14. }

     【实验代码】

    汇编代码:

    省略之后的代码:

    • 汇编代码的工作过程中堆栈的变化

    • eip指向各个指令,从main函数开始自加一,指向下一条指令,当调用call指令会修改
      ebp,exp总是指向一个堆栈,ebp指向堆栈栈底,esp指向栈顶
      eax用于存一些数值
    • 【总结】
    • 通过此次实验,一步一步对汇编语言进行分析,使我对堆栈的调用认识更加深刻,对这部分的知识更加了解,对我今后的课程奠定了扎实的基础。巩固了汇编中所学的知识,对计算机的工作方式有了更加深刻的了解。对X86汇编指令以及各类寄存器的作用更加清晰,明白了linux内核使用的是AT&T汇编格式。知道了函数调用堆栈是理解C代码在CPU上执行的关键以及函数调用堆栈是由逻辑上多个堆栈叠加起来的。
  • 相关阅读:
    Cannot assign requested address问题总结
    Trying to connect an http1.x server
    从 0 到 1 搭建技术中台之推送平台实践:高吞吐、低延迟、多业务隔离的设计与实现
    思考gRPC :为什么是HTTP/2
    HTTP/1HTTP/2HTTP/3
    get_or_create update_or_create
    死锁案例 GAP 锁 没有就插入,存在就更新
    死锁产生必要条件
    京东零售mockRpc实践
    Certbot CA 证书 https
  • 原文地址:https://www.cnblogs.com/huangbobo/p/5223191.html
Copyright © 2011-2022 走看看