基础知识目录

第一节、汇编语言基础

一些量词

bit: 比特,1位。010101。
byte: 字节,8位。计算机的最小存储单元。
WORD: 字。一个字通常是指两个字节(16位)。针对windows x64这个平台,这个规则总是成立的。其他一些小众的平台不一定满足这一点。
DWORD: windows API的类型,用于表示"double word"的数据,即32位。
QWORD: windows API的类型,用于表示"qual word"的数据,即63位。
x86_x64: 这是Intel最先推出的指令集。
栈帧: 用于记录程序在某时刻栈的状态。例如调用一个函数之前,需要保存栈帧,用于在完成调用之后恢复现场。
计算机寻址方式

• 在当前主流的操作系统中,都是以字节 (B) 为寻址单位进行寻址。
• 意味着计算机访问的最小单位是一个字节 (B)。
• 类比于人口普查,普查员以每户(B) 为单位统计,而不是访问到个人 ( b ) 。
前言

计算机井不能直接运行高级语言。
我们编写的高级语言程序需要进行编译后才能在计算机上运行。
高级语言经过编译之后,经过编译器处理,被打包成一个可执行文件的格式。
那么,计算机真正能够被运行的是什么?
机器码
也就是一个一个的010101

• 深入底层后,计算机其实很笨,只能完成一些很基本的操作,但是速度很快。
• 机器码就是一个个01组成的,为了方便人类阅读,一般都以16进制呈现。
• 尽管如此,一个个16进制字符可读性仍然很差。
•汇编语言就是把这些机器指令代码以一个助记符的形式翻译一下,方便人类阅读。
汇编语言就是机器码的一助记符,为了让人能看懂。

寄存器

• 计算机的指令都是由CPU来执行。
• 在计算机系统结构中,CPU和内存是分开的。
• 寄存器存在于CPU中,是CPU的直接操作对象。
windows x64寄存器命名规则
前缀R
表示64位寄存器。例如RAX。前缀E
表示32位寄存器。例如EAX后缀L
表示寄存器的低8位后缀H
表示寄存器的9~16位
寄存器的种类
这是64为系统所用到的寄存器


从第一个RAX到R15都是通用寄存器,基本完成一些数值运算,存储一些数据什么的,都可以。
计算机的发展是有一个过程的,最开始的时候不是64位的,最开始的可能是8位,16位的,
所以计算机的发展为了相互兼容,就保留了别的东西,在32位
首先我们看一下从RAX到R15都是通用寄存器。都是通用寄存器是 什么意思呢?
就是说我们基本完成一些数值运算,存储一些数据、乱七八糟的东西啊,通用寄存器干什么都可以。
然后呢,我们知道这个计算机的发展啊,并不是一蹴而就的。计算机发展是有个过程的,
最早的计算机呢?呃,并不是64位系统,最早的计算机可能是8位,可能是16位或者32位。
所以说呢,这个我们计算机的发展呢,为了向后兼容啊,所以说我们就留下保留了一些别的东西,

比如说呢,在32位系统中,是没有RAX寄存器的,
因为32位系统只有32位码,不可能直接访问64位的64位的东西,
所以说呢,在32位系统里面的这个RAX寄存器呢,就称之为EAX。
然后呢,在我们RAX的寄存器的低32位啊,就是EAX寄存器。

呃,以此类推啊,他的
低32位就是EAX寄存器
低16位就是AX寄存器
8到15位就是AH
AH什么意思呢?就是A寄存器的,高字节就是A high。
低8位就是AL,AL就是A low
RBX、RCX、RDX呢?它的命名的那个规则同RAX一样。

也就是,RBX的低32位是EBX,低16位就是BX。8到15位呢就是BH,低8位就是BL。
RAX
accumulator register,累加寄存器,通常用于存储函数的返回值。其实也可以用于存储其他值,只是通过RAX存储函数返回值属于惯例。

RBX
base register,基址寄存器,一般用于访问内存的基址。

RCX
counter register,计数寄存器。一般用于循环计数。

RDX
data register,数据寄存器。

RDI
destination index,目标变址寄存器,字符串运算时常用于目标指针。

RSI
source index,源变址寄存器,字符串运算时常应用于源指针。

R8 ~ R15
R8, R9, R10, ... , R15属于普通寄存器,一般是可以任意使用,不指定特定用途。支持拆分,但是拆分的寄存器在命名规则上与特殊功能寄存器有所不同。32位拆分寄存器以D作为后缀(DWORD),16位寄存器以W作为后缀(WORD),8位则以B作为后缀(BYTE)。

RSP
stack pointer,栈指针寄存器,正常情况下存放栈顶地址,如果用于其他事务,使用完成之后需要恢复原先的数据。

RBP
base pointer,基址寄存器,正常情况用于访问栈底地址。与RBP类似,如果用于其他事务,使用完成之后需要恢复原先的数据。

EFLAGS
EFLAGS Register,用于保存CPU运行中的一些状态,比如,溢出,进位等等,
CMP(Compare)指令:比较两个寄存器的值,比较的结果是以改变EFLAGS的值来存储。

CF:进位标志CF(Carry Flag),如果运算结果的最高位产生了一个进位或借位,其值为1,否则为0。
PF:奇偶标志PF(Parity Flag),运算结果中“1”的个数的奇偶性,偶数个1,PF=1,反之为0。
AF:辅助进位标志AF(Auxiliary Carry Flag),这个不太好理解,比如:EAX值为0xNNNNNNNN(红色地方有进位,AF就是1,不管使用的是:EAX、AX、AL)。
ZF:零标志ZF(Zero Flag),它记录相关指令执行后,结果是否为0;如果结果为0,zf=1,如果结果不为0,zf=0
SF:符号标志SF(Sign Flag),正负标志位,它记录相关指令执行后,结果是否为负,如果结果为负,zf=1,如果结果非负,zf=0。(说明一下:符号位是程序员确定的,如果是无符号数,就算SF位,如果是无符号数,就不管SF位,想让SF=1,就:MOV EAX,0x1然后SUB EAX,0x2)
OF:溢出标志OF(Overflow Flag):溢出标志OF用于反映有符号数加减运算所得结果是否溢出。(MOV AL,0x7F, ADD AL,0x1)
CF与OF的区别:
进位标志CF表示无符号数运算结果是否超出范围.
溢出标志OF表示有符号数运算结果是否超出范围.
DF:方向标志DF(Direction Flag),控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。DF=1,ESI,EDI自动递减(从高地址向低地址方向处理字符串),DF=0,ESI,EDI自动递增
RIP
instruction pointer,指令指针。只读,且不可拆分。指向下一条需要执行的指令地址。

指令计数器。当CPU来访问一个内存地址,就是来取指令的时候总有一个地址对吧?那这个地址呢,就存在RIP寄存器里。 RIP寄存器永远指向当前运行指令的下一个指令地址。
RIP指针用于存储CPU下一条将会执行的指针,不能直接修改,正常情况下会一次运行一条指令自增一条指令的长度,当发生跳转时才会以其他形式改变其值
寻址方式

汇编指令
计算机只能完成很基本的操作。
这些操作大多是对一些寄存器的值进行修改这些指令通过排列组合,完成复杂的功能,
两种格式: intel 和AT&T
二者差别主要在于源和目的操作数顺序上
可以通过立即数寻址来进行

1. MOV指令
MOV指令用于将数据从一个位置复制到另一个位置,其语法如下:
MOV destination, source
其中destination表示目标操作数,source表示源操作数。例如:
MOV AX, BX
这条指令将BX寄存器中的值复制到AX寄存器中。
评论区