看来还是没能解决我的疑问,按楼上讲,如果说栈的内存分配与CPU有关,那为什么TC与VC++正好相反,我觉得应该是和编译器有关的.....一个多字节变量高位字节占据高内存才是与CPU有关,关于这点TC和VC++都一样.......我要知道的就是为什么在定义变量时在VC++中为什么是先定义的占据高内存,而TC恰好相反
以下是引用yuanfeng1129在2010-8-16 13:08:42的发言:
看来还是没能解决我的疑问,按楼上讲,如果说栈的内存分配与CPU有关,那为什么TC与VC++正好相反,我觉得应该是和编译器有关的.....一个多字节变量高位字节占据高内存才是与CPU有关,关于这点TC和VC++都一样.......我要知道的就是为什么在定义变量时在VC++中为什么是先定义的占据高内存,而TC恰好相反
看来还是没能解决我的疑问,按楼上讲,如果说栈的内存分配与CPU有关,那为什么TC与VC++正好相反,我觉得应该是和编译器有关的.....一个多字节变量高位字节占据高内存才是与CPU有关,关于这点TC和VC++都一样.......我要知道的就是为什么在定义变量时在VC++中为什么是先定义的占据高内存,而TC恰好相反
程序代码:
int a = 12; int b = 29; long la = 123456; long lb = 987654; char ca = 'Q'; char cb = 'B';好吧,也怪我没说清楚
让我们先看TC对上面代码编译后生成的汇编代码
_main proc near
push bp ; bp入栈
mov bp,sp ; bp保存sp的值
sub sp,14 ; 将栈顶下移14个字节,用来存储局部变量。(栈是自顶而下的)
; ?debug L 5
mov word ptr [bp-14],12 ; 保存变量a,从这些语句应该可以看出来tc的局部变量的地址为啥由小变大了吧?
; ?debug L 6
mov word ptr [bp-12],29 ; 保存变量b
; ?debug L 7
mov word ptr [bp-8],1 ; 保存
mov word ptr [bp-10],-7616 ; 变量la
; ?debug L 8
mov word ptr [bp-4],15 ; 保存
mov word ptr [bp-6],4614 ; 变量lb
; ?debug L 9
mov byte ptr [bp-2],81 ; 保存变量ca
; ?debug L 10
mov byte ptr [bp-1],66 ; 保存变量cb
; ?debug L 12
OK,再来看vc生成的汇编代码push bp ; bp入栈
mov bp,sp ; bp保存sp的值
sub sp,14 ; 将栈顶下移14个字节,用来存储局部变量。(栈是自顶而下的)
; ?debug L 5
mov word ptr [bp-14],12 ; 保存变量a,从这些语句应该可以看出来tc的局部变量的地址为啥由小变大了吧?
; ?debug L 6
mov word ptr [bp-12],29 ; 保存变量b
; ?debug L 7
mov word ptr [bp-8],1 ; 保存
mov word ptr [bp-10],-7616 ; 变量la
; ?debug L 8
mov word ptr [bp-4],15 ; 保存
mov word ptr [bp-6],4614 ; 变量lb
; ?debug L 9
mov byte ptr [bp-2],81 ; 保存变量ca
; ?debug L 10
mov byte ptr [bp-1],66 ; 保存变量cb
; ?debug L 12
push ebp
mov ebp, esp
sub esp, 24 ; 00000018H ; 同TC一样,操作栈顶,为局部变量开辟存储空间(栈是自顶而下的)
; 5 : int a = 12;
mov DWORD PTR _a$[ebp], 12 ; 0000000cH ; 同tc一样,保存局部变量,从这些语句中知道为什么VC的局部标量地址由大变小了吧?
; 6 : int b = 29;
mov DWORD PTR _b$[ebp], 29 ; 0000001dH
; 7 : long la = 123456;
mov DWORD PTR _la$[ebp], 123456 ; 0001e240H
; 8 : long lb = 987654;
mov DWORD PTR _lb$[ebp], 987654 ; 000f1206H
; 9 : char ca = 'Q';
mov BYTE PTR _ca$[ebp], 81 ; 00000051H
; 10 : char cb = 'B';
mov BYTE PTR _cb$[ebp], 66 ; 00000042H
mov ebp, esp
sub esp, 24 ; 00000018H ; 同TC一样,操作栈顶,为局部变量开辟存储空间(栈是自顶而下的)
; 5 : int a = 12;
mov DWORD PTR _a$[ebp], 12 ; 0000000cH ; 同tc一样,保存局部变量,从这些语句中知道为什么VC的局部标量地址由大变小了吧?
; 6 : int b = 29;
mov DWORD PTR _b$[ebp], 29 ; 0000001dH
; 7 : long la = 123456;
mov DWORD PTR _la$[ebp], 123456 ; 0001e240H
; 8 : long lb = 987654;
mov DWORD PTR _lb$[ebp], 987654 ; 000f1206H
; 9 : char ca = 'Q';
mov BYTE PTR _ca$[ebp], 81 ; 00000051H
; 10 : char cb = 'B';
mov BYTE PTR _cb$[ebp], 66 ; 00000042H
[ 本帖最后由 succubus 于 2010-8-16 14:01 编辑 ]