2018/12/29-通用寄存器-(2019/01/06改)

231 阅读2分钟

通用寄存器并不像CS,DS,SS,IR等寄存器一样有固定的使用要求,不过,会有一些约定俗成的使用规则

ax | 累加器 | 常用于算术运算和逻辑运算

bx | 基址寄存器 | 常用于存储内存地址,用此地址作为基址,用来遍历一片内存区域

cx | 计数器 | 计数器的作用就是计数,常用于循环指令中的循环次数

dx | 数据寄存器 | 用于存放数据

sp | 栈指针寄存器 | 其段基址是SS,指向栈顶,当对栈做push或pop操作时,sp的值会随之改变

bp | 基址指针 | 一般访问栈的方式为push或pop,但这样这能获取sp指向的数据,很多时候,我们需要访问栈顶和栈底之间的数据,通过SS:bp的方式把栈当作普通的段来访问。例:                   在栈中为局部变量和形参分配内存,假设在32位环境下                                                    

int a = 0;                  
function (int b,int c) {
    int d;                                                               
}                    
a++; 

(1) 调用function(1,2),在C语言中,参数入栈的顺序从右到左,每个参数在栈中占4个字节,会先压入参数2,
在压入参数1 
(2) 再压入function的返回地址
(3) push ebp:将ebp压入占中,备份ebp的值
(4) mov ebp, esp:将当前指针esp的值复制到ebp,ebp就可以作为基址对栈中的局部变量和形参寻址 
此时的ebp就是局部变量和形参的分界
(5) sub esp, 4:为局部变量d分配内存  
这时就可以用ebp作为基址,对栈中数据进行寻址
[ebp-4]是局部变量d
[ebp+4]是函数返回地址
[ebp-8]是参数b...
(6) 函数结束后,跳过局部变量的空间。mov esp,ebp
(7) 恢复ebp的值 pop ebp
(8) ret返回函数地址,调用"add esp+8"回收b,c的空间

 

还有一个直接操作栈中数据的例子,标志寄存器eflags的值是无法直接修改的,只能先用pushf指令将eflags的值压入栈中,在栈中修改完后,再用popf把它弹回eflags中

si | 源索引寄存器 | 常用于存储字符串操作中的数据源地址,通常需要与其他指令配合使用,例如批量数据传送指令movs[bwd]

bi | 目的索引寄存器 | 和si一样,常用于字符串操作,但di是用于数据的目的地址