SS、SP、BP寄存器

SS, SP, BP 三个寄存器

SS:存放栈的段地址;
SP:堆栈寄存器SP(stack pointer)存放栈的偏移地址;

BP: 基数指针寄存器BP(base pointer)是一个寄存器,它的用途有点特殊,是和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到
比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址.一般除了保存数据外,可以作为指针寄存器用于存储器寻址,此时它默认搭配的段寄存器是SS-堆栈段寄存器.BP是16位的,再扩充16位就是EBP,用于32位编程环境的.一般高级语言的参数传递等等,转换为汇编后经常由BP/EBP来负责寻址\处理.

SP,BP一般与段寄存器SS 联用,以确定堆栈寄存器中某一单元的地址,SP用以指示栈顶的偏移地址,而BP可 作为堆栈区中的一个基地址,用以确定在堆栈中的操作数地址。

(下面这个像Win32汇编中的)
bp为基址寄存器,一般在函数中用来保存进入函数时的sp的栈顶基址
每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复sp和bp的值。像下面这样:
在函数进入时:
push bp     // 保存bp指针
mov bp,sp  // 将sp指针传给bp,此时bp指向sp的基地址。
                  // 这个时候,如果该函数有参数,则[bp + 2*4]则是该子函数的第一个参数,[bp+3*4]则是该子函数的 第二个参数,以此类推,有多少个参数则[bp+(n-1)*4]。
.....
.....
函数结束时:
mov sp,bp  // 将原sp指针传回给sp
pop bp       // 恢复原bp的值。
ret              // 退出子函数

http://my.oschina.net/orion/blog/15879
下面是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码
;假设执行函数前堆栈指针ESP为NN
push   p2    ;参数2入栈, ESP -= 4h , ESP = NN - 4h
push   p1    ;参数1入栈, ESP -= 4h , ESP = NN - 8h
call test       ;压入返回地址 ESP -= 4h, ESP = NN - 0Ch (注意CALL指令会把返回地址压入堆栈)
;//进入函数内
{
push   ebp                                     ;保护先前EBP指针, EBP入栈, ESP-=4h, ESP = NN - 10h
mov    ebp, esp                             ;设置EBP指针指向栈顶 NN-10h
mov    eax, dword ptr  [ebp+0ch]  ;ebp+0ch为NN-4h,即参数2的位置 这里可以看到了BP的作用了
mov    ebx, dword ptr  [ebp+08h]  ;ebp+08h为NN-8h,即参数1的位置 这里可以看到了BP的作用了
ub    esp, 8                                  ;局部变量所占空间ESP-=8, ESP = NN-18h (栈底的地址大)

;这里就是为局部变量申请空间.
...
add    esp, 8                                  ;释放局部变量, ESP+=8, ESP = NN-10h

;(假设在上面的指令中EBP没变的话, 直接MOV ESP, EBP即可达到堆栈平衡,

; 事实上也经常这么用)
pop    ebp                                      ;出栈,恢复EBP, ESP+=4, ESP = NN-0Ch
ret    8                                           ;ret返回,弹出返回地址,ESP+=4, ESP=NN-08h,

; 后面加操作数8为平衡堆栈,ESP+=8,ESP=NN, 恢复进入函数前的堆栈

; 为什么是8? 因为Test子函数有两个参数, 8就是对应了两个参数入栈时SP减少了8

}
原来ESP就是一直指向栈顶的指针,而EBP只是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数参数、局部变量等

分类: 编译/内存分配, 转载, GCC/G++/GDB/core dump/调试

SS, SP, BP 三个寄存器的不同和应用相关推荐

  1. SS, SP, BP 三个寄存器

    SS, SP, BP 三个寄存器 SS:存放栈的段地址: SP:堆栈寄存器SP(stack pointer)存放栈的偏移地址; BP: 基数指针寄存器BP(base pointer)是一个寄存器,它的 ...

  2. 8086汇编学习之DS寄存器、SS/SP寄存器

    相关博客:8086汇编基础知识.通用寄存器.CS/IP寄存器与Debug的使用 一.DS寄存器 一个8086CPU寄存器均是16位的,而数据类型有以下两种: 1Byte = 8bit (字节型数据) ...

  3. ARM三个寄存器 : 堆栈指针SP(R13)、连接寄存器LR(R14)和程序计数器PC(R15)

    深入理解ARM的这三个寄存器,对编程以及操作系统的移植都是必要的. 1.堆栈指针R13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式.非异常模式( ...

  4. 栈Stack和段寄存器SS,SP(学习汇编)

    1. 栈有2个基本操作:入栈.出栈 2. 栈顶的元素总是最后入栈,最先出栈:后进先出. 3. 8086CPU提供入栈和出栈的指令,最基本的两个是 PUSH(入栈) 和 POP(出栈) push ax ...

  5. 【汇编语言】栈区与SS:SP寄存器

    汇编语言 - 栈 栈是一块特殊的内存空间,本文涉及的CPU为8086CPU,所有与内存地址有关的数字皆为16进制 前言 栈的运行规律 - 先进后出,后进先出 以下为入栈的过程: 以下是出栈的过程: 以 ...

  6. 单片机DPTR(DPH,DPL)和SP特殊寄存器C语言中应用?这三个特殊寄存器对C程序员来说是透明的,不用C程序员操作,编译的时候会自动运用这三个寄存器ACC寄存器和B寄存器也类似

    单片机DPTR(DPH,DPL)和SP特殊寄存器C语言中应用?这三个特殊寄存器对C程序员来说是透明的,不用C程序员操作,编译的时候会自动运用这三个寄存器,ACC寄存器和B寄存器也类似 编译器把C译成指 ...

  7. 【汇编】三、寄存器(一只 Assember 的成长史)

    嗨~你好呀! 我是一名初二学生,热爱计算机,码龄两年.最近开始学习汇编,希望通过 Blog 的形式记录下自己的学习过程,也和更多人分享. 上篇系列文章链接:[汇编]二.预备知识(一只 Assember ...

  8. 第三章 寄存器(内存访问)

    学号:20171308150 姓名:江漪雯 班级:17计科4班 一. 内存中字的存储 1. 8086CPU中,用16位寄存器来存储一个字.高8位存放高位字节,低8位存放低位字节. 2. 在内存中存储时 ...

  9. 汇编语言:第三章 寄存器(内存访问)

    3.1内存中字的存储 CPU中寄存器是16位的,可以用高低字节存储一个字,但是每个内存单元是8位的,只能存储一个字节, 所以内存中用相邻2个内存单元存储一个字的高低字节 如:20000数值(4E20H ...

最新文章

  1. HSQLDB安装与使用
  2. Leetcode 963. 最小面积矩形 II 解题思路及C++实现
  3. 程序员养生攻略,你值得拥有
  4. 数据结构之图的基本操作
  5. Excel弱爆了!这个工具30分钟完成了我一天的工作量,零基础也能学!
  6. 18个小实例入门SQLServer XML查询
  7. App消息推送的原理
  8. threejs 特效,自定义发光墙体,贴图动画版本。发光围栏。
  9. Linux下固态硬盘坏块修复,固态硬盘如果发现坏块就完蛋了
  10. [转载]走近 Jazzy
  11. 速通~腾讯云学生gpu服务器安装TensorFlow
  12. Echelon/艾美捷——脂质与蛋白质相互作用的研究
  13. VUE 尚硅谷 学习内容详解
  14. 专题分纲目录 MEM/MBA数学基础
  15. docker部署ELK、grafana、zabbix
  16. 矩阵的负二分之一怎么计算
  17. Mogafx通胀与英镑的关系
  18. VS2019+QGIS开发库二次开发环境搭建
  19. jdk11基础上安装jdk1.8总结
  20. Hadoop3.2.0 Hadoop 机架感知

热门文章

  1. 论项目团队情商与项目团队绩效(转)
  2. tinyMce在线编辑器内JavaScript实现按Ctrl+S无刷新保存
  3. Android 使用GridView+仿微信图片上传功能(附源代码)
  4. JAVA 的 Date、Calendar的常用用法
  5. 关于HOOK API Lib 0.1 For Delphi
  6. PowerDesigner导入SQL生成数据模型
  7. 构建一个计算机网络,计算机网络--网络构建(一)
  8. nginx重定向到其他url方法_高级开发必须掌握Nginx之四,if、set、return
  9. flutter 局部状态和全局状态区别_给 Android 开发者的 Flutter 指南
  10. 11.PHP与MySQL