《CTF特训营》电子书链接:https://pan.baidu.com/s/1-ktFwsYZ-HPutW5tZZir9A 提取码:37f2
《从0到1:CTFer成长之路》购买链接:https://item.jd.com/12950900.html
先讲一讲通用寄存器,顾名思义,通用寄存器是一种通用型的寄存器,用于传送和暂存数据,也可以参与算数逻辑运算,并保存运算结果。早期x86 CPU只有8个寄存器,并且每个的用途都不相同。
我们所说的32位CPU、64位CPU的“位”,就是指的寄存器的大小,32位CPU的寄存器大小就是4个字节,也就是4x8=32位
通用寄存器的作用(32位):
EAX:累加器,在乘法和除法指令中被自动使用;在Win32中,一般用在函数的返回值中
ECX:计数器,CPU自动使用ECX作为循环计数器,在字符串和循环操作中常用,在循环指令(LOOP)或字符串操作中,ECX用来进行循环计数,每执行一次循环,ECX都会被CPU自动减一。
EDX:数据寄存器,常被用来放整数除法产生的余数
EBX:*址寄存器,在内存寻址时存放*址
ESP:指向最上面一个栈帧的栈顶,ESP用来寻址堆栈上的数据,ESP寄存器一般不参与算数运算,通常称为堆栈指针寄存器
EBP:指向最上面一个栈帧的底部,EBP由高级语言用来引用参数和局部变量
ESI:一般在字符串操作时指向源串
EDI:一般在字符串操作时指向目标串
再来说一说指令寄存器EIP:存放的是下一条要执行的指令地址,几乎不可以作为他用
16位的通用寄存器是:AX、BX、CX、DX、SI、DI、BP、SP
其中前四个(AX、BX、CX、DX)每个还可以分成高8位(815位)和低8位(07)两个独立的寄存器
所以说8位的通用寄存器是:高8位:AH BH CH DH 低8位:AL BL CL DL
对其中某8位的操作,并不影响另外对应的8位的数据。
标志寄存器
CPU内部的寄存器中,有一种特殊的寄存器具有以下三种作用。
用来存储相关指令的某些执行结果
用来为CPU执行相关指令提供行为依据
用来控制CPU的相关工作方式
这种特殊的寄存器被称为标志寄存器(EFLAG),x86的标志寄存器有32位。我们了解一下都是什么作用。
标志寄存器
它们大致分为两类:状态标志和控制标志。
状态标志(CF\ZF\SF\PF\OF\AF):用来记录程序运行结果得状态信息,许多指令得执行都将相应地设置它。
控制标志(DF\IF\TF):可由程序根据需要用指令设置,用于控制处理器执行指令的方式。
下面详细的说一下各个标志位:
进位标志CF(Carry Flag):当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF=1,否则CF=0
例如(十六进制算数运算):3A+7C=B6,没有进位:CF=0;AA+7C=(1)26,有进位,CF=1。
零标志ZF(Zero Flag):若运算结果为0,则ZF=1;否则ZF=0;(注意:ZF为1表示的结果是0)。
例如:3A+7C=B6,结果不是零:ZF=0;84+7C=(1)00,结果是零:ZF=1。
符号标志SF(Sign Flag):运算结果最高位为1,则SF=1;否则SF=0(有符号数据用最高有效位表示数据的符号,所以)
例如:3A+7C=B6,最高位为1,SF=1,84+7C=(1)00,最高位为0,SF=0;
奇偶标志PF(Parity Flag):奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
溢出标志OF(Overflow Flag):若算数运算的结果有溢出,则OF=1,否则OF=0。
什么是溢出:例如16位的范围是(+32767~-32768),如果运算结果超出这个范围,就产生了溢出,有溢出,说明有符号数的运算结果不正确。
溢出和进位:溢出标志OF和进位标志CF是两个意义不同的标志,进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。
什么是有符号数和无符号数:有符号数就是用最高位表示符号(正或负),其余位表示数值大小,无符号数则所有位都用于表示数的大小有符号数和无符号数是针对二进制来讲的。有符号数用最高位作为符号位,“0”代表“+”,“1”代表“-”;其余数位用作数值位,代表数值。比如:0011 表示 +3;1011 表示 -3。无符号数全部二进制均代表数值,没有符号位。即第一个"0"或"1"不表示正负。比如:0011 表示 3;1011 表示 11。
辅助进位标志AF(Auxiliary Carry Flag):在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:(1)、在字操作时,发生低字节向高字节进位或借位时;(2)、在字节操作时,发生低4位向高4位进位或借位时。(这个标志主要由处理器内部使用,用于十进制算数运算调整指令中,用户一般不必关心)
方向标志DF(Direction Flag):用于串操作指令中,控制地址的变化方向:设置DF=0,存储器地址自动增加。DF=1,存储器地址自动减少。
例如:CLD指令用于复位方向标志,执行后DF=0;STD指令用于置位方向标志,执行后DF=1;
中断允许标志IF(Interrupt-enable Flag):中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。CPU的指令系统中也有专门的指令来改变标志位IF的值。
例如:CLI指令用于复位中断标志,执行后IF=0;STI指令用于置位中断标志,执行后IF=1;
陷阱标志TF(Trap Flag):当TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。 |