"栈缠绕"stack winding 请高手讲讲

mxfeng 2008-07-15 05:01:22
简单的代码如下,主要是里面宏定义的汇编代码,我不太懂,请汇编社区的朋友门帮帮忙,给讲讲,请仔细点。
比如 pop edx ,中edx是什么,
call edx ,---》这块交迷糊,(好像是会把其他函数的栈插入当前栈中,不过不知道为什么)


#include <iostream>
using namespace std;


#define TempRet\
__asm{pop edx}\
__asm{call edx}

#define NAKED void __declspec(naked)
#define JUMP __asm jmp
#define RET __asm ret


static NAKED creatWindow()
{
cout<<"function A part 1"<<endl;
TempRet

cout<<"function A part 2"<<endl;
//RET
return;
}


static NAKED setCooperativeLevel()
{

cout<<"function B part 1"<<endl;
TempRet

cout<<"function B part 2"<<endl;
RET

}


static void otherfunc()
{
cout<<"other func"<<endl;
}


NAKED SetupDX7()
{
creatWindow();
setCooperativeLevel();
JUMP otherfunc; //为什么非得跳到其他函数???
}



int main()
{
SetupDX7();
return 0;
}

...全文
144 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
asssf3214 2011-06-12
  • 打赏
  • 举报
回复
mark
mxfeng 2009-09-04
  • 打赏
  • 举报
回复
3q
mxfeng 2008-07-21
  • 打赏
  • 举报
回复
good
mxfeng 2008-07-21
  • 打赏
  • 举报
回复
good
cnzdgs 2008-07-15
  • 打赏
  • 举报
回复
函数调用(call指令)是把下一条指令的地址压入栈,然后转到指定的函数地址去执行。
pop edx是将栈顶的数据弹出到edx里面,call edx是把edx的值作为函数地址来调用。naked函数不使用栈空间,所以naked函数中栈顶储存的就是函数的返回地址,TempRet宏的作用是调用返回地址,并使其返回到自己的下一条指令地址。我在下面代码中标出了执行顺序和执行过程中栈中的数据情况。
static NAKED creatWindow() // [esp]指向5,[esp+4]指向14
{
cout <<"function A part 1" <<endl; // 3
TempRet // 4,将[esp]改为指向12,并转到5执行,[esp+4]指向14
cout <<"function A part 2" <<endl; // 12
RET // 13,转到[esp]指向的地址,即14,并esp+4
}
static NAKED setCooperativeLevel() // [esp]指向8,[esp+4]指向12,[esp+8]指向14
{
cout <<"function B part 1" <<endl; // 6
TempRet // 7,将[esp]改为指向10并转到8执行,[esp+4]指向12,[esp+8]指向14
cout <<"function B part 2" <<endl; // 10,[esp]指向12,[esp+4]指向14
RET // 11,转到[esp]指向的地址,即12,并esp+4,[esp]指向14
}
static void otherfunc() // [esp]指向10,[esp+4]指向12,[esp+8]指向14
{
cout <<"other func" <<endl; // 9
} // 转到[esp]指向的地址,即10,并esp+4
NAKED SetupDX7() // [esp]指向14
{
creatWindow(); // 2
setCooperativeLevel(); // 5
JUMP otherfunc; // 8
}
int main()
{
SetupDX7(); // 1
return 0; // 14
}

21,458

社区成员

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

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