博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
022.强化训练三
阅读量:5845 次
发布时间:2019-06-18

本文共 2251 字,大约阅读时间需要 7 分钟。

 

 

函数的返回值都在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=-1
eax=0xFFFFFFFF
1111
edx=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");

}

转载于:https://www.cnblogs.com/xiaodaxiaonao/p/7616111.html

你可能感兴趣的文章
Android中实现两次点击返回键退出本程序
查看>>
Flex组件的项目渲染器(ItemRenderer)使用总结
查看>>
网络学习笔记
查看>>
python - 列表
查看>>
Android开发笔记(成长轨迹)
查看>>
Android系统移植与调试之------->如何修改Android手机显示的4G信号强度的格子数
查看>>
linux 命令
查看>>
转 oracle 监控执行计划突然变化
查看>>
Hibernate中Criteria的完整用法2
查看>>
NGUI的输入框制作(attach- input filed script的使用)
查看>>
Java二十三设计模式之-----桥接模式
查看>>
二分查找C++实现
查看>>
[异常笔记] zookeeper集群启动异常: Cannot open channel to 2 at election address ……
查看>>
mysql 03
查看>>
Python基础教程(第2版•修订版)代码清单2-3 勘误
查看>>
当有多个click事件时的简易做法
查看>>
在dll中用DirectSound8同时播放多个wav文件不能发声
查看>>
项目总结体会
查看>>
1462 通往奥格瑞玛的道路
查看>>
windows系统下搭建私有nuget仓储服务器, 打包程序集并推送到私有nuget仓储服务器...
查看>>