中国人民大学《汇编程序设计》课件-01绪论_第1页
中国人民大学《汇编程序设计》课件-01绪论_第2页
中国人民大学《汇编程序设计》课件-01绪论_第3页
中国人民大学《汇编程序设计》课件-01绪论_第4页
中国人民大学《汇编程序设计》课件-01绪论_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1绪论授课教师:游伟、黄建军1程序设计II荣誉课程本章内容1.1面向对象程序设计概述1.2C++语言概述1.3程序编译与执行概述1.4汇编基础21.1面向对象程序设计概述引子:500个小孩围成一圈,从第一个小孩开始计数,逢3出圈(即被3整除,如6、27、468),最后留在圈内的孩子是第几个?3面向过程的结构化程序设计方法设计思路自顶向下、逐步求精采用模块分解与功能抽象,分而治之程序结构按功能划分为若干个基本模块,形成一个树状结构各模块间的关系尽可能简单,功能上相对独立模块内部由顺序、选择和循环三种基本结构组成其模块化实现的具体方法是使用子程序4面向过程的结构化程序模式……全局变量:gvar1gvar2gvar3

……Main()函数:Sub1()Sub3_2()Sub3_1()Sub1_1()Sub2()Sub3()局部变量:lvar1lvar2程序=数据结构+算法=变量+函数5面向对象的程序设计方法将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体——对象对同类型对象抽象出其共性,形成类类通过一个简单的外部接口,与外界发生关系对象与对象之间通过消息进行通信一类事物抽象共同属性

数据结构行为

函数封装classDataFunction实例化DataFunctionobject6面向对象的程序模式class1var1Sub1()Sub1_1()class2var2Sub2()class3var3Sub3()Sub3_1()Sub3_2()Main()对象=数据结构+算法程序=(对象+对象+…+对象)+消息7面向过程v.s.对象8面向过程优点:有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。缺点:可重用性差、数据安全性差、难以开发大型软件和图形界面的应用软件把数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程都要进行相应的修改。每一种相对于老问题的新方法都要带来额外的开销。图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难面向对象优点:程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便缺点:性能比面向过程低面向对象程序设计的基本概念

——对象一般意义上的对象:现实世界中一个实际存在的(有形或无形的)事物,是构成世界的一个独立单位。具有静态特征和动态特征。静态特征:可以用某种数据来描述动态特征:对象所表现的行为或具有的功能面向对象方法中的对象:是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。属性:用来描述对象静态特征的数据项行为:用来描述对象动态特征的操作序列9面向对象程序设计的基本概念

——类分类是人类通常的思维方法,所依据的原则是抽象只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活实践中抽象出的概念面向对象方法中的"类"具有相同属性和行为的一组对象的集合为属于该类的全部对象提供了抽象的描述,包括属性和行为两个主要部分类与对象的关系:犹如模具与铸件之间的关系,一个属于某类的对象称为该类的一个实例10面向对象程序设计的三大特性

——封装性定义:把对象的属性和行为组成一个独立的系统单元例如:将与教师相关的属性(姓名、年龄、职称等)和行为(开课、立项)封装成一个Teacher类意义:尽可能隐蔽对象的内部细节,对外形成一个边界(或者说一道屏障),只保留有限的对外接口使之与外部发生联系11面向对象程序设计的三大特性

——继承性定义:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。例如:将轮船作为一个一般类,客轮便是一个特殊类意义:实现软件复用,是面向对象技术能够提高软件开发效率的重要原因之一12面向对象程序设计的三大特性

——多态性定义:在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为例如:数的加法->实数的加法

->复数的加法意义:使得同一个属性或行为在一般类及其各个特殊类中具有不同的语义131.2C++语言概述14早期程序设计语言的历史1967年,

剑桥大学的Martin

Richards对CPL语言进行了简化,

产生了BCPL语言

1967

年,

Ole-

Johan

Dahl

Kristen

Nygaard,

发布Simula

671995年,Sun

公司发布JAVA语言1970年,

美国BellLabs的KenThompson将BCPL进行了修改,命名为B语言

1971年,

Xerox

的Alan

Kay

发明

Smalltalk2003年,微软公司发布了C#语言1960年,

算法描述语言ALGOL

60诞生(C语言的原型)

1963年,

剑桥

大学在ALGOL

的基础上发展

了CPL语言1973年,

AT&T的DennisRitchie设计出了一种新的语言,

C语言

1983年,

AT&T

实验室

Bjarne

Stroustrup发

明C++语言C语言发展历程面向对象程序设计语言的发展历程15C++的产生C++最早可追溯到1979年,B.S.做博士论文时,发现被认为是第一个支持面向对象程序设计(OOP)方法的Simula语言可用但现实中太慢B.S.创建了一个C语言的超集,称为“CwithClasses”,在C语言中增加OOP的支持,该语言支持class、基本的继承、默认函数参数等特征1983年,该语言被正式称为C++,增加的新特性包括虚函数、函数重载、“&”引用、单行注释(“//”,源于BCPL语言)等1985年,B.S.出版了TheC++ProgrammingLanguage,同年,C++被实现为商业化产品1989年,增加了protected与static成员、多父类继承1990年,BorlandTurboC++编译器发布,引入了大量的额外的库1998年,C++国际标准C++98发布2003标准委员会年对发现的问题做了修改,新版本别名C++032005年,标准委员会发布技术报告,详列其准备加入C++标准的特性(C++0x)2011年,C++标准C++11完成,Boost库在其中影响甚大2014年,C++标准C++14完成,引入二进制字面量、泛型(多态)lambda表达式2017年,C++标准C++17完成,引入std::byte、std::any、std::optional类型2020年,C++标准C++20完成,引入更多与lambda表达式相关的特性16C++语言的特点既兼容C它保持了C的简洁、高效和接近汇编语言等特点对C的类型系统进行了改革和扩充也支持面向对象类和对象模板和模板库17C++程序示例#include<iostream>usingnamespacestd;intmain(){ cout<<"Hello!"<<endl; cout<<"Welcometoc++!"<<endl; return0;}运行结果:Hello!Welcometoc++!18(1)标准C++规定main函数必须声明为int类型,如果程序正常运行,向操作系统返回一个零值,否则返回非零值,通常是-1。(2)C++程序中可以用/*…*/做注释,可以用//做注释。前者可以做多行注释,后者只做单行注释。(3)C++程序中常用cout、cin进行输出输入,cout是C++定义的输出流对象,<<是插入运算符。(4)使用cout、cin需要用头文件iostream,在程序开始要用#include声明包含的头文件。(5)usingnamespacestd;意思是使用命名空间。C++标准库中的类和函数是在命名空间std中声明的,因此程序中如用C++标准库中的有关内容(此时需要用#include命令行),就要用usingnamespacestd;语句声明19C++字符集大小写的英文字母:A~Z,a~z数字字符:0~9特殊字符:

! # % ^ & * _ + = - ~ < > / \ ‘ “ ; . , : ? ( ) [ ] { }20词法记号关键字 C++预定义的单词,如int、float、if、else、while、switch等等。标识符

程序员声明的单词,它命名程序正文中的一些实体,包括函数名、类名、对象名、类型名、变量名、常变量名、数组名等。文字 在程序中直接使用符号表示的数据操作符 用于实现各种运算的符号分隔符(){},:;

用于分隔各个词法记号或程序正文空白符 空格、制表符(TAB键产生的字符)、垂直制表符、换行符、回车符和注释的总称21标识符的构成规则以大写字母、小写字母或下划线(_)开始可以由以大写字母、小写字母、下划线(_)或数字0~9组成标识符区分大小写字母,大写字母和小写字母代表不同的标识符22C++能够处理的基本数据类型整数类型浮点数类型字符类型布尔类型程序中的数据常量在源程序中直接写明的数据,其值在整个程序运行期间不可改变,这样的数据称为常量。变量在程序运行过程中允许改变的数据,称为变量。23基本数据类型2.2基本数据类型和表达式整数类型基本的整数类型

int按符号分符号的(signed)和无符号的(unsigned)按照数据范围分

短整数(short)和长整数(long)char类型字符型,实质上存储的也是整数(详见字符类型)24基本数据类型2.2基本数据类型和表达式浮点数类型单精度(可以保存7位有效数字)float双精度(可以保存15位有效数字)double扩展精度longdouble25基本数据类型2.2基本数据类型和表达式字符类型char类型容纳单个字符的编码字符串类型(详见第6章)C风格的字符串采用字符数组C++风格的字符串采用标准C++类库中的String类布尔类型bool类型,只有两个值:true(真)

、false(假)常用来表示关系比较、相等比较或逻辑运算的结果26基本数据类型2.2基本数据类型和表达式27基本数据类型

2.2基本数据类型和表达式类型名长度(字节)取值范围bool1false,truechar1-128~127signedchar1-128~127unsignedchar10~255short(signedshort)2-32768~32767unsignedshort20~65535int(signedint)4-2147483648~2147483647unsignedint40~4294967295long(signedlong)4-2147483648~2147483647unsignedlong40~4294967295float4+3.4E+38double8+1.7E+308longdouble8+1.7E+308所谓常量是指在程序运行的整个过程中其值始终不可改变的量,也就是直接使用符号(文字)表示的值。例如:12,3.5,’A’都是常量。28常量2.2基本数据类型和表达式以文字形式出现的整数,包括正整数、负整数和零。十进制整数

[±]若干个0~9的数字,但数字部分不能以0开头,正数前边的正号可以省略。八进制整数

[±]0若干个0~7的数字,注意数字部分要以数字0开头十六进制整数[±]0x若干个0~9的数字及A~F的字母(大小写均可),注意数字部分要以0x开头后缀L(或l)表示长整型;U(或u)表示无符号型。也可同时后缀L和U(大小写无关)。29整数常量以文字形式出现的实数。一般形式:例如,12.5,-12.5等。指数形式:例如,0.345E+2,-34.4E-3字母E可以大写或小写。整数部分和小数部分可以省略其一实数常量默认为double型,如果后缀F(或f)可以使其成为float型,例如:12.3f。30浮点数常量2.2基本数据类型和表达式表达式——2.2.2常量字符常量单引号括起来的一个字符,

如:'a','D','?','$‘C++转义字符列表(用于在程序中表示不可显示字符)31字符常量2.2基本数据类型和表达式——2.2.2常量字符常量形式ASCII码(十六进制)含义\a07响铃\n0A换行\t09水平制表符\v0B垂直制表符\b08退格\r0D回车\v0C换页\\5C字符“\”\”22双引号\’27单引号符号常量在声明时一定要赋初值,而在程序中间不能改变其值。const数据类型说明符

常量名=常量值;或:数据类型说明符

const常量名=常量值;例:

constfloatPI=3.1415926;(C语言中的相同功能:#definePI3.1415926)32符号常量2.2基本数据类型和表达式变量的声明和定义声明语句形式如下:数据类型

变量名1,变量名2,...,变量名n;在定义一个变量的同时,也可以给它赋以初值例如:

inta=3;变量的存储类型auto:采用堆栈方式分配内存空间属于暂时性存储,其存储空间可以被若干变量多次覆盖使用。register:存放在通用寄存器中。extern:在所有函数和程序段中都可引用。static:在内存中是以固定地址存放的,在整个程序运行期间都有效。33变量2.2基本数据类型和表达式虽然变量的值是可以在运行时获得的,但是在定义变量时也可以进行初始化,而且应该提倡进行初始化未经初始化的变量,其值可能是随机的。如果误用了未经初始化也没有给予确定值的变量,就会引起错误34变量的初始化基本算术运算符

+-*/(若整数相除,结果取整)%(取余,操作数为整数)优先级与结合性先乘除,后加减,同级自左至右++,--(自增、自减)例:i++;--j;35算术运算符与算术表达式算术运算符+、-、*、/的含义及运算次序与数学中是一样的,但是要注意两个整数相除时,结果是取整,小数部分会被截掉。%运算符的作用是两数相除,取余数作为结果。++、--运算符实现变量值增加1和减小1的功能。后置的情况是先使用变量的值,然后增1或减1;前置的情况是变量先增加1或减小1之后,再参与其他运算。36算术运算符的使用和相关注意事项#include<iostream>usingnamespacestd;intmain(){intval1=24;intval2=5;doubleval3=24;doubleval4=5;cout<<“int/int,24/5=”<<val1/val2<<endl;cout<<“int/int,24%5=”<<val1%val2<<endl;val2=-5;cout<<“int/int,24%(-5)=”<<val1%val2<<endl;cout<<“double/double,24/5=”<<val3/val4<<endl;37算术运算示例//cout<<“double/double,24%5=”<<val3%val4<<endl;cout<<“double/int,24/5=”<<val3/val2<<endl;cout<<“int/double,24/5=”<<val1/val4<<endl;val1=5;cout<<

“val1=”<<val1<<endl;cout<<val1++<<

“,”;cout<<++val1<<”,”

;cout<<val1--<<”,”

;cout<<--val1<<endl

;val1=5;cout<<

“val1=”<<val1<<endl;

cout<<

val1++<<”,”<<++val1<<”,”<<val1--<<”,”<<--val1<<endl;//不同的编译器求值顺序可能不同}38算术运算示例提示与思考:求余运算(%)只能用于整数。两个整数相除的结果只取整数。最后一句的输出结果4,5,4,5,这是为什么呢?我们期望的输出结果,似乎应是:5,7,7,5这是运行顺序问题,按照从右向左的顺序计算各输出项的值,然后按照从左向右的顺序进行输出。因此,在本例中,首先计算的是--val1,而不是val1++。于是出现了最后的输出结果。39算术运算示例举例

n=n+5表达式的类型:

赋值运算符左边对象的类型表达式的值:

赋值运算符左边对象被赋值后的值40赋值运算符和赋值表达式

——简单的赋值运算符"="2.2基本数据类型和表达式——2.2.5运算符与表达式有10种复合运算符:

+=,-=,*=,/=,%=,

<<=,>>=,&=,^=,|=例

a

+=

3

等价于a=a

+3

x*=

y+8等价于x=x

*(y+8)41赋值运算符和赋值表达式

——复合的赋值运算符2.2基本数据类型和表达式——2.2.5运算符与表达式C++没有赋值语句,将赋值作为一个运算赋值运算符将右边操作数的值赋给左边的操作数整个赋值表达式的值就是被赋给左边变量的值42赋值运算的注意事项#include<iostream>usingnamespacestd;intmain(){intival1,ival2;doublefval;charcval;

ival1=1;ival2=2;cout<<"ival1="<<ival1<<endl;cout<<"ival2="<<ival2<<endl;

ival1=ival2=0;ival1=fval=0;ival1=cval='a‘;

43赋值运算的应用示例 cout<<"ival1="<<ival1<<endl;cout<<"ival2="<<ival2<<endl;cout<<"fval="<<fval<<endl;cout<<"cval="<<cval<<endl;

intival3=fval=8;cout<<"ival3="<<ival3<<endl;cout<<"fval="<<fval<<endl;cout<<

“ival1=”<<ival1<<”,ival2=”<<ival2<<endl;ival2=-ival1++

;cout<<”ival2=-ival1++,ival1=”<<ival1<<

“,ival2=”<<ival2<<endl;ival1=++ival2+ival1;cout<<”ival1=++ival2+ival1,ival1=”<<ival1<<endl;return0;}44赋值运算的应用示例运行结果:ival1=1ival2=2ival1=97ival2=0fval=0cval=aival3=8fval=8ival1=97,ival2=0ival2=-ival1++,ival1=98,ival2=-97ival1=++ival2+ival1,ival1=245赋值运算的应用示例提示与思考:由于“-”,即负运算符的运算优先级高于后置“++”运算符,而且赋值运算符“=”的优先级也比后置运算符“++”高,因此val2=-val1++;的运算顺序是:首先将val1变量的值的相反数赋给val2,然后val1实现自增运算。前置运算符“++”的优先级比“+”和“=”都高,因此,语句val1=++val2+val1;首先实现变量val2的自增运算,然后实现加法运算,最后才进行赋值。46赋值运算的应用示例格式表达式1,表达式2求解顺序及结果先求解1,再求解2,最终结果为表达式2的值例a=3*5,a*4

最终结果为6047逗号运算和逗号表达式关系运算是比较简单的一种逻辑运算,优先次序为:

<<=>>===!=

优先级相同(高)优先级相同(低)关系表达式是一种最简单的逻辑表达式其结果类型为bool,值只能为true

或false。例如:a>

b,c<=

a+b,x+y==

348关系运算与关系表达式2.2基本数据类型和表达式——2.2.5运算符与表达式逻辑运算符

!(非)&&(与)||(或)

优先次序:高→低逻辑表达式

例如:(a>

b)&&

(x>y)

其结果类型为bool,值只能为true或false49逻辑运算与逻辑表达式2.2基本数据类型和表达式——2.2.5运算符与表达式“&&”的“短路特性”表达式1&&表达式2先求解表达式1若表达式1的值为false,则最终结果为false,不再求解表达式2若表达式1的结果为true,则求解表达式2,以表达式2的结果作为最终结果“||”也具有类似的特性例:(a==b)||(++c==1)50逻辑运算与逻辑表达式2.2基本数据类型和表达式——2.2.5运算符与表达式一般形式表达式1?表达式2:表达式3表达式1必须是bool类型执行顺序先求解表达式1,若表达式1的值为true,则求解表达式2,表达式2的值为最终结果若表达式1的值为false,则求解表达式3,表达式3的值为最终结果例:x=a>b?a:b;51条件运算符与条件表达式2.2基本数据类型和表达式——2.2.5运算符与表达式注意:条件运算符优先级高于赋值运算符,低于逻辑运算符表达式2、3的类型可以不同,条件表达式的最终类型为2和3中较高的类型。例:x=

a>

b?a:b;52条件运算符与条件表达式2.2基本数据类型和表达式——2.2.5运算符与表达式①②主要知识点:关系运算、相等运算、逻辑运算关系运算、相等比较运算、逻辑运算的结果都是bool类型;关系运算用于比较数据之间的大小关系;相等比较运算比较两个数据相等与否;逻辑运算可以将多个关系表达式和相等表达式组合起来,构成复杂的逻辑判断。53比较数据并输出结果#include<iostream>usingnamespacestd;intmain(){intival1=1,ival2=2,ival3=3,ival4=4;boolnFlag;nFlag=ival1==ival2?true:false;cout<<”Is1equals2?:”<<nFlag<<endl;nFlag=ival1<ival2?true:false;cout<<”Is1lessthan2?:”<<nFlag<<endl;nFlag=(ival1<ival2&&ival3<ival4)?true:false;cout<<”Is1lessthan2and3lessthan4:”<<nFlag<<endl;}//跟踪观察运行情况54比较数据并输出结果语法形式

sizeof(类型名)

或sizeof表达式结果值:

“类型名”所指定的类型或“表达式”的结果类型所占的字节数。例:sizeof(short)sizeof

x55sizeof运算符主要知识点:sizeof运算对于C++标准中没有具体规定字节数的数据类型,以及自定义的复杂数据类型,如果需要在程序中知道其字节数,最简单、准确的办法就是使用sizeof运算。56sizeof运算符的应用#include<iostream>#include<iostream>#include<string>usingnamespacestd;intmain(){cout<<“sizeof(short)=”<<sizeof(short)<<endl;cout<<"sizeof(unsignedshort)="<<sizeof(unsignedshort)<<endl;cout<<“sizeof(int)=”<<sizeof(int)<<endl;cout<<"sizeof(unsignedint)="<<sizeof(unsignedint)<<endl;cout<<“sizeof(long)=”<<sizeof(long)<<endl;57sizeof运算符的应用示例cout<<"sizeof(unsignedlong)="<<sizeof(unsignedlong)<<endl;cout<<"sizeof(float)="<<sizeof(float)<<endl;cout<<“sizeof(double)=”<<sizeof(double)<<endl;cout<<"sizeof(longdouble)="<<sizeof(longdouble)<<endl;cout<<"sizeof(char)="<<sizeof(char)<<endl;return0;}58sizeof运算符的应用示例运行结果:sizeof(short)=2sizeof(unsignedshort)=2sizeof(int)=4sizeof(unsignedint)=4sizeof(long)=4sizeof(unsignedlong)=4sizeof(float)=4sizeof(double)=8sizeof(longdouble)=8sizeof(char)=159sizeof运算符的应用示例运算规则将两个运算量的每一个位进行逻辑与操作举例:计算3&53:000000115:(&)000001013&5:00000001用途:将某一位置0,其他位不变。例如:

将char型变量a的最低位置0:a=a&0xfe;取指定位。

例如:有charc;inta;

取出a的低字节,置于c中:c=a&0xff;60位运算——按位与(&)2.2基本数据类型和表达式——2.2.5运算符与表达式运算规则将两个运算量的每一个位进行逻辑或操作举例:计算3|53:000000115:(|)000001013|5:00000111用途:将某些位置1,其他位不变。

例如:将int型变量a

的低字节置

1:

a=a|0xff;61位运算——按位或(|)2.2基本数据类型和表达式——2.2.5运算符与表达式运算规则两个操作数进行异或:

若对应位相同,则结果该位为0,

若对应位不同,则结果该位为1,举例:计算071^052071:00111001052:(^)00101010071^052:0001001162位运算——按位异或(^)2.2基本数据类型和表达式——2.2.5运算符与表达式用途:使特定位翻转(与0异或保持原值,与1异或取反)例如:要使01111010低四位翻转:

01111010(^) 00001111 0111010163位运算——按位异或(^)(续)单目运算符,对一个二进制数按位取反。例:025:0000000000010101~025:111111111110101064位运算——取反(~)2.2基本数据类型和表达式——2.2.5运算符与表达式左移运算(<<)左移后,低位补0,高位舍弃。右移运算(>>)右移后,低位:舍弃高位:无符号数:补0

有符号数:补“符号位”65位运算——移位2.2基本数据类型和表达式——2.2.5运算符与表达式#include<iostream>#include<bitset>usingnamespacestd;voidmain(){cout<<“~15=”<<(~15)<<endl;cout<<“15&21=”<<(15&21)<<endl;cout<<“15^21=”<<(15^21)<<endl;cout<<“15|21=”<<(15|21)<<endl;unsignedintnTest=9;cout<<”nTest=”<<nTest<<endl;nTest|=1<<4;//将第4位置为1cout<<”Aftersettheposition4to1,nTest=”<<nTest<<endl;66位运算符的应用示例nTest&=~(1<<4);//将第4位置0cout<<”Aftersettheposition4to0,nTest=”<<nTest<<endl;boolnFlag;for(inti=0;i<16;i++){//实现翻转 nFlag=nTest&(1<<i); if(nFlag){ nTest&=~(1<<i); } else{ nTest|=1<<i; }} cout<<"Afterflip,nTest="<<nTest<<endl;}67位运算符的应用示例运行结果:~15=-1615&21=515^21=2615|21=31nTest=9Aftersettheposition4to1,nTest=25Aftersettheposition4to0,nTest=9Afterflip,nTest=6552668位运算符的应用示例提示语思考:将本例中参与运算的数据,及运算结果数据都转换为二进制形式,观察、理解位运算的运算规则和效果。使用按位与操作可以将操作数中的若干位置0(其他位不变),或者取操作数中的若干指定位。使用按位或操作可以将操作数中的若干位置1,(其他位不变)。使用按位异或操作可以将操作数中的若干指定位翻转。69位运算符的应用示例()++,--,sizeof,!*,/,%+,-==,!=位运算&&||?:赋值运算逗号运算70运算符优先级2.2基本数据类型和表达式——2.2.5运算符与表达式低高一些二元运算符(算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符)要求两个操作数的类型一致。在算术运算和关系运算中如果参与运算的操作数类型不一致,编译系统会自动对数据进行转换(即隐含转换),基本原则是将低类型数据转换为高类型数据。

char,short,int,unsigned,long,unsignedlong,float,double

低高71混合运算时数据类型的转换

——隐含转换2.2基本数据类型和表达式——2.2.5运算符与表达式当参与运算的操作数必须是bool型时,如果操作数是其它类型,编译系统会自动将非0数据转换为true,0转换为false。位运算的操作数必须是整数,当二元位运算的操作数是不同类型的整数时,也会自动进行类型转换,赋值运算要求左值与右值的类型相同,若类型不同,编译系统会自动将右值转换为左值的类型。72混合运算时数据类型的转换

——隐含转换(续)语法形式(3种):类型说明符(表达式)(类型说明符)表达式类型转换操作符<类型说明符>(表达式)类型转换操作符可以是:

const_cast、dynamic_cast、reinterpret_cast、static_cast显式类型转换的作用是将表达式的结果类型转换为类型说明符所指定的类型。例:int(z),(int)z,static_cast<int>(z)三种完全等价73混合运算时数据类型的转换

——显式转换2.2基本数据类型和表达式——2.2.5运算符与表达式C++中的语句有如下种类空语句只有一个语句结束符“;”声明语句例如:变量声明表达式语句在表达式末尾添加语句结束符便构成表达式语句例如:a=3;流程控制语句(详见2.4节)选择语句、循环语句、跳转语句标号语句在语句前附加标号,通常用来与跳转语句配合

复合语句用“{}”括起来的多条语句74语句2.2基本数据类型和表达式在C++中,将数据从一个对象到另一个对象的流动抽象为“流”。流在使用前要被建立,使用后要被删除。从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作。数据的输入与输出是通过I/O流来实现的,cin和cout是预定义的流类对象。cin用来处理标准输入,即键盘输入。cout用来处理标准输出,即屏幕输出。75I/O流2.3数据的输入和输出“<<”是预定义的插入符,作用在流类对象cout上便可以实现最一般的屏幕输出。cout<<表达式<<表达式...键盘输入是将提取符作用在流类对象cin上。cin>>表达式

>>表达式...在输入语句中,提取符可以连续写多个,每个后面跟一个表达式,该表达式通常是用于存放输入值的变量。例如:inta,b;cin>>a>>b;76预定义的插入符和提取符2.3数据的输入和输出操纵符名含

义dec数值数据采用十进制表示hex数值数据采用十六进制表示oct数值数据采用八进制表示ws提取空白符endl插入换行符,并刷新流ends插入空字符setsprecision(int)设置浮点数的小数位数(包括小数点)setw(int)设置域宽77简单的I/O格式控制2.3数据的输入和输出常用的I/O流类库操纵符例:cout<<setw(5)<<setprecision(3)<<3.1415;if(表达式)语句例:if(x>y)cout<<x;if(表达式)语句1else语句2例:if(x>y)cout<<x;elsecout<<y;if(表达式1)语句1

elseif(表达式2)语句2

elseif(表达式3)语句3

else语句n78If语句的语法形式2.4算法的基本控制结构——2.4.1用if语句实现选择结构语法形式if()if()语句1else语句2elseif()语句3else语句4注意语句1、2、3、4可以是复合语句,每层的if与else配对,或用{}来确定层次关系。79嵌套的if结构2.4算法的基本控制结构——2.4.2多重选择结构80switch语句2.4算法的基本控制结构——2.4.2多重选择结构一般形式switch(表达式){case常量表达式1:语句1case常量表达式2:语句2┆case常量表达式n:语句ndefault:语句n+1}执行顺序以case中的常量表达式值为入口标号,由此开始顺序执行。因此,每个case分支最后应该加break语句。case分支可包含多个语句,且不用{}。表达式、判断值都是int型或char型。若干分支执行内容相同可共用一组语句。81switch语句2.4算法的基本控制结构——2.4.2多重选择结构82while语句(续)2.4算法的基本控制结构——2.4.3循环结构形式while(表达式)语句

可以是复合语句,其中必须含有改变条件表达式值的语句。执行顺序先判断表达式的值,若为true时,执行语句。83do-while语句2.4算法的基本控制结构——2.4.3循环结构一般形式do语句while(表达式)可以是复合语句,其中必须含有改变条件表达式值的语句。执行顺序先执行循环体语句,后判断条件。

表达式为true时,继续执行循环体与while语句的比较:while语句执行顺序

先判断表达式的值,为true时,再执行语句84对比下面的程序2.4算法的基本控制结构——2.4.3循环结构程序1:#include<iostream>usingnamespacestd;intmain(){inti,sum=0;cin>>i;while(i<=10){sum+=i;i++;}cout<<"sum="<<sum<<endl;return0;}程序2:#include<iostream>usingnamespacestd;intmain(){inti,sum=0;cin>>i;do{sum+=i;i++;}while(i<=10);

cout<<"sum="<<sum<<endl;return0;}85for语句2.4算法的基本控制结构——2.4.3循环结构语法形式for(初始语句;表达式1;表达式2)语句

循环前先求解为true时执行循环体每次执行完循环体后求解break语句使程序从循环体和switch语句内跳出,继续执行逻辑上的下一条语句。不宜用在别处。continue语句结束本次循环,接着判断是否执行下一次循环。goto语句goto语句的作用是使程序的执行流程跳转到语句标号所指定的语句。86其他控制语句2.4算法的基本控制结构只要将需要的变量值一一列举出来,便构成了一个枚举类型。枚举类型的声明形式如下:enum枚举类型名{变量值列表};例如:enumWeekday{SUN,MON,TUE,WED,THU,FRI,SAT};87枚举类型2.5枚举类型对枚举元素按常量处理,不能对它们赋值。例如,不能写:SUN=0;枚举元素具有默认值,它们依次为:0,1,2,......。也可以在声明时另行指定枚举元素的值,如:enumWeekday{SUN=7,MON=1,TUE,WED,THU,FRI,SAT};枚举值可以进行关系运算。整数值不能直接赋给枚举变量,如需要将整数赋值给枚举变量,应进行强制类型转换。Weekdayday=(Weekday)1000;88枚举类型应用说明2.5枚举类型设某次体育比赛的结果有四种可能:胜(WIN)、负(LOSE)、平局(TIE)、比赛取消(CANCEL),编写程序顺序输出这四种情况。分析:由于比赛结果只有四种可能,所以可以声明一个枚举类型,声明一个枚举类型的变量来存放比赛结果。89枚举类型应用示例2.5枚举类型#include<iostream>usingnamespacestd;enumGameResult{WIN,LOSE,TIE,CANCEL};intmain(){ GameResultresult; enumGameResultomit=CANCEL; for(intcount=WIN;count<=CANCEL;count++){ result=GameResult(count); if(result==omit) cout<<"Thegamewascancelled"<<endl; else{ cout<<"Thegamewasplayed"; if(result==WIN) cout<<"andwewon!"; if(result==LOSE) cout<<"andwelost."; cout<<endl; } } return0;}902.5枚举类型枚举类型应用示例运行结果

Thegamewasplayedandwewon!Thegamewasplayedandwelost.ThegamewasplayedThegamewascancelled91枚举类型应用示例2.5枚举类型1.3程序编译与执行概述源程序:用源语言写的,有待翻译的程序目标程序:也称为"结果程序",是源程序通过翻译程序加工以后所生成的程序。翻译程序:是指一个把源程序翻译成等价的目标程序的程序。92汇编程序:其任务是把用汇编语言写成的源程序,翻译成机器语言形式的目标程序。编译程序:若源程序是用高级程序设计语言所写,经翻译程序加工生成目标程序,那么,该翻译程序就称为"编译程序"。解释程序:这也是一种翻译程序,同样是将高级语言源程序翻译成机器指令。它与编译程序不同点就在于:它是边翻译边执行的,即输入一句、翻译一句、执行一句,直至将整个源程序翻译并执行完毕。93三种不同类型的翻译程序1.5程序的开发过程->1.5.1基本术语编辑将源程序输入到计算机中,生成后缀为cpp的磁盘文件编译将程序的源代码转换为机器语言代码链接将多个源程序文件以及库中的某些文件连在一起,生成一个后缀为exe的可执行文件运行调试94程序的开发过程1.5程序的开发过程C++编译和链接流程以g++编译test.cpp为例,使用如下命令显示编译过程中详细的命令调用并将中间文件保存下来g++-v

–g-otest-save-tempstest.cpp下图展示了完整的编译流程(如果没有-save-temps选线,则预处理器与编译器两部合一,显示的步骤是直接从.cpp文件到.s文件)95Preprocessorcc1plustest.cppCompilercc1plustest.iiAssemblerastest.sLinkercollect2test.oteststartupcodelibrarycode//File:test.cpp#include<iostream>#defineMAX100intmain(){intarr[MAX]={0,1,2};std::cout<<arr[0];}//File:test.ii….头文件展开的内容intmain(){intarr[100]={0,1,2};std::cout<<arr[0];}C++编译和链接示意图961.4汇编基础汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效的应用汇编语言对其编程汇编语言是理解高级语言特性底层实现原理的工具,本课程仅简要介绍汇编语言的基础概念及常见指令,让同学们具备底层探秘的基本能力基于80X86汇编语言,Intel格式的汇编语法,目标机器字长32位97机器语言v.s.汇编语言机器语言是机器指令的集合,机器指令展开来讲就是一台机器可以正确执行的命令汇编语言的主体是汇编指令,汇编指令是机器指令便于记忆的书写格式(助记符)机器指令:1000100111011000操作:寄存器BX的内容送到AX中汇编指令:MOVAX,

BX98高级语言编程v.s汇编语言编程(后端)#include<iostream>intmain(){std::cout<<"hello“;}(前端)汇编器高级语言99CPU概述中央处理器(CentralProcessingUnit,简称CPU)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元一个典型的CPU由运算器、控制器、寄存器等器件组成内部总线实现CPU内部各个器件之间的联系外部总线实现CPU和主板上其它器件的联系100指令和数据在冯·诺依曼体系结构中,数据和指令存放在同一个存储器中在存储器中,指令和数据没有任何区别,都是二进制信息指令和数据是应用上的概念,关键在于CPU如何诠释二进制信息

1000100111011000─>89D8H(数据)1000100111011000─>MOVAX,BX(指令)寄存器寄存器:简单的讲是CPU中可以存储数据的器件,一个CPU中有多个寄存器分类:通用寄存器(8个)段寄存器(6个)控制寄存器(2个)102通用寄存器charshortint

(2bytes)int(4bytes)变址寄存器103段寄存器分段管理:按操作对象的属性不同,将内存逻辑划分成代码段、数据段和栈段80x86的段寄存器:代码段寄存器(CS):存放当前正在运行的程序代码所在段的段基址数据段寄存器(DS、ES、FS、GS):指出当前程序使用的数据所存放段的最低地址,即存放数据段的段基址栈段寄存器(SS):指出当前栈的底部地址,即存放栈段的段基址104控制寄存器指令指针寄存器(EIP)始终指向CPU下一条将要执行的指令在存储器单元的偏移地址不能直接更改EIP的值,只有CPU执行转移指令,调用指令、返回指令以及中断处理时,EIP才做相应的改变105控制寄存器标志寄存器(EFLAG)指示算术运算指令、逻辑运算指令的结果供操作系统使用的程序状态信息if(a==d)do_sth();cmpedx,ebxjne.skip_do_sth;calldo_sth.skip_do_sth:106CPU工作流程(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;(2)IP=IP+所读取指令的长度,从而指向下一条指令;(3)执行指令。某些指令(如控制转移指令、调用和返回指令会改变IP的值)。(4)转到步骤(1),重复这个过程。存储器CPU是计算机的核心部件.它控制整个计算机的运作并进行运算,要想让一个CPU工作,就必须向它提供指令和数据指令和数据在存储器中存放,也就是平时所说的内存。磁盘不同于内存,磁盘上的数据或程序如果不读到内存中,就无法被CPU使用存储单元:存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号109CPU对存储器的读写CPU要想进行数据的读写,必须和外部器件(芯片)进行三类信息的交互:存储单元的地址(地址信息)器件的选择,读或写命令(控制信息)读或写的数据(数据信息)在计算机中专门有连接CPU和其他芯片的导线,通常称为总线地址总线:传递地址信息控制总线:传递控制信息数据总线:传递数据信息110CPU对存储器的读写CPU对存储器的读写内存寻址当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法被称为寻址方式逻辑地址(LA

=SA:EA):程序使用的地址SA:SegmentAddressEA:EffectiveAddress(Offset)物理地址(PA):物理内存的地址PA=L2P(SA)+EA内存寻址汇编指令汇编指令由一个操作码和一个或多个操作数构成操作码指明进行何种操作操作数指明参与操作的数据,操作数可以是立即数(常数)、寄存器数据和存储器数据汇编指令主要包括以下三类:数据传送指令(对应高级语言的赋值、传参等操作)算术运算指令(对应高级语言的算术运算操作)按位逻辑运算指令(对应高级语言的按位逻辑运算操作)控制转移指令(对应高级语言的分支、循环等操作)调用和返回指令(对应高级语言的函数调用和返回操作)汇编指令操作数标记<label>汇编指令操作数的尺寸通过寄存器名指明要处理的数据的尺寸moval,0x101个字节

mov

ax,0x202个字节moveax,0x404个字节在没有寄存器参与的内存单元访问指令中,用byte

ptr,word

ptr

或dwordptr

显性地指明所要访问的内存单元的尺寸是1个字节,2个字节,还是4个字节mov

byte

ptr

[0x100],0x101个字节

movwordptr[0x100],0x202个字节

movdwordptr[0x100],0x404个字节

数据传送指令mov格式:movdest_opd,src_opd语义:将源操作数(常数、寄存器的内容、内存的内容)复制到目的操作数(寄存器或内存)语法:mov<reg>,<reg>mov<reg>,<mem>mov<mem>,<reg>mov<reg>,<const>mov<mem>,<const>实例:moveax,ebxmoveax,[ebx+0x10]mov[ebx+0x10],eaxmoveax,0x1234movbyteptr[ebx+0x10],0x12数据传送指令push格式:pushopd语义:将操作数(常数、寄存器的内容、内存的内容)压入栈中,同时栈顶指针esp的值减4语法:push<reg32>push<mem>push<con32>实例:pusheaxpush[ebx+0x10]push0x1234espebpespebpopdLowAddressHighAddress数据传送指令pop格式:popopd语义:将栈顶内容弹出到操作数(寄存器、内存)中,同时栈顶指针esp的值加4语法:pop<reg32>pop<mem>实例:popeaxpop[eax+0x10]opdLowAddressHighAddressespebpespebp数据传送指令lea(loadeffectiveaddress)格式:leadest_opd,src_opd语义:将第二个操作数表示的地址载入到第一个操作数(寄存器)中语法:lea<reg32>,<mem>实例:leaedi,[ebx+4*esi]算术运算指令add/sub格式:add/subopd1,opd2//opd1=opd1±opd2语义:将两个操作数相加/减,且将相加/减后的结果保存到第一个操作数中语法:add/sub<reg>,<reg>add/sub<reg>,<mem>add/sub<mem>,<reg>add/sub<reg>,<con>add/sub<mem>,<con>实例:add/subeax,ebxadd/subeax,[ebx+0x10]add/sub[ebx+0x10],eaxadd/subeax,0x1234add/subbyteptr[ebx+0x10],0x12注:add、sub是不同的操作码算术运算指令inc/dec格式:inc/decopd//opd=opd1±1语义:将操作数自加/减1语法:inc/dec<reg>inc/dec<mem>实例:inc/deceaxinc/decdwordptr[ebx+0x10]注:inc、dec是不同的操作码算术运算指令cmp格式:cmpopd1,opd2//eflags<-opd1-opd2语义:两操作数作减法,仅修改标志位,不回送结果语法:cmp<reg>,<reg>cmp<reg>,<mem>cmp<reg>,<con>cmp<mem>,<reg>cmp<mem>,<con>实例:cmprax,ebxcmprax,[ebx+0x10]cmp[ebx+0x10],raxcmprax,0x10cmp[ebx+0x10],0x10按位逻辑运算指令and/or/xor格式:and/or/xoropd1,opd2//opd1=opd1&|^opd2语义:对两个操作数进行按位与/或/异或操作,结果保存到第一个操作数中语法:and/or/xor<reg>,<reg>and/or/xor<reg>,<mem>and/or/xor<mem>,<reg>and/or/xor<reg>,<con>and/or/xor<mem>,<con>实例:and/or/xor

eax,ebxand/or/xoreax,[ebx+0x10]and/or/xor[ebx+0x10],eaxand/or/xoreax,0x1234and/or/xorbyteptr[ebx+0x10],0x12注:and、or、xor是不同的操作码按位逻辑运算指令test格式:testopd1,opd2//eflags<-opd1&opd2语义:两操作数作按位与运算,仅修改标志位,不回送结果语法:test<reg>,<reg>test<reg>,<mem>test<reg>,<con>test<mem>,<reg>test<mem>,<con>实例:testrax,ebxtestrax,[ebx+0x10]test[ebx+0x10],raxtestrax,0x10test[ebx+0x10],0x10按位逻辑运算指令shl/shr(shiftleft/right)格式:shl/shropd1,opd2//opd1=opd1opd2语义:第一个操作数表示被操作数,第二个操作数指示位移数,操作结果存于第一个操作数。x<<=y相当于x*=2y,x>>=y相当于x/=2y。语法:shl/shr<reg>,<con8>shl/shr<mem>,<con8>shl/shr<reg>,<cl>shl/shr<mem>,<cl><<>>实例:shl/shreax,1shl/shr[ebx+0x10],1shl/shreax,clshl/shr[ebx+0x10],cl注:shl、shr是不同的操作码无控制转移指令语义:控制转移到label所指示的地址语法:jmp<label>jmp<reg>jmp<mem>实例:jmp.startjmpeaxjmp[ebx]直接跳转,目标地址直接包含在指令中间接跳转,目标地址在运行时才能确定条件控制转移指令依据机器状态字(eflags寄存器)中的标志条件是否符合要求,决定是否控制转移je<label>(jumpwhenequal)jne<label>(jumpwhennotequal)jz<label>(jumpwhenlastresultwaszero)jg/ja<label>(jumpwhengreaterthan/above)jge<label>(jumpwhengreaterthanorequalto)jl/jb<label>(jumpwhenlessthan/below)jle<label>(jumpwhenlessthanorequalto)条件控制转移指令实例1switch(x){case0:printf("0\n");case1:printf("1\n");

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论