Linux开发

第一汇编

基本印象

汇编是直接与底层硬件打交道的编程语言.所以汇编一定有操作硬件的语句.所以这就和高级语言有很大的不同了.

汇编实际上学习到

  1. 写出函数
  2. 声明变量
  3. 实现运算
  4. 条件判断
  5. 循环结构

实际上就可以了,因为汇编的复杂编程实际上基本都被高级语言所取代,不需要使用汇编进行复杂编程,汇编所起到作用的往往只是小部分.

底层之间的关系

架构,指令集,机器码,汇编

实际上最底层是CPU架构决定了指令集复杂指令集intelx86x64这种,精简指令集ARM,M1,M2这种,因为这些指令集的不同,CPU分成了x64,x86,arm等,因为他们同一个操作,所对应的机器码是不同的.

而汇编实际上就是机器码的代表,汇编可以直接翻译成机器码,所以不同的平台上汇编语言实际上也有点不同.

但是不同的操作系统上有不同的汇编语言例如MASM和NASM,ATT,ARM汇编,但是所表示的机器码是一样的,也就是机器码可以有不同的汇编语法来表示.

刚开始的x86架构是intel发明的,这个架构的地址为是32位,后来来了amd公司,将x86的基础上开发了64位的地址寻址,所以就叫做x64,后来intel也开发了64位地址,但是他们想要和amd的区分开,就叫做x86-64

寄存器

寄存器是速度最快的数据存储器,所以CPU在执行指令的时候最优先的都是从寄存器中读取数据.

cpu会从寄存器中直接读取数据,如果寄存器中没有数据会先让寄存器从别的地方读取数据,然后cpu再从寄存器中读取数据.

寄存器先从cpu缓存中读取数据,如果找不到数据会从内存中读取.

所以cpu只会直接从寄存器中读取

寄存区可以从cpu缓存和内存中读取

寄存器分类

  1. 通用寄存器
  2. 段寄存器 (用于给地址分段寻址用的) x86中叫做EIP 在x64中叫做RIP
  3. 指令指针寄存器 (段偏移指针) x86中叫eflags x64叫做 rflags
  4. 标准寄存器 (状态寄存器)
  5. 控制寄存器 (CR0-CR4)五个
  6. 调试寄存器 (DR0-DR7)八个 程序调试就要用这个
  7. 描述符寄存器 (GDTR,LDTR,IDTR)
  8. 任务寄存器 (TR)
  9. 其他寄存器…

寄存器的表同表示和描述

比如一个寄存器eax,

实际上就是e a x三个字母 ,e表示是x86 a 表示了寄存器编号 x表示是通用寄存器

所以很多时候eax也写作ax ,而rax表示是x64位的ax寄存器

实际上就是eax寄存器全部,但是很多时候寄存器可能分成不同的部分进行读取,所以一个寄存器又可以分成不同的部分

一般一个寄存器是16位,也就是两个字节,而我们很多的数据只需要使用到一个字节

所以eax的高八位 写作 ah ,低八位写作 al

常用寄存器

  1. eax 函数返回值都会自动放在这里
  2. ecx this指针,以及循环次数都放在这个寄存器中

Linux开发
https://wainyz.online/wainyz/2024/04/18/Linux开发/
作者
wainyz
发布于
2024年4月18日
许可协议