汇编基础篇 之寄存器

·BIT(位) - 电脑数据量的最小单元,可以是0或者1。

例:00000001 = 1;00000010 = 2;00000011 = 3     

·BYTE(字节) - 一个字节包含8个位,所以一个字节最大值是255(0-255)。为了方便阅读,我们通常使用16进制来表示。

·WORD(字) - 一个字由两个字节组成,共有16位。一个字的最大值是0FFFFh (或者是 65535d) (h代表16进制,d代表10进制)。

·DOUBLE WORD(双字DWORD) - 一个双字包含两个字,共有32位。最大值为0FFFFFFFF (或者是 4294967295d)。

·KILOBYTE(千字) - 千字节并不是1000个字节,而是1024 (32*32) 个字节。

·MEGABYTE - 兆字节同样也不是一兆个字节,而是1024*1024=1,048,576 个字节



EAX: 累加器

EBX: 基址寄存器

ECX: 计数器

EDX: 数据寄存器

ESI: 源变址寄存器

EDI: 目的变址寄存器

EBP: 扩展基址指针寄存器

ESP: 栈指针寄存器

EIP: 指令指针寄存器

EBP: EBP在栈中运用最广,刚开始没有什么需要特别注意的 ;) 

ESP: ESP指向栈区域的栈顶位置。栈是一个存放即将会被用到的数据的地方,你可以去搜索一下push/pop 指令了解更多栈知识。 

EIP: EIP指向下一个将会被执行的指令。


i. 单字节(8位)寄存器: 顾名思义,这些寄存器都是一个字节 (8位) :

AL and AH

BL and BH

CL and CH

DL and DH

1. 通用寄存器:

AX (单字=16位) = AH + AL -> 其中‘+’号并不代表把它们代数相加。AH和AL寄存器是相互独立的,只不过都是AX寄存器的一部分,所以你改变AH或AL (或者都改变) ,AX寄存器也会被改变。 

-> 'accumulator'(累加器):用于进行数学运算

BX -> 'base'(基址寄存器):用来连接栈(之后会说明)

CX -> 'counter'(计数器):

DX -> 'data'(数据寄存器):大多数情况下用来存放数据

DI -> 'destination index'(目的变址寄存器): 例如将一个字符串拷贝到DI

SI -> 'source index'(源变址寄存器): 例如将一个字符串从SI拷贝

2. 索引寄存器(指针寄存器): 

BP -> 'base pointer'(基址指针寄存器):表示栈区域的基地址

SP -> 'stack pointer'(栈指针寄存器):表示栈区域的栈顶地址

3. 段寄存器:

CS -> 'code segment'(代码段寄存器):用于存放应用程序代码所在段的段基址(之后会说明)

DS -> 'data segment'(数据段寄存器):用于存放数据段的段基址(以后会说明)

ES -> 'extra segment'(附加段寄存器):用于存放程序使用的附加数据段的基地址

SS -> 'stack segment'(栈段寄存器):用于存放栈段的段基址(以后会说明)

4. 指令指针寄存器:

IP -> 'instruction pointer'(指令指针寄存器):指向下一个指令 ;)

iii. 双字(32位)寄存器:

2 字= 4 字节= 32 位, EAX、EBX、ECX、EDX、EDI…… 

如果16位寄存器前面加了‘E’,就代表它们是32位寄存器。例如,AX=16位,EAX=32位。

III. 标志寄存器

标志寄存器代表某种状态。在32位CPU中有32个不同的标志寄存器,不过不用担心,我们只关心其中的3个:ZF、OF、CF。在逆向工程中,你了解了标志寄存器就能知道程序在这一步是否会跳转,标志寄存器就是一个标志,只能是0或者1,它们决定了是否要执行某个指令。

Z-Flag(零标志):

ZF是破解中用得最多的寄存器(通常情况下占了90%),它可以设成0或者1。若上一个运算结果为0,则其值为1,否则其值为0。(你可能会问为什么‘CMP’可以操作ZF寄存器,这是因为该指令在做比较操作(等于、不等于),那什么时候结果是0什么时候是1呢?待会再说) 

The O-Flag(溢出标志):

OF寄存器在逆向工程中大概占了4%,当上一步操作改变了某寄存器的最高有效位时,OF寄存器会被设置成1。例如:EAX的值为7FFFFFFFF,如果你此时再给EAX加1,OF寄存器就会被设置成1,因为此时EAX寄存器的最高有效位改变了(你可以使用电脑自带计算器将这个16进制转化成2进制看看)。还有当上一步操作产生溢出时(即算术运算超出了有符号数的表示范围),OF寄存器也会被设置成1。 

The C-Flag(进位标志):

进位寄存器的使用大概占了1%,如果产生了溢出,就会被设置成1。例,假如某寄存器值为FFFFFFFF,再加上1就会产生溢出,你可以用电脑自带的计算器尝试。

IV. 段偏移 

内存中的一个段储存了指令(CS)、数据(DS)、堆栈(SS)或者其他段(ES)。每个段都有一个偏移量,在32位应用程序下,这些偏移量由 00000000 到 FFFFFFFF。段和偏移量的标准形式如下:

段:偏移量 = 把它们放在一起就是内存中一个具体的地址。

可以这样看:

一个段是一本书的某一页:偏移量是一页的某一行

你可能感兴趣的:(汇编基础篇 之寄存器)