windows操作系统对于程序运行时堆栈的管理的研究

通过下面的代码得出了一个结论:

在windows操作系统中,栈空间不会释放,而是如果现有的栈空间满足函数的运行,则不再申请新的栈空间,但函数退出后也不释放栈空间;如果函数运行时占空间不够,则需要再申请新的空间;

使用malloc动态申请的空间因为位于堆空间,free后可以直接释放


#include <stdio.h>

#include <Windows.h>


int hello1()
{
int arra[1000*60];//占用的栈空间大小大概为0.2MB
int i=0;
for(i=0;i<1000;i++)
{
arra[i]=1024;
}
for(i=0;i<40;i++)//等待4秒
{
Sleep(100);
printf("arra[%d] is %d\n",arra[i]);
}
return 0;
}


int hello2()
{
int arra[1000*150];//占用的栈空间大小大概为0.5MB
int i=0;
for(i=0;i<1000;i++)
{
arra[i]=1024;
}
for(i=0;i<40;i++)//等待4秒
{
Sleep(100);
printf("arra[%d] is %d\n",arra[i]);
}
return 0;
}


int hello3()
{
int arra[1000*100];//占用的栈空间大小大概为0.4MB
int i=0;
for(i=0;i<1000;i++)
{
arra[i]=1024;
}
for(i=0;i<40;i++)//等待4秒
{
Sleep(100);
printf("arra[%d] is %d\n",arra[i]);
}
return 0;
}


int main()
{
int i=56;
int ret;
char * tmp_buf;
printf("i is %d\n",i);
for(i=0;i<10;i++)
{
Sleep(1000);
printf("sleep %d seconds\n",i);
}
//hello1()执行前,大概是0.2MB
ret=hello1();
//执行后,大概是0.4MB
hello2();
//hello2()执行后,大概是0.7MB
hello3();
//hello3()执行后,仍然是0.7MB,说明在windows系统中,栈空间会一直增加,而不会减少,但一般不会超过编译器默认的栈大小(程序员不改变的情况下)

printf("game over!");
for(i=0;i<5;i++)
{
printf("over wait %d seconds\n",i);
Sleep(1000);
}

tmp_buf=(char *)malloc(1024*1024);

for(i=0;i<5;i++)
{
printf("over wait %d seconds\n",i);
Sleep(1000);
}
//tmp_buf释放前,程序运行时,占用内存大小为1.8MB
free(tmp_buf);
//tmp_buf释放后,程序运行时,占用内存大小为0.7MB,说明free可以直接释放空间
for(i=0;i<5;i++)
{
printf("over wait %d seconds\n",i);
Sleep(1000);
}
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的例子,可以实现给定数据区内的英文字母、英文单词和行数的统计。请注意,由于DOS汇编程序已经过,因此在Windows操作系统运行可能需要一些额外的配置和调整。 ```assembly ; 定义数据段 data segment file db "example.txt",0 buffer db 1000 dup(0) letter_count dw 0 word_count dw 0 line_count dw 0 data ends ; 定义代码段 code segment start: ; 读取文件 mov ah,3dh ; 读取文件函数 mov al,0 ; 只读模式 lea dx,file ; 文件名 int 21h ; 调用DOS中断 mov bx,ax ; 保存文件句柄 ; 读取文件内容到缓冲区 mov ah,3fh ; 读取文件内容函数 mov cx,1000 ; 缓冲区大小 lea dx,buffer ; 缓冲区地址 int 21h ; 调用DOS中断 ; 统计英文字母、英文单词和行数 lea si,buffer ; 缓冲区指针 mov cx,1000 ; 缓冲区大小 mov bl,0 ; 当前单词长度 mov bh,0 ; 上一个字符是否为字母 mov dl,0 ; 上一个字符是否为换行符 count_loop: mov al,[si] ; 读取字符 cmp al,0 ; 判断是否到达缓冲区结尾 je count_done cmp al,10 ; 判断是否为换行符 je count_line cmp al,32 ; 判断是否为空格 je count_space cmp al,'A' ; 判断是否为大写字母 jb count_not_letter cmp al,'Z' ja count_not_letter inc letter_count ; 英文字母计数加1 cmp bh,0 ; 判断上一个字符是否为字母 jz count_word ; 如果不是字母,则当前字符是新单词的开头 inc bl ; 单词长度加1 jmp count_continue count_word: cmp bl,0 ; 判断上一个单词是否结束 jz count_continue inc word_count ; 英文单词计数加1 mov bl,0 ; 重置单词长度 count_continue: mov bh,1 ; 当前字符是字母 jmp count_next count_not_letter: mov bh,0 ; 当前字符不是字母 count_space: mov bl,0 ; 当前单词结束 jmp count_next count_line: inc line_count ; 行数加1 mov dl,1 ; 上一个字符是换行符 count_next: inc si ; 指向下一个字符 dec cx ; 缓冲区大小减1 cmp cx,0 ; 判断是否到达缓冲区结尾 jne count_loop count_done: ; 输出统计结果 mov ah,09h ; 用于DOS中断显示字符串 lea dx,letter_output ; 准备要显示的字符串 int 21h mov ah,02h ; 用于DOS中断显示数字 mov bx,letter_count ; 数字存储在BX中 int 21h lea dx,line_output int 21h mov bx,line_count int 21h lea dx,word_output int 21h mov bx,word_count int 21h ; 退出程序 mov ah,4ch ; 用于DOS中断退出程序 int 21h ; 定义输出字符串 letter_output db "Letter count: ",0dh,0ah,"$" line_output db "Line count: ",0dh,0ah,"$" word_output db "Word count: ",0dh,0ah,"$" code ends ; 定义堆栈段 stack segment dw 100h dup(0) stack ends ; 定义程序入口点 mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, stack mov ax, code mov es, ax jmp start ``` 请注意,以上代码只是一个简单的例子,可能需要根据具体的需求和情况进行修改和调整。另外,由于DOS汇编程序已经过,因此在Windows操作系统运行可能需要一些额外的配置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值