深入理解程序设计-使用Linux汇编语言(1)

一、引言

计算机语言分类:

  • 机器语言:计算机可直接识别和处理的语言,机器语言通常是以数字或数字串的形式
  • 汇编语言:用易于记忆的字母序列代替数字命令,汇编语言和机器语言差不多
  • 高级语言:高级语言旨在使编程更容易,高级语言以更接近自然语言的形式表述程序。高级语言的一条命令,往往相当于汇编语言的几条命令

二、计算机体系结构

CPU(中央处理单元)、内存

2.1 内存结构

  • 内存存储单元
    所有存储单元都具有相同的固定大小

计算机的所有计算结果都存储在内存中

2.2 CPU构造

CPU一次从内存中读取一条指令并执行,CPU执行指令的步骤就是:读取-执行周期(指令周期/机器周期)
包括以下元件

  • 程序计数器
    告诉计算机从哪里提取下一条指令,CPU先查看程序计数器,提取指定内存地址的数字,传递给指令解码器
  • 指令解码器
    解释指令:需要进行何种处理(加法、减法、乘法、移动数据等),处理过程中涉及的那些内存单元。
    计算机指令:实际指令 + 执行指令要用到的内存单元
  • 数据总线
    取得存储在内存单元中用于计算的数据,CPU和内存间的物理连线,纽带。计算机主板中从内存延伸出来的排线。
  • 寄存器
    特殊的高速存储单元。CPU中有两种寄存器:通用寄存器和专用寄存器
    • 通用寄存器:进行主要运算的地方,CPU中通用寄存器很少,计算时绝大多数信息存储在主内存中,只有CPU处理才能提取到通用寄存器,处理完成后再放回到内存。
    • 专用寄存器:特定用途的寄存器*
  • 算术逻辑单元
    CPU在取回需要的所有数据后,将数据和经过解码的指令传递给算术逻辑单元处理。实际执行指令的地方,执行完成后将计算结果经数据总线传到指令指定的相应内存单元或寄存器。

2.3 常见术语

2.4 内存详解

C语言 memory-layout 内存布局


image.png
  • 栈(stack):系统自动分配空间,栈上空间是自动分配自动回收。栈上的数据生存周期只是在函数的运行过程中,运行后就自动释放。
  • 堆(heap):根据需要自己申请空间。堆上的数据不会自动释放,没有及时释放就会出现内存泄露

2.5 寻址方式

  • 立即寻址:指令本身包含要访问的数据。例如寄存器初始化为0,指令直接给出0,而不是告诉计算机要到那个地址读取0
  • 寄存器寻址:指令中包含要访问的寄存器,而不是内存位置
  • 直接寻址:指令中包含要访问的内存地址。例如请将地址2002中的数据加载到这个寄存器中
  • 变址寻址:指令中除包含一个要访问的内存地址外,还要指定一个变址寄存器,其中包含改地址的偏移量。
  • 间接寻址:指令中包含一个寄存器,改寄存器中存储的是指向要访问数据的指针。
  • 基址寻址:与间接寻址类似,但还须包括一个叫偏移量的值

for循环和内存寻址有关系?CPU高速缓存,缓存中有直接取出,不需寻址,foreach循环是最快的。
正在研究中
https://blog.csdn.net/ljyf5593/article/details/6961160

2.6

  • 读取-执行周期的完整生命周期:
    Fetch(取指)->Decode(译码)->Execute(执行指令)


    指令执行周期
  • 如何在计算机中表示大于255的数字?

3.1 编程初体验

3.2

汇编语言需要在开发机或docker上跑

3.3 为程序做规划

  • 条件跳转
  • 无条件跳转

3.4 查找最大值

实际手写一遍代码并理解每一行代码的意义

学习gdb反汇编的使用,gef

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容