函数的返回值都在EAX中.64位返回值.当我们写Windows32位C语言程序的时候.使用参数和局部变量,能用int,就别用short和char类型.涉及到一个程序内存对齐.参数和局部变量没有本质的区别,都是在函数被调用的时候,在栈中分配的.甚至完全可以把参数当做局部变量使用.参数是在函数调用前分配的内存.call之前.局部变量是函数调用时分配的内存.call中.但是call之后,它们就全从栈中被排除之外了.int x= 10;int y =x+10;int z =x*y;int x =x+y*z#include<stdio.h>#include<stdlib.h>void test1() { int l_v1 = 1; int l_v2 = 2; int l_v3 = 3; int l_v4 = 4; int l_v5 = 5;}
void test2() { int l_arr[] = { 1,2,3,4,5 }; int l_v1 = 1; int l_v2 = 2; int l_temp;l_temp = l_arr[1];
l_temp = l_arr[l_v1]; l_temp = l_arr[l_v1 + l_v2]; l_temp = l_arr[l_v1 * 2 + l_v2]; l_temp = l_arr[l_arr[1] + l_arr[2]]; l_temp = l_arr[7];} void main() { __asm { xor eax, eax; }test1();
test2();}
在被调用的函数中,修改调用者数据的局部变量.
栈是怎么回事.参数在栈里是如何体现的.局部变量在栈里是如何体现的.局部变量数组全局变量以及全局变量数组
函数运行的时候.可以使用寄存器也可以使用栈当然混合的使用. 在这个Windows 10 VS2015 debug x86模式生成的C/C++代码.没有局部变量和数组的时候,缓存区默认大小为192个字节.当有一个int局部变量的时候,缓存区大小为204个字节
当有一个char局部变量的时候,缓存区大小为204个字节当有一个short局部变量的时候,缓存区大小为204个字节当有一个int数组,5个成员,缓存区大小为224个字节.
当有一个char数组,5个成员,缓存区大小为212个字节.当有一个short数组,5个成员,缓存区大小为216个字节.如果你使用的变量不够4个字节,也按照4个字节给你在栈中分配.
所以这样子,就不存在一个什么char就比int节约空间.我们编写的程序是32位.
发挥它的最大允许效率,浪费了一些内存空间.一步迈50厘米. 有意识的去控制我的走路节奏.
存放一个数字,最大可能就是255
那我们就可以使用一个unsigned char 存放. int是不是32位,4个字节.EAX 0x00000000
不管返回值是char 对应着byte 8 al
还是short int 对应着word 16 ax还是int 对应着dword 32 eax当我们写一个32位程序,但是返回值是64位的时候.
返回值的高32位EDX中存放着,低32位在EAX存放着数组
eax=-1eax=0xFFFFFFFF1111edx=0xFFFFFFFFFFFFFFFF把一个32位有符号数,并且是存放在EAX中,拓展到EDX中,两个合并成64位的一个有符号数.
#include<stdio.h>
#include<stdlib.h>int f_test() { return 1;//在这个Windows 10 VS2015 debug x86模式生成的C/C++代码.没有局部变量和数组的时候,缓存区默认大小为192个字节.
}//不管返回值是char 对应着byte8 al还是short int对应着word16 ax还是int 对应着dword 32 eax
void main() { __asm { xor eax, eax } f_test();}#include<stdio.h>
#include<stdlib.h>int test() { long long int v1 = 0x11223344; return v1;}void main() { _asm { xor eax,eax } test();}//当有一个int局部变量的时候,缓存区大小为208个字节当有一个char局部变量的时候,缓存区大小为208个字节当有一个short局部变量的时候,缓存区大小为208个字节dpq 是拓展高位 整数 拓展都是0 负数拓展都是 1例如 eax是fffff fffff拓展到高位edx ffff ffff
#include<stdio.h>
#include<stdlib.h>void f_test(int *p_v1){ *p_v1 = 200; printf("%d", p_v1);}
void main() { int x = 100; printf("%d\n",&x); f_test(&x);system("pause");
}