1.18k likes | 1.3k Views
C H A P T E R. 6. 体系结构对高级语言的支持. 主要内容. 1. 软件设计中的抽象. 2. 数据类型. 3. 浮点数据类型. 4. ARM 浮点体系结构. ARM 体系结构对程序设计的支持. 5. 6.1 软件设计中的抽象. 汇编级的抽象 在机器语言的级别上思考 高级语言 增加指令集的复杂度 由编译器完成对高层次操作的支持. 抽象级的不同层次. 6.2 数据类型. 计算机的数据可以用下列各项来表征: 需要的位数 位的顺序 位的用途. 数是什么 ?.
E N D
C H A P T E R 6 体系结构对高级语言的支持
主要内容 1 软件设计中的抽象 2 数据类型 3 浮点数据类型 4 ARM浮点体系结构 ARM体系结构对程序设计的支持 5
6.1 软件设计中的抽象 • 汇编级的抽象 • 在机器语言的级别上思考 • 高级语言 • 增加指令集的复杂度 • 由编译器完成对高层次操作的支持 抽象级的不同层次
6.2 数据类型 • 计算机的数据可以用下列各项来表征: • 需要的位数 • 位的顺序 • 位的用途
数是什么? • “数”不过是一个抽象的概念,每个数用一个特定的符号或状态代表 • 0123456789 • 共十个符号,可以表示十个数 • ABCDEFGHIJKLMNOPQRSTUVWXYZ • 共二十六个符号,可以表示二十六个数 • 世界上有六十亿人,需要定义六十亿个符号才能表示??
解决办法? • 用两个符号的排列可以表示比较多的数 • 两个0~9的排列可以表示0~99共100个数 • 0 ... 9 ... 11 ... 33 ... 78 ... 99 • 两个A~Z的排列可以表示A~ZZ共676个数 • A ... Z ... BB ... EA ... MP ... ZZ • 用更多个的符号,可以表示更多的数 • 基本符号集:少数几个表示数的基本符号 • 当一个数大到不能用基本符号集表示时就用多个基本符号的排列表示 进位制
进位制 • 0个符号? • 没有这样的进位制 • 一个符号:一进制? • 计算机不仅要表示数,还要运算:运算意味着变化,只有一个符号无法表示变化 • 一进制在数学上不能与十进制等价 • 如何表示0?
进位制 • 二个符号:二进制 • 既可以表示数,也可以表示变化 • 数学上可以与十进制等价 • 计算机都用二进制 • 计算机使用二进制并不意味着程序也必须使用二进制 • 编译连接程序:用二进制、十进制、十六进制等 • 工资报表程序:通常用十进制 • 科学计算程序:可能用任意进制
进位制及互相转化 • 二进制 • 0,1两个状态易物理实现,运算规则简单 • 十进制 • 特点:基数为十,逢十进一 • 其它进制 • 八进制和十六进制 • 互相转化
十六进制 • 人类的阅读和记忆习惯 • “进制”很高:可接受很大数量的符号 • 例:汉语 • 短时记忆很小:仅可记忆几个到十几个字 • 处理差异很小的符号时容易出错 • 二进制不适合人们阅读和记忆 • 0001 1001 0111 1000 0000 0010 0010 0110 • 很长但类似的符号,不符合人们的习惯 • 转换成十进制? • 麻烦 • 更简单的表示:十六进制 • 0x19780226
十六进制和二进制的相互转换 • 1010 0010 0011 0110 • A 2 3 6 • 需要人处理的情况多用十六进制
互相转化(二、八、十六进制化为十进制) 规则:按“权”展开 例: (1999.8)10=1X103+9X102+9 X101+9 X100+8 X10-1 (1101.1)2=1X23+1 X22+0X21+1 X20+1 X2-1
互相转化(二、八、十六进制化为十进制) 例1:将二进制数101.01转换成十进制数。 (101.1)2=1X 22+0X21+1 X20+1 X2-1 =(5.5)10 例2:将八进制数34. 6转换成十进制数。 (34.6)8=3X81+4X80+6X8-1 =(28.75)10
互相转化(二、八、十六进制化为十进制) 例3:将十六进制数2AB. 6转换成十进制数 (2AB.6)8=2 X162+10 X161+11X 160 +6 X16-1 =(683.375)10
互相转化(十进制化为二进制) 十进制整数化为二进制整数 规则:除二取余,直到商为零为止,倒排 例:将十进制数86转化为二进制 2 | 86 2 | 43…… 0 2 | 21…… 1 2 | 10…… 1 2 | 5…… 0 2 | 2…… 1 2 | 1…… 0 所以,(86)10=(1010110)2 0 …… 1
互相转化(十进制化为二进制) 十进制小数化为二进制小数 • 规则:乘二取整,直到小数部分为零或给定的精度为止,顺排 例:将十进制数0.875转化为二进制数 0.875 ╳ 2 1.75 0.75 ╳ 2 1.5 0.5 ╳2 1.0 所以(0.875)10=(0.111)2
互相转化(十六进制化为二进制) 规则:每一个位十六进制数改写成等值的四位二进制数,次序不变 例:(3A8C.D6)16 = (0011 1010 1000 1100.1101 0110)2 = (11101010001100.1101011)2
互相转化(二进制化为十六进制) 规则:每四位二进制数改写成等值的一位十六进制数,次序不变 例: (11001111.01111)2= (11001111 .01111000)2 = (CF.78)16
数的范围 • ARM安排32位来表示数量 • 32位无符号整数 • 取值范围为:0~4294967295(10)=0~FFFFFFFF(16) • 如果是负数呢? • 又该如何表示?范围是多少? • 如何表示一个有符号的整数? • 符号位? • 原码、反码、补码? • 实数(浮点数)?
一般概念 • 正整数(不带符号的整数) 8位:0~255,16位:0~65535 • 带符号整数 符号位(0:正;1:负) 最高位为符号位(原码表示法) 8位:-127~127,16位:-32767~+32767
补码机器数 • 原码:将整数化为二进制数,符号位置0(正数)或1(负数) • 反码:负数的反码:符号位为1,绝对值部分与原码相反。 • 负数的补码表示:符号位也是“1”,其余为反码的最低位加“1”。 • 注意: • -0与+0在补码表示法中相同,而在原码、反码表示却不同。 • 相同位数的二进制补码,表示的范围比原码、反码多一个。 • 正数的原码、反码、补码都相等,即表示方法只有一种。
计算机内符号数的补码表示法 (1)引例一:钟表调时 如图:10点→6点,可以逆时针拨,也可顺时针拨: 逆拨: 10 – 4 = 6 (减) 顺拨: 10 + 8 = 18 = 12 + 6 = 6 (加) 在顺拨中,12可自然丢失,称为模;而8被称为是– 4的补码。 显然钟表采用十二进制,系统所能表示的最大量程 为12,称之为模(基)。 ∵ 8 = 12 – 4 =12 + (–4) ∴ (– 4)补 = 12 – 4 =12 +(– 4) = 8 即: (X)补 = 模 + X
ARM微处理器中支持三种数据类型: • 字节(8位有符号和无符号字节) • 半字(16位有符号和无符号半字) • 字(32位有符号和无符号字) • 其中,字需要4字节对齐(地址的低两位为0)、半字需要2字节对齐(地址的最低位为0)。
ASCII码 • American Standard Code for Information Interchange • (美国标准信息交换码) • 在计算机中,除要处理大量的数据信息外,还需处理一些 • 字母、符号,它们也要用二进制编码来表示。 • 目前,普遍采用的ASCII码用7位二进制编码来表示数符。 • 共有27=128种组合状态。它们是 • 52大小写英文字母; • 10个十进制数; • 7个标点符号; • 9个运算符号; • 50个其他符号。
ANSI C basic data types • ANSI C basic data types • Signed and unsigned characters of at least eight bits • Signed and unsigned short integers of at least 16 bits • Signed and unsigned integers of at least 16 bits • Signed and unsigned long integers of at least 32 bits • Floating-point, double and long double floating-point numbers • Enumerated types • Bitfields • Enumerated types • the smallest integer type with the necessary range of values. • Bitfield types • implemented within integers
ANSI C Derived data types • ANSI C Standard derived data types • Arrays of several objects of the same type. • Functions which return an object of a given type • Structures containing a sequence of objects of various types. • Pointers (which are usually machine addresses) to objects of a given type • Unions which allow objects of different types to occupy the same space at different times • ARM pointers • 32 bots long, similar to unsigned int, but different arithmetic rules • ARM support for array/ structure • Base plus scaled index addressing
ARM对字符的支持 • 需要注意大小端的存储顺序问题
6.3 浮点数据类型 • 对于定点数据来说,用带小数位的数字就可解决,但其范围还是有限 • 使用二进制“科学表示法” 例如: 10.5 in fixed point 1010.1b Move binary point to left 1.0101b x 23 10.5 = 1.3125 x 8
IEEE-754 standard floating point • 32-bit single precision floating point: ★ MSB is sign-bit (same as fixed point) ★ 8-bit exponent in bias-127 integer format (i.e. store 127+exponent) ★ 23-bit to represent only the fractional part of the mantissa. The MSB of the mantissa is ALWAYS ‘1’, therefore it is not stored
1位 1位 q位 p位 mf ef e m • 浮点机器数 定点表示:又称整数表示,小数点在数中的位置是固定不变的。 浮点表示:又称实数表示,小数点在数中的位置是浮动的。 浮点数的存储方式 注:mf为尾数的符号位,ef为阶码的符号位,e为阶码的值,m为尾数的值。
浮点机器数 • 浮点表示法(浮点数):用指数(整数)和尾数(纯小数)来表示实数的方法。 • 浮点数的表示方法不唯一,长度越长,范围越大,精度越高。 • IEEE的浮点数标准。 • PC中有:16位整数、短整数(32位)、长整数(64位),单精度(32位)、双精度(64位)和扩充精度(80位)浮点数。 注意PC和ARM的区别!
IEEE 754 double extended precision floating-point number format
IEEE 754 extended packed decimal floating-point number format
6.4 ARM浮点体系结构 Load and store floating binary encoding • LDC|STC{<cond>}{L} <CP#>, CRd, [Rn, <offset>] {!} • Ex. LDC p1, C0, [r1]
LDC指令 • LDC指令的格式为: • LDC{条件}{L} 协处理器编码,目的寄存器,[源寄存器] • LDC指令用于将源寄存器所指向的一系列连续的存储单元中的字数据传送到协处理器的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。 • 其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。
指令操作的伪代码: • 指令示例: • LDC P3,C4,[R0] ;将ARM处理器的寄存器R0所指向的存储器中的字数据传送到协处理器P3的寄存器C4中。
STC指令 • STC指令的格式为: • STC{条件}{L} 协处理器编码,源寄存器,[目的寄存器] • STC指令用于将协处理器中的寄存器中的字数据传送到目的寄存器所指向一系列连续的存储单元中,若协处理器不能成功完成传送操作,则产生未定义指令异常。 • 其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。
指令操作的伪代码: • 指令示例: • STC P3,C4,[R0] ;将协处理器P3的寄存器C4中的字 数据传送到ARM处理器的寄存器R0所指向的存储器中。
Floating-point data processing binary encoding • CDP{<cond>} <CP#>, <Cop1>, Crd, Crn, CRm{, <Cop2> } • Ex. CDP p1, 3, C0, C1, C2
1、CDP指令 • CDP指令的格式为: • CDP{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2 • CDP指令用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。 • 其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM处理器的寄存器和存储器。
指令示例: • CDP P3,2,C12,C10,C3,4 ;该指令完成协处理器P3的初始化 • 指令操作的伪代码:
MCR指令 • MCR指令的格式为: • MCR{条件} 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2 • MCR指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。 • 其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,源寄存器为ARM处理器的寄存器,目的寄存器1和目的寄存器2均为协处理器的寄存器。
指令示例: • MCR P3,3,R0,C4,C5,6 ;该指令将ARM处理器寄存器R0中的数据传送到协处理器P3的寄存器C4和C5中。 • 指令操作的伪代码: