今天在看雪看到一个帖:
引用
#include <iostream>
using namespace std;
int main()
{
cout<<"hello world!"<<endl;
__asm jmp main
return 0;
}
这个函数为啥不是死循环?怎么执行一会就结束?
按理说这应该是一个死循环,但编译后运行了一下却一会儿就退出了
小小改动一下,加入一个计数用的变量,再运行一下
#include <iostream>
using namespace std;
int a=0;
int main()
{
a++;
cout<<a<<endl;
__asm jmp main
return 0;
}
在debug编译方式下运行到退出的时候,a的值是12918,而在release编译方式的情况下,则是19889.
这问题太诡异了!
但真的诡异吗?
转到汇编语言下看看下(本来用VC++6就可以看了,但用着怎么都不顺手,于是就换成od)
main函数的开头如下:
debug方式:
引用
00401560 > > \55 push ebp
00401561 . 8BEC mov ebp, esp
00401563 . 83EC 40 sub esp, 40
00401566 . 53 push ebx
00401567 . 56 push esi
00401568 . 57 push edi
release方式:
引用
00401000 $ 55 push ebp
00401001 . 8BEC mov ebp, esp
00401003 . 83EC 24 sub esp, 24
00401006 . 53 push ebx
00401007 . 56 push esi
00401008 . 57 push edi
这两段代码可以说是熟悉得不能再熟悉的了函数开头的保存寄存器以及开辟临时变量的代码。而在函数结束的时候保存在栈中的值会弹出来。
于是上面那个死循环的问题就出现了:每个循环都往栈中压几次,但却又得不到释放,而栈空间不是无限大的,于是乎,程序就只好退出了。而用od运行后得到的终止代码是C0000005,这正是访问了无效的内存的错误代码。
为了再验证一下,再做一个小学的数学题:
在debug方式下,每次循环将80个字节压到栈中,而在循环12918次后,总共填了1033440个字节到栈中;
在release方式下,每次循环将52个字节压到栈中,而在循环19889次后,总共填了1034228个字节到栈中。
而这两个数值正好接近了1mb,这正是VC++6中默认的栈大小!
然后,再改动一下代码
#include <iostream>
using namespace std;
int a=0;
int main()
{
for(;;)
{
a++;
cout<<a<<endl;
__asm push eax
}
return 0;
}
同样是运行了一会儿就退出了,而由于每次循环都只是往栈中压进了4个字节,所以两种编译方式得到的结果差别不大,均为250000左右。
分享到:
相关推荐
主要介绍了Java中一个线程执行死循环有什么后果,当一个线程在执行死循环时会影响另外一个线程吗,下面为大家揭晓
一个简单的死循环,初学者可以借鉴一下,还凑合。
如果您在使用易语言进行编程的时候提示出现死循环代码,那么这个教程就是你的不二之选,他将教你怎么让易语言不再提示这个错误。
qt 多线程 防止主线程做循环操作导致界面假死。试过多线程的几种方法,只有这个方法可行。代码亲测可行。在子线程死循环,界面正常不死!!!
无尽的轮回(批处理死循环代码,打开前慎重考虑。
在嵌套循环中的死循环问题与解决方案。
C#死循环小程序,可以运行,顶多卡一下,正常退出即可,无害,适用初学者。
CAESE出现死循环的情况怎么办
NULL 博文链接:https://ufoqhmdt.iteye.com/blog/1313734
HashMap死循环原因分析.docx
基于Linux的一个专门检测已经编译好了的程序是否存在死循环等错误的程序,有源代码以及开发文档。
仿照的死循环C++程序,一运行无限重复打开我的电脑,CMD和IE。
解决spring mvc中jason无限死循环的方案
udp(死循环,发送udp包),用于攻击
C++的死循环代码模式,及exe文件 ,100K
解决hibernate监听器死循环问题
Delphi 转让控制权可以让系统同时处理多个事件,演示死循环的控制权转让方法,运行效果如示例图所示。 i:=0; Edit2.Text := '转让控制权可以让系统同时处理多个事件'; while i begin inc(i); Edit1.Text...
老二牛车教育程矢 Axure夜话之程序员眼中的原型设计视频教程之循环操作之死循环
Linux系统下用户进程死循环问题解决方法.docx
简单的脚本程序,可是要是打开就会一直死循环等着死机吧。。