哪位高手谈一下从汇编角度看c语言局部变量和全局变量的区别?

C20062222 2011-04-05 11:37:58
前几天发了个帖子,讨论这这方面的问题,引来众多高手帮助,可能当时我问题描述的不够明确,
我最终没有得到我想要的答案,今天另外开贴,就此问题开展讨论,希望达人继续关注,直接代码说事

int g_1 = 10;

void fun1()
{
int iLen = strlen("helloworld");
__asm
{
pushad

mov eax, g_1 // 这一句可以得到预期效果,运行后eax为10
mov ebx, iLen // 程序崩溃,对此现象我百思不得其解,期待高手释疑,我想知道怎么样才能把局部变量赋值给寄存器?

popad
}
}

void main()
{
fun1();
}

哪位高手愿意此种现象解释一下全局变量和局部变量的区别?
...全文
355 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
G_Spider 2011-04-05
  • 打赏
  • 举报
回复
局部变量在栈空间中被引用的。
低地址:
........
........ 局部变量内存区
局部变量2
局部变量1
ebp->调用函数的栈基址EBP 调用函数的栈基址
返回地址
入口参数1
入口参数2
.........
入口参数n

所以你的函数可以写成:
int fun1()
{
int iLen = strlen("helloworld");
__asm
{
pushad

;//mov ebx, g_1
mov eax, [ebp-4] ;//eax作为返回值 iLen

popad
}
}
yexiaomeng 2011-04-05
  • 打赏
  • 举报
回复
全局变量在分配内存是是分配在数据区的,所以所有的程序代码都可以访问,但是局部变量是在堆栈段,操作是使用到push/pop,所以局部变量在使用完成之后就消失了的
测试NULL 2011-04-05
  • 打赏
  • 举报
回复
你用的编译器是 VC 吗?
jikeyuan1 2011-04-05
  • 打赏
  • 举报
回复
有点高深啊 !!
  • 打赏
  • 举报
回复
mov ebx, iLen怎么可能“访问了低位内存”呢???
依据编译器的不同,mov ebx, iLen的实际生成代码可能是mov ebx, [ebp-xx]或者mov ebx, [esp+xx],不论哪种,都不可能“访问了低位内存”。

可以明确地说,就你所列出的代码,任何32位c/c++编译器生成的代码都不会导致“程序崩溃”。
导致“程序崩溃”的代码肯定与你列出的代码不一样。
C20062222 2011-04-05
  • 打赏
  • 举报
回复
我用的是vc2003编译器,程序崩溃确实是因为mov ebx, iLen代码所致,原因是访问了低位内存,
G_Spider提供方法是可以解决问题,但处理起来比较复杂,如果局部变量多,还要单独记忆,容易出错啊
如果在局部变量解决不了,只用用全局变量了
  • 打赏
  • 举报
回复
就你列出的代码而言,是不会导致程序崩溃的,程序崩溃肯定另有原因。

从这句“void main()”能够编译通过来看,应该是比较早期的编译器。

21,458

社区成员

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

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