笨鸟先飞学编程系列之二 基础代码的编写1(转)
2012-06-13 17:56
369 查看
通过上次课题的讲述,相信大家一定对什么是数据及数据的定义和使用方法有一定的了解了,在看本次课题之前希望大家能趁热打铁,再到网上下本C语言的教程,最好是买本数来巩固下变量相关的知识。
大家明白了怎么定义变量,怎么给变量赋值了,自然的就应该进一步了解一下一些详细的代码怎么编写了。
今天我们的任务比较简单,就讲一下如何编写代码及实现代码的流程控制。应该说这个是非常简单的东西了,本来我没打算讲它,可是本着一步一个脚印的原则,我还是简要的说一下。在本次课题之后,我会紧跟着出一个函数的专题,来作为代码篇的完善,至此大家应该能独立的写自己的程序了。
本次课题知识点不是很多(也不少,但是都很简单。),主要是在于多写,多练,知道自己能把一些现实的问题转换成代码来解决问题。
不多废话,先说下本次课题要写的主要内容:
程序的运算和逻辑判断
三种程序流程控制结构详解。
养成良好的代码编写风格。
结束语
下面开始进入正题。
一、 程序的运算和逻辑判断。
说计算是电脑最基本的功能,相必没有人会反对的。做程序,自然最基础的就是这些运算了。
我知道,看这个破烂文章的朋友对数据应该都是不感冒的。不过大家放心,这里牵扯的运算都很简单,就是小学的加、减、成、除、取余数,是、非、与或和位移,没别的了。先让我们来了解下算术运算。
1. 算术运算。
加减乘除相比大家都应该很了解的。这里我不想费太多的篇幅讲述这些大家都明白的知识,我把要说的知识列出来,大家自己了解就好。
用于算术运算的运算符有:
我想不用我说,加、减、成、除这些运算符大家都接触过的,关于“%”运算符,其实就是取余数;用这些运算符可以将一些数字,变量等连接起来,进行运算,这样的式子叫做表达式。例如:
int i =5;
i +7; // 这里就是一个表达式。
“=”这个运算符其实不属于算术运算,它也并非是我们数学课上讲的“等于”,而是一个“赋值”运算符,它用来将一个常量(数字、字母等)赋值给一个变量的赋值运算符,由于我们进行算术运算以后,通常都会将运算结果保存到一个变量中,所以,我把这个赋值运算符归类到这里。而我们日常的“等于”运算符是:“= =”,它属于逻辑运算符,我们将在下一节中讲到它。
关于“++ 、 — —”这两个运算符,上图中已经说明了,它是对变量的对自己的自加或者自减运算,等同于:变量 = 变量+1; 或者 变量 = 变量 — 1;
现在让我们来举几个例子,来说明下这些算术运算符的用法。
void main()
{
int x = 1;
int y = 2;
int z = 20;
x ++; // 等同于x = x + 1;
y --; // 等同于y = y - 1;
z /= x; // 等同于z = z / 1;
printf("%d, %d, %d\n", x, y, z); // 打印 x,y,z 的结果。
z %= x; // 计算得出 z / x 以后的余数
x = x+y;
z -= x;
printf("%d, %d, %d\n", x, y, z); // 打印 x,y,z 的结果。
}
请先不要看下面的截图,先看下这个程序,分析一下,这两次的输出结果会是多少,然后对比下图:
看下就算的是不是正确,如果正确了,那恭喜你,基础的算术运算就算通过了,接下来,我们需要调试这段代码,来熟悉一些相关的汇编命令,具体操作如下图所示:
在代码上右击鼠标,选择如下命令:
我们来详细分析一下我们现在看到的代码:
1: #include "stdio.h"
2:
3: void main()
4: {
00401010 push ebp
00401011 mov ebp,esp ;// 将现有的堆栈给了EBP寄存器。
00401013 sub esp,4Ch ;// 分配x4C大小的堆栈空间用来运算。
00401016 push ebx
00401017 push esi
00401018 push edi ;// 保存寄存器环境。
00401019 lea edi,[ebp-4Ch] ;// 这里用ebp寄存器减去一个偏移来定位我们定义的变量,
0040101C mov ecx,13h ;// 这里-4Ch是用来定位到堆栈头,把堆栈内容改成int3中断以免内存泄露。
00401021 mov eax,0CCCCCCCCh ;// 以上操作是保存堆栈环境,分配堆栈空间。
00401026 rep stos dword ptr [edi] ;// 在下一次课题讲述函数时,我们会讲到,这里大家可以略过。
5: int x = 1;
00401028 mov dword ptr [ebp-4],1;// [ebp-4]是我们的变量x,dword ptr是用来修饰这个变量是DWORD类型(也就是整型)。
6: int y = 2;
0040102F mov dword ptr [ebp-8],2;// MOV就是汇编指令,相当于我们C语言中"=" 赋值运算符,它的具体用法自己百度。
7: int z = 20;
00401036 mov dword ptr [ebp-0Ch],14h
8:
9: x ++; // 等同于x = x + 1;
0040103D mov eax,dword ptr [ebp-4]
00401040 add eax,1; // add指令就是我们C语言的"+"运算符,还有一个INC指令相当于我们的"++"运算符
00401043 mov dword ptr [ebp-4],eax
10: y --; // 等同于y = y - 1;
00401046 mov ecx,dword ptr [ebp-8]
00401049 sub ecx,1
0040104C mov dword ptr [ebp-8],ecx
11:
12: z /= x; // 等同于z = z / 1;
0040104F mov eax,dword ptr [ebp-0Ch]
00401052 cdq
00401053 idiv eax,dword ptr [ebp-4]
00401056 mov dword ptr [ebp-0Ch],eax
13: printf("%d, %d, %d\n", x, y, z);
00401059 mov edx,dword ptr [ebp-0Ch]
0040105C push edx
0040105D mov eax,dword ptr [ebp-8]
00401060 push eax
00401061 mov ecx,dword ptr [ebp-4]
00401064 push ecx
00401065 push offset string "%d, %d, %d\n" (0042001c) // 传递参数,具体规则将在下次课题“函数”中讲述。
0040106A call printf (004010f0) ; // 调用printf函数打印结果
0040106F add esp,10h ; // 这里是C条用的对战平衡方式。(具体将在下次课题“函数”中讲述)
14:
15: z %= x;
00401072 mov eax,dword ptr [ebp-0Ch]
00401075 cdq
00401076 idiv eax,dword ptr [ebp-4]
00401079 mov dword ptr [ebp-0Ch],edx
16:
17: x = x+y;
0040107C mov edx,dword ptr [ebp-4]
0040107F add edx,dword ptr [ebp-8]
00401082 mov dword ptr [ebp-4],edx
18: z -= x;
00401085 mov eax,dword ptr [ebp-0Ch]
00401088 sub eax,dword ptr [ebp-4]
0040108B mov dword ptr [ebp-0Ch],eax
19: printf("%d, %d, %d\n", x, y, z);
0040108E mov ecx,dword ptr [ebp-0Ch]
00401091 push ecx
00401092 mov edx,dword ptr [ebp-8]
00401095 push edx
00401096 mov eax,dword ptr [ebp-4]
00401099 push eax
0040109A push offset string "%d, %d, %d\n" (0042001c)
0040109F call printf (004010f0)
004010A4 add esp,10h
20: }
004010A7 pop edi ; // 恢复寄存器环境
004010A8 pop esi
004010A9 pop ebx
004010AA add esp,4Ch ; // 平衡堆栈
004010AD cmp ebp,esp
004010AF call __chkesp (00401170) ; // DEBUG 模式程序专用的堆栈检查函数。
004010B4 mov esp,ebp
004010B6 pop ebp
004010B7 ret
相信你根据上述代码中的提示,应该能将这个汇编代码看的差不多,当然,看不明白也没有关系,我们需要掌握的汇编指令及其用法很少,就下面几个:
mov/lea: 赋值/取地址。
add: 加法指令。
sub: 减法指令。
div/idiv: 除法指令。
mul/imul: 乘法指令。
这些汇编指令的具体用法大家自己百度或者参考相关资料,这里不做详细说明, 下面开始我们的逻辑、关系运算。
转自:http://www.cppblog.com/besterChen/archive/2009/03/31/78434.html
大家明白了怎么定义变量,怎么给变量赋值了,自然的就应该进一步了解一下一些详细的代码怎么编写了。
今天我们的任务比较简单,就讲一下如何编写代码及实现代码的流程控制。应该说这个是非常简单的东西了,本来我没打算讲它,可是本着一步一个脚印的原则,我还是简要的说一下。在本次课题之后,我会紧跟着出一个函数的专题,来作为代码篇的完善,至此大家应该能独立的写自己的程序了。
本次课题知识点不是很多(也不少,但是都很简单。),主要是在于多写,多练,知道自己能把一些现实的问题转换成代码来解决问题。
不多废话,先说下本次课题要写的主要内容:
程序的运算和逻辑判断
三种程序流程控制结构详解。
养成良好的代码编写风格。
结束语
下面开始进入正题。
一、 程序的运算和逻辑判断。
说计算是电脑最基本的功能,相必没有人会反对的。做程序,自然最基础的就是这些运算了。
我知道,看这个破烂文章的朋友对数据应该都是不感冒的。不过大家放心,这里牵扯的运算都很简单,就是小学的加、减、成、除、取余数,是、非、与或和位移,没别的了。先让我们来了解下算术运算。
1. 算术运算。
加减乘除相比大家都应该很了解的。这里我不想费太多的篇幅讲述这些大家都明白的知识,我把要说的知识列出来,大家自己了解就好。
用于算术运算的运算符有:
我想不用我说,加、减、成、除这些运算符大家都接触过的,关于“%”运算符,其实就是取余数;用这些运算符可以将一些数字,变量等连接起来,进行运算,这样的式子叫做表达式。例如:
int i =5;
i +7; // 这里就是一个表达式。
“=”这个运算符其实不属于算术运算,它也并非是我们数学课上讲的“等于”,而是一个“赋值”运算符,它用来将一个常量(数字、字母等)赋值给一个变量的赋值运算符,由于我们进行算术运算以后,通常都会将运算结果保存到一个变量中,所以,我把这个赋值运算符归类到这里。而我们日常的“等于”运算符是:“= =”,它属于逻辑运算符,我们将在下一节中讲到它。
关于“++ 、 — —”这两个运算符,上图中已经说明了,它是对变量的对自己的自加或者自减运算,等同于:变量 = 变量+1; 或者 变量 = 变量 — 1;
现在让我们来举几个例子,来说明下这些算术运算符的用法。
void main()
{
int x = 1;
int y = 2;
int z = 20;
x ++; // 等同于x = x + 1;
y --; // 等同于y = y - 1;
z /= x; // 等同于z = z / 1;
printf("%d, %d, %d\n", x, y, z); // 打印 x,y,z 的结果。
z %= x; // 计算得出 z / x 以后的余数
x = x+y;
z -= x;
printf("%d, %d, %d\n", x, y, z); // 打印 x,y,z 的结果。
}
请先不要看下面的截图,先看下这个程序,分析一下,这两次的输出结果会是多少,然后对比下图:
看下就算的是不是正确,如果正确了,那恭喜你,基础的算术运算就算通过了,接下来,我们需要调试这段代码,来熟悉一些相关的汇编命令,具体操作如下图所示:
在代码上右击鼠标,选择如下命令:
我们来详细分析一下我们现在看到的代码:
1: #include "stdio.h"
2:
3: void main()
4: {
00401010 push ebp
00401011 mov ebp,esp ;// 将现有的堆栈给了EBP寄存器。
00401013 sub esp,4Ch ;// 分配x4C大小的堆栈空间用来运算。
00401016 push ebx
00401017 push esi
00401018 push edi ;// 保存寄存器环境。
00401019 lea edi,[ebp-4Ch] ;// 这里用ebp寄存器减去一个偏移来定位我们定义的变量,
0040101C mov ecx,13h ;// 这里-4Ch是用来定位到堆栈头,把堆栈内容改成int3中断以免内存泄露。
00401021 mov eax,0CCCCCCCCh ;// 以上操作是保存堆栈环境,分配堆栈空间。
00401026 rep stos dword ptr [edi] ;// 在下一次课题讲述函数时,我们会讲到,这里大家可以略过。
5: int x = 1;
00401028 mov dword ptr [ebp-4],1;// [ebp-4]是我们的变量x,dword ptr是用来修饰这个变量是DWORD类型(也就是整型)。
6: int y = 2;
0040102F mov dword ptr [ebp-8],2;// MOV就是汇编指令,相当于我们C语言中"=" 赋值运算符,它的具体用法自己百度。
7: int z = 20;
00401036 mov dword ptr [ebp-0Ch],14h
8:
9: x ++; // 等同于x = x + 1;
0040103D mov eax,dword ptr [ebp-4]
00401040 add eax,1; // add指令就是我们C语言的"+"运算符,还有一个INC指令相当于我们的"++"运算符
00401043 mov dword ptr [ebp-4],eax
10: y --; // 等同于y = y - 1;
00401046 mov ecx,dword ptr [ebp-8]
00401049 sub ecx,1
0040104C mov dword ptr [ebp-8],ecx
11:
12: z /= x; // 等同于z = z / 1;
0040104F mov eax,dword ptr [ebp-0Ch]
00401052 cdq
00401053 idiv eax,dword ptr [ebp-4]
00401056 mov dword ptr [ebp-0Ch],eax
13: printf("%d, %d, %d\n", x, y, z);
00401059 mov edx,dword ptr [ebp-0Ch]
0040105C push edx
0040105D mov eax,dword ptr [ebp-8]
00401060 push eax
00401061 mov ecx,dword ptr [ebp-4]
00401064 push ecx
00401065 push offset string "%d, %d, %d\n" (0042001c) // 传递参数,具体规则将在下次课题“函数”中讲述。
0040106A call printf (004010f0) ; // 调用printf函数打印结果
0040106F add esp,10h ; // 这里是C条用的对战平衡方式。(具体将在下次课题“函数”中讲述)
14:
15: z %= x;
00401072 mov eax,dword ptr [ebp-0Ch]
00401075 cdq
00401076 idiv eax,dword ptr [ebp-4]
00401079 mov dword ptr [ebp-0Ch],edx
16:
17: x = x+y;
0040107C mov edx,dword ptr [ebp-4]
0040107F add edx,dword ptr [ebp-8]
00401082 mov dword ptr [ebp-4],edx
18: z -= x;
00401085 mov eax,dword ptr [ebp-0Ch]
00401088 sub eax,dword ptr [ebp-4]
0040108B mov dword ptr [ebp-0Ch],eax
19: printf("%d, %d, %d\n", x, y, z);
0040108E mov ecx,dword ptr [ebp-0Ch]
00401091 push ecx
00401092 mov edx,dword ptr [ebp-8]
00401095 push edx
00401096 mov eax,dword ptr [ebp-4]
00401099 push eax
0040109A push offset string "%d, %d, %d\n" (0042001c)
0040109F call printf (004010f0)
004010A4 add esp,10h
20: }
004010A7 pop edi ; // 恢复寄存器环境
004010A8 pop esi
004010A9 pop ebx
004010AA add esp,4Ch ; // 平衡堆栈
004010AD cmp ebp,esp
004010AF call __chkesp (00401170) ; // DEBUG 模式程序专用的堆栈检查函数。
004010B4 mov esp,ebp
004010B6 pop ebp
004010B7 ret
相信你根据上述代码中的提示,应该能将这个汇编代码看的差不多,当然,看不明白也没有关系,我们需要掌握的汇编指令及其用法很少,就下面几个:
mov/lea: 赋值/取地址。
add: 加法指令。
sub: 减法指令。
div/idiv: 除法指令。
mul/imul: 乘法指令。
这些汇编指令的具体用法大家自己百度或者参考相关资料,这里不做详细说明, 下面开始我们的逻辑、关系运算。
转自:http://www.cppblog.com/besterChen/archive/2009/03/31/78434.html
相关文章推荐
- 笨鸟先飞学编程系列之二 基础代码的编写
- 笨鸟先飞学编程系列之二 基础代码的编写2(转)
- 笨鸟先飞学编程系列之二 基础代码的编写3(转)
- 【GPU编程系列之二】CUDA编程基础
- 【Cocos2d-X(2.x) 游戏开发系列之二】cocos2dx最新2.0.1版本跨平台整合NDK+Xcode,Xcode编写&编译代码,Android导入打包运行即可!
- 关于安全编写代码的一些注意事项[参照msdn],这些在编程基础中都已经相当重要了!
- 【基础编程】HDOJ2045不容易系列之(3)—— LELE的RPG难题
- 编写高质量代码:改善JavaScript程序建议--函数式编程
- linux高级编程基础系列:线程间通信
- Java语言基础系列之1--用IDEA编写HelloWorld
- socket编程基础-原理和代码
- socket编程基础-原理和代码
- 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点
- 《Python学习手册》学习笔记(26)之第26章类代码编写基础(关键词:编程语言/Python/OOP/面向对象/类)
- 编写代码的基础
- flex系列文章:第二章. Flex2 基础编程模式
- 黑马程序员java基础网络编程必须掌握的经典代码
- 轻松学习JavaScript十九:DOM编程之在HTML文档什么位置编写JS代码
- python入门-----有编程基础,直接写代码
- 敏捷开发用户故事系列之二:如何面向客户价值编写故事