汇编语言中的堆栈段指针是干什么的
展开全部
堆栈段指针(寄存器SS)是用于确定堆栈在内存中的起始位置的寄存器;堆栈段寄存器的作用和其他段寄存器(CS,DS,ES)相同,都是为了在一整段的内存中划分区域:由于内存为一整段储存单元,CS(代码段寄存器)中存放代码段的起始位置,DS(数据段寄存器)中存放数据段的起始位置,SS(堆栈段寄存器)中存放堆栈段的起始位置,ES(附加段寄存器)中存放附加段的起始位置。
在操作系统架构的内存中,堆栈位于程序所使用内存的顶端,向内存低地址处扩展,DS寄存器中存放的是堆栈最低的地址。堆栈本身为内存的一部分,但是相对普通内存段(DS)的区别在于:普通内存段(DS)一般用于存放长久数据,无特殊存储顺序;堆栈内存段(SS)一般用于存放暂时数据(例如调用函数是的参数),可以使用PUSH,POP指令向栈顶压入,弹出数据。
另外,若SP(栈顶寄存器)中的值小于DS寄存器(PUSH指令执行过多次)将会引发错误:系统显示某某程序Stack Overflow(因为SS段往下的内存地址属于数据段的区域)。若SP中的值大于一定程度(由程序的堆栈段大小决定)(POP指令执行过多),也将会引发错误:系统显示某某程序Access Violation Reading Address(因为程序内存的顶端上有着其他数据)。
需要注意的是,在较新的操作系统下汇编其平台下的程序时,程序员将无法修改段寄存器中的值(修改会报错),它们由操作系统自身管理(可以理解为由操作系统编写者的代码管理),其原因是出于安全起见。
在操作系统架构的内存中,堆栈位于程序所使用内存的顶端,向内存低地址处扩展,DS寄存器中存放的是堆栈最低的地址。堆栈本身为内存的一部分,但是相对普通内存段(DS)的区别在于:普通内存段(DS)一般用于存放长久数据,无特殊存储顺序;堆栈内存段(SS)一般用于存放暂时数据(例如调用函数是的参数),可以使用PUSH,POP指令向栈顶压入,弹出数据。
另外,若SP(栈顶寄存器)中的值小于DS寄存器(PUSH指令执行过多次)将会引发错误:系统显示某某程序Stack Overflow(因为SS段往下的内存地址属于数据段的区域)。若SP中的值大于一定程度(由程序的堆栈段大小决定)(POP指令执行过多),也将会引发错误:系统显示某某程序Access Violation Reading Address(因为程序内存的顶端上有着其他数据)。
需要注意的是,在较新的操作系统下汇编其平台下的程序时,程序员将无法修改段寄存器中的值(修改会报错),它们由操作系统自身管理(可以理解为由操作系统编写者的代码管理),其原因是出于安全起见。
展开全部
汇编语言中的堆栈段指针是用来保存临时数据、局部变量和中断/调用子程序程序的返回地址。
堆栈指针总是指向栈顶元素。在51系列单片机中,堆栈是向上生长的,所以数据入栈的时候,堆栈指针先加1,再压栈。出栈的时候先弹出数据,堆栈指针再减1。但在AVR单片机中,堆栈是向下生长的,数据入栈时指针将减1,数据出栈时指针将加1。
堆栈指针总是指向栈顶元素。在51系列单片机中,堆栈是向上生长的,所以数据入栈的时候,堆栈指针先加1,再压栈。出栈的时候先弹出数据,堆栈指针再减1。但在AVR单片机中,堆栈是向下生长的,数据入栈时指针将减1,数据出栈时指针将加1。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
堆栈是用来存储数据的,例如某个寄存器里面的数值或地址。
堆栈可以理解成一个仓库,这个仓库里有很多格子,每个格子里放一个东西,每个格子都有一个编号。堆栈指针就是用来查找格子编号的,假设现在堆栈里有10个格子,编号依次是0,1,2,3,4,5,6,7,8,9,如果现在堆栈指针是5,那么就对应5号格子里的内容(数据或地址)
堆栈可以理解成一个仓库,这个仓库里有很多格子,每个格子里放一个东西,每个格子都有一个编号。堆栈指针就是用来查找格子编号的,假设现在堆栈里有10个格子,编号依次是0,1,2,3,4,5,6,7,8,9,如果现在堆栈指针是5,那么就对应5号格子里的内容(数据或地址)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
16位汇编下堆栈段SS寄存器是表示一个堆栈的基址,实际地址是(ss)*16+(sp)=物理地址,这个是当前对战指针指向的实际地址。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
堆栈指针,用于堆栈运算
入站和出站指针都要进行加减,
保证数据的进出
入站和出站指针都要进行加减,
保证数据的进出
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询