Linux开发
第一汇编
基本印象
汇编是直接与底层硬件打交道的编程语言.所以汇编一定有操作硬件的语句.所以这就和高级语言有很大的不同了.
汇编实际上学习到
- 写出函数
- 声明变量
- 实现运算
- 条件判断
- 循环结构
实际上就可以了,因为汇编的复杂编程实际上基本都被高级语言所取代,不需要使用汇编进行复杂编程,汇编所起到作用的往往只是小部分.
底层之间的关系
架构,指令集,机器码,汇编
实际上最底层是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缓存和内存中读取
寄存器分类
- 通用寄存器
- 段寄存器 (用于给地址分段寻址用的) x86中叫做EIP 在x64中叫做RIP
- 指令指针寄存器 (段偏移指针) x86中叫eflags x64叫做 rflags
- 标准寄存器 (状态寄存器)
- 控制寄存器 (CR0-CR4)五个
- 调试寄存器 (DR0-DR7)八个 程序调试就要用这个
- 描述符寄存器 (GDTR,LDTR,IDTR)
- 任务寄存器 (TR)
- 其他寄存器…
寄存器的表同表示和描述
比如一个寄存器eax,
实际上就是e a x三个字母 ,e表示是x86 a 表示了寄存器编号 x表示是通用寄存器
所以很多时候eax也写作ax ,而rax表示是x64位的ax寄存器
实际上就是eax寄存器全部,但是很多时候寄存器可能分成不同的部分进行读取,所以一个寄存器又可以分成不同的部分
一般一个寄存器是16位,也就是两个字节,而我们很多的数据只需要使用到一个字节
所以eax的高八位 写作 ah ,低八位写作 al
常用寄存器
- eax 函数返回值都会自动放在这里
- ecx this指针,以及循环次数都放在这个寄存器中