首页 > 编程语言 > 详细

C语言功能中的工作原理

时间:2020-04-09 09:33:19      阅读:36      评论:0      收藏:0      [点我收藏+]

开始调用以保持程序地址的功能中断,继续简单使用

打破如果在路口有一个判决,并且他的条件是错误的,那么它将从圆环中消失并且不会发生。

继续如果环中有判决,则条件为假,将不打结,继续执行。

/ *

计算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。

C语言功能中的工作原理

原文:https://www.cnblogs.com/blogst/p/12664609.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!