关哥的汇编笔记(二)寄存器与堆栈

引言

寄存器存在于CPU内部,用来暂时存放参与运算的数据和运算结果。一个n位(bit)的寄存器可以存放n个二进制数位。
80X86 CPU有很多寄存器,我们只介绍基本寄存器。

一 基本寄存器

1.1 通用寄存器

H是HIGH的缩写,L是LOW的缩写,AH为高八位寄存器,AL为低八位寄存器。AH和AL合在一起是16位寄存器AX,在AX高位扩展16位可以得到32位寄存器EAX。后面的B,C,D与A同理。
16位寄存器SI,DI,BP,SP分别在高位扩展16位可以得到32位寄存器ESI,EDI,EBP,ESP。

这些寄存器是可以被我们随便使用的,但每种寄存器都还有自己的专用用法。没必要死记硬背,现在只要了解一下就行,后面学会了汇编指令也就自然记住了。
EAX/AX:累加器,用于乘法、除法和I/O操作。
EBX/BX:基址R,用于基址寻址和查表转换。
ECX/CX:用于循环计数和串操作的计数。
EDX/DX:用于乘法、除法和间接I/O寻址。
ESI/SI:变址R,用于变址寻址和串操作(源串偏移地址)。
EDI/DI:变址R,用于变址寻址和串运算(目标串偏移地址 )。ESP/SP:堆栈指针R,用于堆栈操作,作栈顶的指针。
EBP/BP:基址R,用于基址寻址。(访问堆栈段)

1.2 指令指针寄存器

包括16位指令指针寄存器IP和32位指令指针寄存器EIP。
指令指针寄存器IP(X86型CPU)相当于ARM型CPU中的程序计数器PC,用于控制程序中指令的执行顺序。正常运行时,IP中含有BIU要取的下一条指令(字节)的偏移地址,一般情况下,每从内存中存取一次指令码,IP就自动加1,从而保证指令的顺序执行。IP实际上是指令机器码存放内存单元的地址指针,IP的内容可以被转移类指令(如JMP)强迫改写,以改变程序执行的顺序。
注意!我们编制的程序不能直接访问IP,即不能用指令去取出IP的值或给IP设定值(如不能用mov指令给IP赋值)。

1.3 标志寄存器

包括16位标志寄存器FLAGS和32位标志寄存器EFLAGS,存放运算结果的属性。

CF:进位/借位标志。加、减运算最高位产生进位/借位时置1。
AF:辅助进位/借位标志。加、减运算时低半字节位产生进位/借位时置1。
OF:溢出标志。有符号二进制加、减运算结果超出范围时置1。
ZF:零标志。结果为零时置1。
SF:符号标志。结果为负时置1。
PF:奇偶标志。结果“1”的个数为偶数时置1。

1.4 段寄存器

代码段寄存器CS(Code Segment)
数据段寄存器DS(Data Segment)
堆栈段寄存器SS(Stack Segment)
附加段寄存器ES(Extra Segment)
段寄存器是因为对内存的分段管理而设置的。
8086/8088CPU将1M字节的内存空间分为若干段,每个段的容量<=64K。每个段都是独立寻址的逻辑单位,各逻辑段在内存中可以邻接、间隔、完全重叠或部分重叠。任何时候,一个程序当前只能访问4个段:代码段、 数据段、堆栈段和附加段。其起始地址由CS、DS、SS、ES四 个段寄存器存放。
80386以后的微机增加了FS和GS两个附加段段寄存器。

二 堆栈

堆栈是一个特定的存储区,用于数据的暂存、断点和现场的保护。
堆栈的数据结构特点是:后进先出。
可以用段定义语句在存储器中定义一个堆栈段,其容量最大为64K。堆栈段由SS给出段基址,SP给出偏移地址。堆栈指针SP总是指向当前栈顶的位置,当堆栈置空时,SP指向的位置称为栈底。
堆栈的操作有两个:进栈操作和弹出操作。
进栈操作(PUSH)是将数据压入堆栈,进栈操作时,先将(SP) – 2 -> SP,再将数据压栈。
弹出操作(POP)是将数据从堆栈的顶部弹出,弹出操作时,先将数据出栈,再将(SP)+ 2 -> SP。
堆栈以字为单位进行操作。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部