C和C++的存储模式
2012-06-12 10:56
197 查看
测试环境:winxp TC2.0 VC++6.0
#include <stdio.h>
int main(int argc, char *argv[])
{
int i = 0x1234;
int j = 0x5678;
printf("i = %x \n",i);
printf("j = %x \n",j);
printf("main = %x",main);
scanf(&i,&j);
return 0;
}
对应的汇编代码:
var_i= byte ptr -4
var_j= word ptr -2
argc= word ptr 4
argv= dword ptr 6
envp= dword ptr 0Ah
push bp
mov bp, sp
sub sp, 4
mov word ptr [bp+var_i], 1234h
mov [bp+var_j], 5678h
push word ptr [bp+var_i]
mov ax, 194h
从上面的汇编代码可以看出,在C中先定义的变量,在栈中的地址是比较低的,后定义的变量栈中地址高。
在VC6.0中
int a = 0x12345678;
int b = 0x1234;
汇编代码
6: int i = 0x1234;
00401028 mov dword ptr [ebp-4],1234h
7: int j = 0x5678;
0040102F mov dword ptr [ebp-8],5678h
mov [ebp+var_24], 12345678h ; a
mov [ebp+var_28], 1234h ; b
结论:在VC6.0里面C++和C中,先申请的变量地址高,后申请的地址低,类似于先申请的先入栈,后申请的后入栈。
这个貌似和编译器有关。
#include <stdio.h>
int main(int argc, char *argv[])
{
int i = 0x1234;
int j = 0x5678;
printf("i = %x \n",i);
printf("j = %x \n",j);
printf("main = %x",main);
scanf(&i,&j);
return 0;
}
对应的汇编代码:
var_i= byte ptr -4
var_j= word ptr -2
argc= word ptr 4
argv= dword ptr 6
envp= dword ptr 0Ah
push bp
mov bp, sp
sub sp, 4
mov word ptr [bp+var_i], 1234h
mov [bp+var_j], 5678h
push word ptr [bp+var_i]
mov ax, 194h
从上面的汇编代码可以看出,在C中先定义的变量,在栈中的地址是比较低的,后定义的变量栈中地址高。
在VC6.0中
int a = 0x12345678;
int b = 0x1234;
汇编代码
6: int i = 0x1234;
00401028 mov dword ptr [ebp-4],1234h
7: int j = 0x5678;
0040102F mov dword ptr [ebp-8],5678h
mov [ebp+var_24], 12345678h ; a
mov [ebp+var_28], 1234h ; b
结论:在VC6.0里面C++和C中,先申请的变量地址高,后申请的地址低,类似于先申请的先入栈,后申请的后入栈。
这个貌似和编译器有关。
相关文章推荐
- c\c++ 复习基础要点07---内存存储 大端模式、小端模式
- 【总结】大端、小端存储模式的那点事
- c++ 设计模式 代理
- c++设计模式之原型模式Prototype
- 设计模式C++实现(14)——职责链模式
- 【C++深入浅出】设计模式学习之观察者模式
- C++设计模式——代理模式
- C++原型模式和模板模式
- 设计模式的C++实现 2.工厂模式
- 设计模式C++实现(3)——装饰模式
- C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)
- 设计模式观后(c++还原之十八 组合模式)
- 学习实践:使用模式,原则实现一个C++自动化测试程序
- C++实例(ACE模式简单分析)
- C++ 设计模式 依赖倒置原则 简单示例
- [C++]只存储整型的无锁队列
- c++ 观察者模式
- C++存储类别
- 第十一周项目二C/C++操作用邻接表存储的图
- Boolan C++设计模式 课程笔记 Week2