开始调用以保持程序地址的功能中断,继续简单使用
打破如果在路口有一个判决,并且他的条件是错误的,那么它将从圆环中消失并且不会发生。
继续如果环中有判决,则条件为假,将不打结,继续执行。
/ *
计算1到20之间的数字,这些数字不能被3整除,然后减去这些数字。
* /
#includ \\ u0026 lt; stdio.h \\>
#includ \\ u0026 lt; stdlib.h \\>
int main()
{
int i = 1;
int nCount = 0;
对于(; i \\ = 20; i ++)
{
如果(i%3 == 0)
{
继续
}
printf(\\%d ;, i);
nCount ++;
}
printf(\\ u0026“; \\\\ r \\\\ n \\ u0026”;);
printf(\\ u0026“; 20 ?之间的数字1不能被3整除,其中%d \\ u0026 quot ;, nCount);
系统(“暂停”);
返回0;
}
定义变量时,如果没有相应的默认值,则必须为其指定相应类型的默认值
char ch =‘\\\\ 0”;
int n = 0;
浮点f = 0.0f;
双d = 0.0;
int * p = NULL;
功能(强组合,低连接)
Microsoft函数名称约定。标准功能未突出显示,可用于外部呼叫。内部调用的非标准函数会突出显示(根据依赖关系进行命名,如果函数名称有强调等级,则表示一层依赖,而两种则意味着两层依赖)。
熟悉函数的语法
熟悉通话功能机制
每个功能模块的合理(困难)调制需要足够的经验失败
组合牢固,连接少
合并。所需的资源是自给自足的,并且不依赖于其他模块。可以很容易地将其移植到需要其他工作的其他模块中。
严格的合并,明确的职责可以放置在特定功能的特定功能中,一旦发现错误,以后调整的难度就会减小。
联轴器。资源(全局变量)相互依赖,并且一个模块不能执行一项功能。很难轻松地将其移植到需要其他工作的其他模块上,并且很难重复使用-差文化内涵价格图片大全哪里有。
如果连接数高,则责任不明确,将来将很难调整。例如,在Adibud街上
用户界面。用户界面将编程业务与界面分开
仅算法执行功能,并且UI传递给用户
定义函数时,必须对函数执行以下解释:
简要说明功能的作用和意义
描述函数每个参数的含义
描述退货的价值
关于功能和其他飞蛾的注意事项
有关修改版本的信息(根据公司规定)
范例:
结果的主要数最多为100
代码实现。
#includ \\ u0026 lt; stdio.h \\>
#includ \\ u0026 lt; math.h \\>
#includ \\ u0026 lt; stdlib.h \\>
/ *
此功能确定号码是否为主要号码
设定Int nNumber。 (中)测定值
返回值。如果是质数,则返回1,否则返回0
姚墨子:此功能不检查设置的有效性,并且呼叫者负责检查
* /
int IsPrime(int nNumber)
{
int i = 0;
int isPrime = 1;
int nEnd =(int)sqrt(nNumber);
如果(nNumber == 2)
{
返回isPrime;
}
对于(i = 2; i \\ nEnd; i ++)
{
如果(nNumber%i == 0)
{
isPrime = 0;
打破
}
}
返回isPrime;
}
int main()
{
int nCount = 0;
int n = 0;
为(nCount = 2; nCount \\ ult26 = 100; nCount ++)
{
如果(IsPrime(nCount))
{
printf(\\ u0026“;%d \\\\ t”,nCount);
n ++;
如果(n%8 == 0)
{
printf(\\ u0026“; \\\\ r \\\\ n \\ u0026”;);
}
}
}
系统(“暂停”);
返回0;
}
堆栈结构:
成瘾解决方案
A- \\ B-> C-00> D返回: D-> C-00> B->答:
堆栈结构的此功能可以记录功能的依赖性
桩和桩是两个不同的东西。如果没有特殊说明, \\ nbsp; \\ nbsp; \\ nbsp; \\ nbsp;
通话操作机制
1.要记录函数调用的依存关系,您需要维护一个装订结构,以便您知道执行内部函数后处理应返回的位置。
2.遵循双方通话协议下的设置
呼叫者被呼叫。呼叫者的呼叫称为铃,呼叫者需要双方在呼叫之前就呼叫的细节达成一致。
电话号码约定。 (1)切换操作参数的步骤(2)参数备份工具(盒或注册)(3)谁负责释放参数区域(只有一侧可以执行)(4)堆栈或寄存器值保留工具)
例如,调用公约。 __Cdecl更改了返回值之后,在命名该函数之前,声明该函数使用Convention C,并且在程序设置中默认使用ConventionC。
__cdecl(公约C)
功能设置从右移到左
使用堆叠区域传输设置
呼叫者负责设置空间
返回值在注册表中
__stdcall(标准呼叫约定)
功能设置从右移到左
使用堆叠区域传输设置
Cal Isht电缆负责清除设置区域
返回值在注册表中
__fastcall(快速调用约定)
左边的前两个设置通过寄存器传送,其余的设置使用订书钉从右向左传送。
Cal Isht电缆负责清除设置区域
返回值在注册表中
如果函数只有两个参数,则这两个参数将立即注册
从右到左,设置位于右下角的底部。
报名
CPU中的存储单元很昂贵,但是其访问速度却很快
3.保存在返回功能称为“返回地址”之后应执行的代码地址。
注册您的家庭住址
4.保存主叫方地址。
5.将当前水盆的底部更新为卡尺的直径。
6.对局部变量使用cherry节(使用板存储局部变量)。
7. / Zi或/ ZI(/ Od)合成选项将设置局部变量空间的初始值以及0xcccccccc(hot????hot)设置/ Zi生成设置信息,/ Od禁用优化(初始的局部变量不是。口袋里有随机值)
/ Zi Edit ?继续产生误导性信息(您可以继续配置程序而无需重置程序)
好热在本地变量未运行下安装
8.保存其他受影响的日志(/ Zi或/ ZI是12字节的稳定存储(3字节,每个寄存器4字节))
(表示该功能中使用的寄存器将被预先保存)12个字节。在此功能中,可以使用其他值输入其他日志
9.表演功能主体
分析功能之间的联系
代码:
#includ \\ u0026 lt; stdio.h \\>
#includ \\ u0026 lt; math.h \\>
#includ \\ u0026 lt; stdlib.h \\>
/ *
此功能确定号码是否为主要号码
设定Int nNumber。 (中)测定值
返回值。如果是质数,则返回1,否则返回0
* /
int IsPrime(int nNumber)
{
int i = 0;
int isPrime = 1;
int nEnd =(int)sqrt(nNumber);
如果(nNumber == 2)
{
返回isPrime;
}
对于(i = 2; i \\ nEnd; i ++)
{
如果(nNumber%i == 0)
{
isPrime = 0;
打破
}
}
返回isPrime;
}
无效的ShowPrime(int nMin,int nMix)
{
int nCount = 0;
int n = 0;
对于(nCount = nMin; nCount \\ u0026 lt; = nMix; nCount ++)
{
如果(IsPrime(nCount))
{
printf(\\ u0026“;%d \\\\ t”,nCount);
n ++;
如果(n%8 == 0)
{
printf(\\ u0026“; \\\\ r \\\\ n \\ u0026”;);
}
}
}
}
//主要功能是调用者
int main()
{
// ShowPrime是被呼叫者
ShowPrime(2,100);
系统(“暂停”);
返回0;
}
ShowPrime功能袋的结构
在主功能中,当切换到ShowPrime功能时,功能之间的部分结构如下:
每个函数都有一个返回地址,如果没有返回地址,可以说这个函数不能返回原位。
第一步从主要功能开始。当没有从主函数调用其他子函数时,主函数的累积结构如下:
如果在主函数中未调用文件中的子函数,则只能在内存中查看主函数的存储库结构。如果调用了子功能,则将刷新内存:您可以看到主要功能?子功能标准的数据。
ShowPrime函数的案例结构
Isprime函数的稳定结构
从内存中我们可以发现,局部变量提供的区域比我们使用的区域大得多
使用Winhex分析操作呼叫之间的连接
分析测试程序功能之间的联系
#includ \\ u0026 lt; stdio.h \\>
#includ \\ u0026 lt; stdlib.h \\>
/ *
此函数用于计算nNumber1和nNumber2的累加和
nNumber1参数是初始累积值,nNumber2是最大累积值。
计算结果返回0
* /
int Test1(int nNumber1,int nNumber2)
{
int结果= 0;
printf(\\ u0026“;%p \\\\ r \\\\ n”,\\ u0026放大器;结果); // 0012FF20:
系统(“暂停”);
for(; nNumber1 \\ u0026 lt; = nNumber2; nNumber1 ++)
{
结果+ = nNumber1;
}
printf(????????u0026“;%d \\\\ r \\\\ n \\ u0026”;结果);
返回0;
}
//主要功能是调用方
int main()
{
测试1(1,10); // Test1是被调用方
系统(“暂停”);
返回0;
}
在C语言的功能中,工作原理开始保留工程地址的地址功能JS。
原文:https://www.cnblogs.com/blogst/p/12664609.html