博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆栈中的ss,bp,sp
阅读量:4155 次
发布时间:2019-05-25

本文共 1131 字,大约阅读时间需要 3 分钟。

各个寄存器的作用:http://zhidao.baidu.com/question/160825596.html?push=qlhttp://www.cnblogs.com/awpatp/archive/2010/07/07/1772725.html
已知(SS)=2000H,(BP)=0016H,堆栈中有8个字节数据,问栈顶的物理地址是什么?
BP为基地址。SP为堆栈的偏移地址SS是堆栈段地址物理地址表示形式为SS:SP所以如果不存放数据时物理地址为:SS:SP=2000h:0016h当初放了8字节数据后(堆栈单元放的是16位数据)所以地址加4即SS:SP=2000h:001ah 要先知道堆栈的大小才能计算。SS指向的是堆栈段的起始地址,而不是堆栈的地址,用它加上堆栈的容量就得出栈底的位置,然后再减去堆栈中数据的个数,就得出SP的位置了。BP主要在编写子程序时才用。因为子程序中经常使用局部变量,而局部变量的空间是在堆栈上申请的,这时就先让BP=SP,然后每定义一个局部变量,就把它压入堆栈。等子程序结束时,只要简单地一句mov sp, bp就可以从堆栈找到原先的返回地址,同时也归还了局部变量所占的空间。然后用ret指令,顺利返回。 BSS段:BSS段()通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段()通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。 代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。 堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减) 栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
你可能感兴趣的文章
Spring MVC和Struts2的比较
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
Commit our mod to our own repo server
查看>>
LOCAL_PRELINK_MODULE和prelink-linux-arm.map
查看>>
Simple Guide to use the gdb tool in Android environment
查看>>
Netconsole to capture the log
查看>>
Build GingerBread on 32 bit machine.
查看>>
How to make SD Card world wide writable
查看>>
Detecting Memory Leaks in Kernel
查看>>
Linux initial RAM disk (initrd) overview
查看>>
Timestamping Linux kernel printk output in dmesg for fun and profit
查看>>
There's Much More than Intel/AMD Inside
查看>>
CentOS7 安装MySQL 5.6.43
查看>>
使用Java 导入/导出 Excel ----Jakarta POI
查看>>
本地tomcat 服务器内存不足
查看>>
IntelliJ IDAE 2018.2 汉化
查看>>
基于S5PV210的uboot移植中遇到的若干问题记录(一)DM9000网卡移植
查看>>
Openwrt源码下载与编译
查看>>