堆栈的建立与查询【用C语言编写的完整程序(包括main()函数】

堆栈的建立与查询【用C语言编写的完整程序(包括main()函数】,第1张

//该程序简单并可正确运行,希望kutpbpb的回答能对你有所帮助!

#include<stdioh>

#define N 100

typedef struct

{

int value[N];

int base;

int top;

}Sta;

void print()

{

printf("\n菜单:");

printf("\n1入栈:");

printf("\n2出栈:");

printf("\n3退出:");

}

void printS(Sta S)

{

printf("\n请输出栈中元素:");

for(int i=Stop;i!=Sbase;i--)

printf("%d ",Svalue[i-1]);

}

void pushS(Sta& S,int e)

{

if(Stop==N)

printf("\n栈满");

else

Svalue[Stop++]=e;

}

void popS(Sta& S,int& e)

{

if(Stop==Sbase)

printf("\n栈空");

else

{

e=Svalue[--Stop];

printf("\n请输出出栈元素: %d",e);

}

}

void main()

{

Sta S;

int e,choose;

Sbase=Stop=0;

do{

print();

printf("\n请输入你的选项:");

scanf("%d",&choose);

switch(choose)

{

case 1:

printf("\n请输入入栈元素:");

scanf("%d",&e);

pushS(S,e);

printS(S);

break;

case 2:

popS(S,e);

printS(S);

break;

case 3:

default:

break ;

}

if(choose==3)

break;

}while(1);

}

存储数据,指令地址等

栈:

在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

全文见百科

>

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

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 ;使用主程序的堆栈段返回主程序

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

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

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

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

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

以上就是关于堆栈的建立与查询【用C语言编写的完整程序(包括main()函数】全部的内容,包括:堆栈的建立与查询【用C语言编写的完整程序(包括main()函数】、在程序运行过程中,堆和栈的作用是什么、关于汇编子程序堆栈等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10108017.html

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

发表评论

登录后才能评论

评论列表(0条)

保存