基础知识目录
第一节、汇编语言基础
一些量词
bit: 比特,1位。010101。
byte: 字节,8位。计算机的最小存储单元。
WORD: 字。一个字通常是指两个字节(16位)。针对windows x64这个平台,这个规则总是成立的。其他一些小众的平台不一定满足这一点。
DWORD: windows API的类型,用于表示”double word”的数据,即32位。
QWORD: windows API的类型,用于表示”qual word”的数据,即63位。
x86_x64: 这是Intel最先推出的指令集。
栈帧: 用于记录程序在某时刻栈的状态。例如调用一个函数之前,需要保存栈帧,用于在完成调用之后恢复现场。
计算机寻址方式
前言
机器码
也就是一个一个的010101
汇编语言就是机器码的一助记符,为了让人能看懂。
寄存器
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寄存器中。
暂无评论内容