高分求教

clrscr 2003-05-07 12:14:33
#include "Stdafx.h"
extern char *S[101]={0};
namespace Stack
{
int Top=0;
void Push(char *s)
{
if (s==NULL) return;
int x=strlen(s);
S[Top]=new char[x];
strcpy(S[Top],s);
Top++;
}
}
被VC7汇编成:
#include "Stdafx.h"
extern char *S[101]={0};

namespace Stack
{
int Top=0;
void Push(char *s)
{
004018F0 push esi
if (s==NULL) return;
004018F1 mov esi,dword ptr [esp+8]
004018F5 test esi,esi
004018F7 je Stack::Push+45h (401935h)
int x=strlen(s);
004018F9 mov eax,esi
004018FB lea edx,[eax+1]
}
004018FE mov edi,edi
int x=strlen(s);
00401900 mov cl,byte ptr [eax]
00401902 inc eax
00401903 test cl,cl
00401905 jne Stack::Push+10h (401900h)
00401907 sub eax,edx
S[Top]=new char[x];
00401909 push eax
0040190A call operator new (401B58h)
0040190F mov ecx,dword ptr [Stack::Top (40CBDCh)]
strcpy(S[Top],s);
00401915 mov edx,eax
00401917 add esp,4
0040191A mov dword ptr [ecx*4+40CA48h],eax
00401921 mov ecx,esi
00401923 sub edx,esi
00401925 mov al,byte ptr [ecx]
00401927 mov byte ptr [edx+ecx],al
0040192A inc ecx
0040192B test al,al
0040192D jne Stack::Push+35h (401925h)
Top++;
0040192F inc dword ptr [Stack::Top (40CBDCh)]
00401935 pop esi
}
00401936 ret

我就不明白,为什么把后面几行汇编到push函数体外。
如果是new char[30]这样的定值,就会把那几行写到函数体内。
我想,是不是汇编时VC会根据new的对象,考虑到堆栈的问题。
...全文
40 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
clrscr 2003-05-18
  • 打赏
  • 举报
回复
BraveHeart2222 2003-05-10
  • 打赏
  • 举报
回复
没人关注?????
紫郢剑侠 2003-05-07
  • 打赏
  • 举报
回复
值得研究!
继续努力!
endurer 2003-05-07
  • 打赏
  • 举报
回复
GZ
BraveHeart2222 2003-05-07
  • 打赏
  • 举报
回复
访问寄存器肯定比访问堆栈要快,Release版相对Debug版来说做了很多优化,比如c中的for循环也进行了优化,并省去了创建堆栈框架及销毁框架的过程,所以在函数体内看不到常见的:
   push ebp
mov ebp,esp
sub esp,n
这些语句。
更有甚者,一些Debug版能正常运行的程序,其相应的Release版运行时却会出现异常。这全是优化惹的祸!
BraveHeart2222 2003-05-07
  • 打赏
  • 举报
回复
你这段代码Release版是吗?Release版一般会进行代码优化,如果是Debug版的话,其编译后的代码几乎与原程序所对应的汇编代码一一对应;由于int x=strlen(s)及S[Top]=new char[x]的x在编译时不能确定,所以编译时,从时空效率考虑,不在该函数体内生成临时堆栈变量x,连带地,其它相关代码也就放到了函数体外。
  可看出,在该函数体外,并未为局部变量x分配堆栈空间,程序只是对s进行循环计数,结果(就是s的长度)保存到EAX寄存器中,这样,既节省了存储空间,又不必使用ESP或ESP寄存器定位堆栈,减少了时空开销。  
BraveHeart2222 2003-05-07
  • 打赏
  • 举报
回复
你这段代码Release版是吗?Release版一般会进行代码优化,如果是Debug版的话,其编译后的代码几乎与原程序所对应的汇编代码一一对应;由于int x=strlen(s)及S[Top]=new char[x]的x在编译时不能确定,所以编译时,从时空效率考虑,不在该函数体内生成临时堆栈变量x,连带地,其它相关代码也就放到了函数体外。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧