关于汇编子程序堆栈

关于汇编子程序堆栈,第1张

嗯,你没有切换堆栈段,是无法回到程序原位置处的,例如:

...

call mymain

mov ax, 1

...

mymain:

push ax

push ax

ret

这样程序是不能返回原点的。因为子程序使用的堆栈是主程序的,在主程序调用子程序是保存的断点信息被你在子程序中push掉了(sp的值被你修改了),所以无法正确执行。

从中可以看出不足处: 子程序用的是主程序的堆栈段,容易修改主程序的数据。可以在调用子程序时为子程序切换堆栈段使子程序使用自己的堆栈段,在子程序返回时还原主程序的堆栈(当然用相应的算法写个子程序来处理这个问题,可以使子程序自动还原主程序的堆栈。可以讨论一下)例:

mov ax,ss 首先用ax,bx保存ss,sp的值。这样就不担心主程序的堆栈段了

mov bx,sp

(如果在调用子程序中要改变ax和bx的值时,在调用保存这个值,这个就是主程序的堆栈段了,下面例中没有改变值,所以不保存了)

call mymain

mov ax,1

........

mymain:

mov cx,0x7d00(子程序使用新的堆栈段)

mov sp,cx

push cx 改变了子程序的堆栈段,而没改变主程序的堆栈段

push cx

子程序完成后恢复主程序的堆栈段,注意在调用子程序前sp的值以改变,在子程序中要使sp值减2

sub bx,2

mov sp,bx

mov ss,ax 恢复主程序的堆栈段

ret 使用主程序的堆栈段返回主程序

这样做虽然复杂了许多,但子程序使用了自己的堆栈段后不用关心主程序的堆栈是否受到影响。明白了吗?在没用 *** 作系统的介入下(调用什么系统功能呀)在程序消亡前所有的东西都是你自己在控制,这就是汇编。

在这里我想说一下自己的想法,我还没时间去实现(上班苦呀)你可以参考一下(这只是大体想法,有不足处自己修改):

我们可以几个子程序段来实现:

首先可以写个子程序用来切换主程序的堆栈,当然可以在主程序中定义保存相关数据的结构。这里注意这个代码段本身是个子程序调用,在切换段时要注意把返回点从主程序的堆栈段中复制到新段中,同时把主程序的堆栈段的相关信息写到数据结构中去。然后用新的堆栈段就可以返回到主程序中。这样这个切换堆栈子程序就差不多了。

接下来写个还原堆栈子程序段,记住在调用这个子程序段是,我们还在目标子程序中执行代码,所以我们要从数据结构中读取数据还原主程序的堆栈段。

作用:先进后出的RAM区,以保护CPU现场。

堆栈:为子程序调用和中断 *** 作而设置的,具体功能有两个:保护断点,保护现场。

赋值原因:初始化时,堆栈设置的SP值比较小,SP=7,如果定义的数据存放的地址也比较小的话,有可能被覆盖,程序易出错。

分类: 电脑/网络 >>程序设计 >>其他编程语言

问题描述:

初学微机,每次编写程序时总要加入堆栈段,但是我不知道它在程序运行起什么作用。望指教!

解析:

因为CPU要使用堆栈,主要是子程序调用call和ret指令,使用堆栈来存储返回地址,调用子程序的时候,后调用的子程序先返回,而且还可能嵌套调用甚至递归调用,所以必须使用先进后出的数据结构stack来实现返回地址的存储。

没有堆栈stack,就无法实现函数/子程序调用,

还有高级语言都用stack来存储局部变量和参数,汇编也可以用,但是比较麻烦。汇编经常使用stack来保存寄存器的值,PUSH和POP指令比较好用


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8127837.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存