逆向工程——汇编基础(一)
参考文档:《简明 x86 汇编语言教程》作者:司徒彦南
什么是汇编
汇编语言是一种最接近计算机核心的编码语言。不同于任何高级语言,汇编语言几乎可以完全和机器语言一一对应。
汇编语言就是机器语言的一种可以被人读懂的形式,只不过它更容易记忆。
学习汇编语言,你需要
1。 胆量。不要害怕去接触那些计算机内部工作机制。
2。 知识。了解计算机常用的数制,特别是二进制、十六进制、八进制,以及计算机保存数据的方法。
3。 开放。接受汇编语言与高级语言的差异,而不是去指责它如何的不好读。
4。 经验。要求你拥有任意其他编程语言的一点点编程经验。
5。 头脑。脑子是个好东西。
认识处理器
汇编语言被编译成机器语言之后,将有处理器(CPU)来执行。
典型处理器的主要任务
1。 从内存中获取机器语言指令,译码,执行。
2。 根据指令代码管理它自己的寄存器。
3。 根据指令或自己的需要修改内存的内容。
4。 响应其他硬件的中断请求。
寄存器
寄存器位于CPU中,可以保存特定长度的数据。某些寄存器中保存的数据对于系统的运行有特殊的意义。
寄存器可以被装入数据,你可以在不同寄存器之间移动这些数据,或者做类似的事情,如四则运算、位运算等操作。
通用寄存器的表示方法
80386上的通用寄存器
上图中,数字表示的是位
。可以看出,EAX
是一个32-bit寄存器。同时,它的低16-bit又可以通过AX
这个名字来访问;AX又被分为高、低8-bit两部分,分别由AH
和AL
表示。
通用寄存器
以下是通用寄存器的名称和习惯用法。
EAX
EAX
,32-bit,通用寄存器,相对于其他寄存器,在进行运算
方面比较常用。在保护模式中,也可以作为内存偏移指针(此时,DS作为段寄存器
或选择器
)。
####EBXEBX
,32-bit,通用寄存器。通常作为内存偏移指针
使用(相对于EAX、ECX、EDX),DS
是默认的段寄存器
或选择器
。在保护模式中,同样可以起这个作用。
####ECXECX
,32-bit,通用寄存器,通常用于特定指令的计数
。在保护模式中,也可以作为内存偏移指针(此时,DS作为寄存器或段选择器)。
####EDXEDX
,32-bit,通用寄存器。在某些运算中作为EAX的溢出寄存器
(例如乘、除)。在保护模式中,也可以作为内存偏移指针(此时,DS作为寄存器或段选择器)。
上述寄存器同EAX一样包括对应的16-bit 和8-bit分组
ESI
ESI
,32-bit,通常在内存操作指令
中作为源地址指针
使用。当然,ESI可以被装入任意的数制,但通常没有人把它当做通用寄存器来用。DS作为寄存器或段选择器。
EDI
EDI
,32-bit,通常在内存操作指令
中作为目的地址指针
使用。
EBP
EBP
,32-bit,也是作为指针
的寄存器。通常,它被高级语言编译器用以建造堆栈帧
来保存函数或过程的局部变量
。SS
是它的默认段寄存器或选择器。
注意,这三个寄存器没有
对应的8-bit分组
。但可以通过SI
、DI
,BP
分别访问他们的低16位
。
段寄存器和选择器
实模式下的段寄存器到保护模式下,摇身一变就成了选择器。不同的是,实模式下的段选择器
是16-bit
的,而保护模式下的选择器
是32-bit
的。
CS 代码段
CS
,代码段,或代码选择器。同IP寄存器
一同指向当前正在执行的地址
。处理器执行时从这个寄存器指向的段(实模式)或内存(保护模式)中获取指令。除了跳转或其他分支指令外,你无法修改这个寄存器的内容。
DS 数据段
DS
,数据段,或数据选择器。这个寄存器的低16-bit
连同ESI
一同指向指令将要执行的内存
。同时,所有的内存操作指令默认情况下都用它指定操作段(实模式)或内存(保护模式下作为选择器)。这个寄存器可被装入任意数值
,做法是先把数据给AX
,在把它从AX传送给DS
。当然也可通过堆栈来做。
ES 附加段
ES
,附加段,或附加选择器。这个寄存器的低16-bit
连同EDI
一同指向指令将要处理的内存
。其他同DS
。
FS
FS
,F段或F选择器。可以用这个寄存器作为默认段寄存器或选择器的一个替代品
。
GS
GS
,G段或G选择器。它和FS
几乎完全一样。
SS
SS
,堆栈段或堆栈选择器。这个寄存器的低16-bit
连同ESP
一同指向下一次堆栈操作(push和pop)所要使用的堆栈地址
。这个寄存器也可以被装入任意数值,可通过入栈和出站操作来赋值。
注意,一定不要在初学汇编阶段把这些寄存器弄混。段寄存器或选择器,在没有指定的情况下都是使用默认的那个。这句话在现在看来可能有点稀里糊涂,不过你很快会在后面知道如何去做。
特殊寄存器
EIP
EIP
,32-bit,这个寄存器非常重要,同CS
一同指向即将执行的那条指令的地址
。不能够直接修改这个寄存器的值,修改它的唯一方法是跳转或分支指令。(CS是默认的段或选择器)
ESP
ESP
,32-bit,这个寄存器指向堆栈中即将被操作的那个地址
。尽管可以修改它的值,但并不提倡这样做,可能会破坏堆栈。(SS是默认的段或选择器)IP
: Instruction Pointer,指令指针。SP
: Stack Pointer,堆栈指针。
标志寄存器
其他寄存器
CR0
、CR2
、CR3
(控制寄存器)。例如CR0
的作用是切换实模式和保护模式
。D0
、D1
、D2
、D3
、D6
和D7
(调试寄存器),他们可以作为调试器的硬件支持来设置条件断点
。TR3
、TR4
、TR5
、TR6
、TR?
寄存器(测试寄存器)用于某些条件测试
。
作业
整理学习笔记,把学到的东西用自己的语言重新记录一遍