微机原理与系统设计 授课老师 : 李军, 曾操 Email: junli01@mail.xidian.edu.cn Homepage: http://web.xidian.edu.cn/junli 办公室 : 新科技楼 1606 电话 :88201022
教材 微型计算机与接口技术 ( 第二版 ) 科学出版社楼顺天, 周佳社, 张伟涛编著
课程要求及考核 考核 : 笔试 (60%)+ 平时成绩 (40%) 平时成绩包括 作业 上机实验 课堂随机测验
内容概要 本课程是为电子技术应用等专业学生微型计算机原理与应用课程设置的 为适应课程内容更新的需要, 以 8086/8088 微处理器为核心, 详细讨论汇编语言程序设计技术 系统总线形成系统总线形成 存储器设计 常用和专用芯片的接口技术及其应用编程常用和专用芯片的接口技术及其应用编程
必备知识 学习本书的读者, 应学习过高级语言程序设计和数字电路系统 高级语言程序设计 学习高级语言程序设计时, 同学们已经建立了程序设计的算法思想和设计方法, 为学习汇编语言 ( 低级语言 ) 程序设计打下了基础 前四章的重点是汇编语言程序设计以及程序设计中涉及到的相关理论基础知识 数字电路 本课程的内容涉及到软件和硬件的设计 后七章重点讲解硬件设计的相关理论知识 在硬件设计中, 用到的基础知识是数字电路, 如锁存器 缓冲器等缓冲器等
计算工具的发展 人类社会每个阶段都有不同程度的计算需求, 需要有帮助计算的工具 原始人类 : 古代中国 : 西方早期 : 手 算筹 帕斯卡的加法器 ( 法国 ) 古埃及人用结绳来记录土地面积和收获的谷物 算盘 莱布尼兹的计算尺 ( 德国 )
计算工具的发展 二战以后 : 电子计算机 1946 年 2 月 15 日, 世界上第一台通用数字电子计算机 ENIAC 研制成功, 承担开发任务的 莫尔小组 由四位科学家和工程师埃克特 莫克利莫克利 戈尔斯坦 博克斯组成, 总工程师埃克特当时年仅 24 岁 1 电子管计算机 1946 年 ~1957 年 2 晶体管计算机 (1958 年 ~1964 年 ) 3 集成电路计算机 (1965 年 ~1970 年 ) 4 大规模超大规模集成电路计算机 (1971 年至今 ) 计算机发展趋势 : 组成越来越复杂 功能越来越强功能越来越强 应用越来越容易应用越来越容易
计算工具的发展 1971 年, 美国 Intel 公司研究并制造了 I4004 微处理器芯片 该芯片能同时处理 4 位二进制数, 集成了 2300 个晶体管, 每秒可进行 6 万次运算, 成本约为 200 美元 它是世界上第一个微处理器芯片, 以它为核心组成的 MCS-4 计算机, 标志了世界第一台微型计算机的诞生 微机概念 : 以大规模 超大规模构成的微处理器作为核心, 配以存储器 输入 / 输出接口电路及系统总路线所制造出的计算机 划分阶段的标志 : 以字长和微处理器型号
第一代 4 位和低档 8 位机 (1971-1973) Intel 4004 第二代中高档 8 位机 (1974-1978) 特点 : 1 速度越来越快速度越来越快 2 容量越来越大容量越来越大 3 功能越来越强功能越来越强 8080/8085 Z80 MC6800 第三代 16 位机 Intel 8086 Z8000 MC6800 第四代 32 位机 (1978-1981) 80386 80486 第五代 64 位机 Intel Pentium (1981-1992) (1993 后 )
计算工具的发展 Intel 8086 1978 年 6 月,Intel 推出 4.77MHz 的 8086 微处理器 它采用 16 位寄存器 16 位数据总线和 29000 个 3 微米技术的晶体管, 售价 360 美元 本课程主要以 8086 微处理器家族各成员组成的 IBM PC 系列微机为例, 讨论微型计算机组成原理 汇编语言程序设计和输入输出接口技术等问题
微型计算机的应用 1 科学计算和科学研究计算机主要应用于解决科学研究和工程技术中所提出的数学问题 ( 数值计算 ) 2 数据处理 ( 信息处理 ) 主要是利用计算机的速度快和精度高的特点来对数字信息进行加工 3 工业控制用单板微型计算机实现直接数字 (DDC) 级控制, 监督计算机 (SCC) 级控制, 管理信息系统 (MIS)
4 计算机辅助系统计算机辅助系统主要有计算机辅助教 (CAI CAI) 计算机辅助设计 (CAD CAD) 计算机辅助制造 (CAM CAM) 计算机辅助测试 (CAT CAT) 计算机集成制造 (CIMS CIMS) 等系统 5 人工智能人工智能主要就是研究解释和模拟人类智能 智能行智能行为及其规律的一门学科, 包括智能机器人, 模拟人的思维过程, 计算机学习等等 其主要任务是建立智能信息处理理论, 进而设计可以展现某些近似于人类智能行为的计算系统
计算机中的数制和码制 人类习惯于十进制而计算机的语言是 2 进制数 0 1( 道生一, 一生二, 二生三, 三生万物 -- 老子 道德经道德经 ) 位置计数法 : 同一数字在不同数位代表的数值不同 33 常用的数制 : 十进制 (Decimal): ):0~9 表示 ; 后缀加 D, 例如 :33D 或 33( 后缀可省略 ) 二进制 (Binary): ):0 1 表示 ; 后缀加 B, 例如 :01011011B 十六进制 (Hexadecimal): ):0~9 A~F(10~15) 表示 ; 后缀加 H, 例如 :0D5H 一个数可以用不同数值表示, 形式不同, 量值相等 莱布尼茨
第 1 章数制与码制 本章要点 : 数制表示法 数制之间的转化 二进制数运算 有符号数的表示 ASCII 码
1.1 二进制数的基础知识 一 任意进制数的表示任意一个数 N 可以表示成 P 进制数 : 1 ( N ) P = K i P N i = M i 式中 i 表示数的某一位, K i 表示第 i 位的数字,P 为基数, i P 为第 i 位的权,M N 为正整数 =0,1 0,1 P-1 K i
1.1 二进制数的基础知识 对于 n 位整数 m 位小数的任意十进制数 N, 有 : N N 1 = i 10 K i 10 i = M ( Ki =0,1, 9) 如 : = (357.32) 10 3 10 2 + 5 10 1 + 7 10 0 + 3 10 1 + 2 10 2 =357.32
1.1 二进制数的基础知识 N 2 对于 n 位整数 m 位小数的任意二进制数, 有 : N N 1 = i 2 K i 2 i = M ( K=0 或 1) i 如 : = (1101.011 1 2 3 + 1 2 2 ) + 0 2 2 1 + 1 2 0 + 0 2 1 + 1 2 2 + 1 2 3 (13.375 ) = 10
1.1 二进制数的基础知识 对于 n 位整数 m 位小数的任意十六进制数有 : N 1 K i i= M ( N ) 16 = 16 i ( K=0,1, 9,A,B,C,D,E,F) i ( 3C.4) 如 : 16 = 3 16 1 + 12 16 0 + 4 16 1 = (60.25) 10 以上方法称为位置计数法或位置加权法
1.1 二进制数的基础知识 二 各种进制间的相互转换 1. 十进制任意进制数 ( 设为 P 进制 ) 的转换规则 (1) 整数部分 :N 除以 P 取余数例 1. 十进制数 301 十六进制数转换过程如下 : 16 301 16 18 余数为 :D= K 0 16 1 余数为 :2= K 1 0 余数为 :1= K 2 301=12DH
1.1 二进制数的基础知识 例 2. 十进制数 301 二进制数转换过程如下 : 2 301 2 150 余数为 :1= K 0 2 75 余数为 :0= K 1 2 37 余数为 :1= K 2 2 18 余数为 :1= K 3 2 9 余数为 :0= K 4 2 4 余数为 :1= K 5 2 2 余数为 :0= K 6 2 1 余数为 :0= K 7 0 余数为 :1= 301=100101101B K 8 低位高位
1.1 二进制数的基础知识 (2) 纯小数部分 :N 乘以 P 取整数例 1. 十进制小数 0.6875 二进制小数 转换过程如下 : 0.6875 2 =1.375 K 1 =1 0.375 2 =0.75 K 2 =0 0.75 2 =1.5 K 3 =1 0.5 2 =1.0 =1 0.6875=0.1011B 例 2. 十进制小数十六进制小数转换过程如下 : 0.6875=0.B H K 4 K 1 0.6875 16 =11.0 =B 高位低位
1.1 二进制数的基础知识 2. 任意进制数十进制数的转换规则按权展开, 即位置加权法 3. 二进制十六进制数的转换规则如 : 1001001011010.101001111 B 1 2 5 A. A 7 8 H
1.1 二进制数的基础知识 三 二进制数的算术运算二进制计数制不仅物理实现容易, 且运算方法也比十进制计数制大为简单, 所以计算机中均采用二进制数 二进制数的算术运算包括加 减 乘 除 例 : 1 0 1 1 0 1 0 1 B 1 0 1 1 0 1 0 1 B + 0 0 0 0 1 1 1 1 B - 0 0 0 0 1 1 1 1 B 1 1 0 0 0 1 0 0 B 1 0 1 0 0 1 1 0 B
1.1 二进制数的基础知识 四 二进制数的逻辑运算 二进制数的逻辑运算包括与 或 异或异或 非四种运算非四种运算 例 : 1 0 1 1 0 1 0 1 B 1 0 1 1 0 1 0 1 B 0 0 0 0 1 1 1 1 B 0 0 0 0 0 1 0 1 B 0 0 0 0 1 1 1 1 B 1 0 1 1 1 1 1 1 B 1 0 1 1 0 1 0 1 B 0 0 0 0 1 1 1 1 B 1 0 1 1 1 0 1 0 B X X= 1 0 1 1 0 1 0 1 B = 0 1 0 0 1 0 1 0 B
1.2 有符号二进制数的表示方法及溢出问题 一 有符号二进制数的表示方法前面我们接触的二进制数均为无符号数, 即所有二进制数位均为数值位, 很多情况下都是这样对待的 但在有些情况下, 有些数值是带符号的, 即可能是正数, 也可能是负数 这样就存在一个有符号二进制数的表示方法问题 1. 数的符号表示方法为了表示一个有符号数, 除了数值位以外, 还应制定符号位, 通常以这个数的最高位表示符号位
1.2 有符号二进制数的表示方法及溢出问题 我们假定讨论的数为整数, 对 8 位有符号二进制整数, 用下表示 : DDDDDDD 7 6 5 4 3 2 1D0 0: 表示正数 1: 表示负数 符号位 数值部分 这种表示方法称为机器数表示法机器数表示法 有符号二进制数的真值为它对应的十进制数
1.2 有符号二进制数的表示方法及溢出问题 2. 原码表示法如果正数的符号位用 0 表示, 负数的符号位用 1 表示, 绝对值的编码规则与前面讲的无符号数编码规则相同, 这种表示方法称为原码表示法 一个数 X 的原码记为 : DDDDDDD [X] 7 6 5 4 3 2 1D0 原 0 0 0 0 0 0 1 1 +3 的表示 [+3] =00000011B +3 的表示 原 符号位 数值部分 = 绝对值 ( 用无符号二进制数表示 )
1.2 有符号二进制数的表示方法及溢出问题 1 0 0 0 0 0 1 1 的表示 [-3] =10000011B -3 的表示 原 [+0] 原 [-0] 原 =0 0 0 0 0 0 0 0B =1 0 0 0 0 0 0 0B 数 0 的两种表示方法 对 8 位有符号二进制数用原码表示的范围 : 正数从 00000000 01111111,+0 +127 负数从 10000000 11111111,-0-127
1.2 有符号二进制数的表示方法及溢出问题 有符号二进制数用原码表示的优缺点 : 优点 : 表示简单, 易于理解, 真值转换方便 缺点 :+ - 运算麻烦 因为它仅仅是将其值的符号用一位二进制数表示, 因而它的原码数的 + - 运算完全同笔算 如两个正数相减, 计算机首先要判断被减数的绝对值与减数的绝对值的大小, 然后决定是颠倒过来相减, 还是直接相减 最后在结果的前面加上正确的正负号最后在结果的前面加上正确的正负号 所以, 势必增加运行时间, 降低速度, 使运算器的逻辑复杂化 为了改进它, 引进了补码的概念
1.2 有符号二进制数的表示方法及溢出问题 3. 补码表示法 (1) 补码的概念一个数 X 的补码记为 [X] 补, 补码可定义为 : [x] 补 = x 2 n +x 当 当 0 x < 2 n 1 n 2 1 x<0 n (mod 2 ) 从定义可见, 正数的补码 = 原码, 即补, 原 所以, 只有负数求补的问题 n=8 时, 表示范围 :-128~127 [x] = [x]
1.2 有符号二进制数的表示方法及溢出问题 (2) 一个数的补码的求法 根据定义求补码 补 2 n +x [x] = = 2 n x, x<0 即负数 x 的补码等于模值的绝对值 ) n 2 如 :x=-1010111b,n=8, 则 [X] 补 = 2 8 + ( 1010111B) = = 加上其真值 ( 或减去其真 100000000B-1010111B 10101001B (mod 2 n ) 这种方法因要做一次减法, 很不方便
1.2 有符号二进制数的表示方法及溢出问题 利用原码求补码 一个负数负数的补码等于其原码除符号位保持不变外, 其余各位按位取反, 再在最低位加 1 如 :x=-1010111b [X] 原 =11010111B [X] 补 = 10101000B+1=10101001B 值的注意的是 :0 的补码只有唯一的形式, 符号位和数值位均为 0 无正负 0 之分
1.2 有符号二进制数的表示方法及溢出问题 简便的直接求补码 分 2 步 : 第一步 : 取 x 的绝对值第二步 : 当 x 为正数时,[x] = x 补原 当 x 为负数时,[x] = x +1 ( 含符号位 ) 补原
1.2 有符号二进制数的表示方法及溢出问题 如 :x=-87, 即 x =0101 0111B x 原 =0 1 0 1 0 1 1 1 B 1 0 1 0 1 0 0 0 B +) 1 [x] 补 = 1 0 1 0 1 0 0 1 B 8 位二进制补码所能表示的数的范围 :-128 +127 16 位二进制补码所能表示的数的范围 :-32768 +32767
1.2 有符号二进制数的表示方法及溢出问题 (3) 数的补码表示转换为原码表示 [X] 补 一个用补码表示的负数, 如将再求一次补, 即将 [X] 补除符号位外取反加 1, 就可得到 [X] 原, 用下式表示 : [X] 补补 = [X] 原 [X] 补如 : = 10101001B [X] 补补 = 11010111B = [X] 原
1.2 有符号二进制数的表示方法及溢出问题 (4) 补码的运算规则第一个公式 : 两个 n 位二进制数之和的补码等于这两数补码之和, 即 : [X+Y] 补 = [X] 补 + [Y] 补 例 : (+33)+(-15) 0 0 1 0 0 0 0 1 B + 1 1 1 1 0 0 0 1 B 进位, 丢掉 [1]0 0 0 1 0 0 1 0 B [+33] 补 [-15] 补 [+18] 补
1.2 有符号二进制数的表示方法及溢出问题 第二个公式 : 两个 n 位二进制数之差的补码等于这两数补码之差, 即 : [X-Y] 补 = [X] 补 - [Y] 补 例 : (+33)-(-15) 0 0 1 0 0 0 0 1 B - 1 1 1 1 0 0 0 1 B 借位, 丢掉 [1]0 0 1 1 0 0 0 0 B [+33] 补 [-15] 补 [+48] 补
1.2 有符号二进制数的表示方法及溢出问题 第三个公式 : 补码减法运算时, 也可以利用加法基本公式, 即 : [X-Y] 补 = [X] 补 + [-Y] 补 (mod 2 n ) 因为 :X-Y = X+(-Y) 所以 : [X-Y] 补 = [X+(-Y)] 补 = [X] + [-Y] 补补 一般称已知 [Y] 补, 求得 [-Y] 补的过程叫变补或求负
1.2 有符号二进制数的表示方法及溢出问题 变补或求负是一种很有用的运算 求法求法 : 若已知 [Y] 补 = Yn 1Y Y Y n 2 1 0, 则对 [Y] 补的每一位 ( 包括符号位 ) 都按位取反, 然后再加 1, 结果即 例 : (+33)-(+15) [-Y] 补 00100001B [+33] 补 - 00001111B [+15] 补 00010010B [+18] 补 ( 公式二 ) 00100001B [+33] 补 + 11110001B [-15] 补 [1] 00010010B [+18] 补借位, 丢掉 ( 公式三 )
1.2 有符号二进制数的表示方法及溢出问题 二 有符号数运算的溢出问题 如果计算机的字长为 n 位,n 位二进制数的最高位为符号位, 其余 n-1 位为数值位, 采用补码表示法时, 可表示的数 X 的范围为 : 2 n 1 X 2 n 当 n=8 时, 可表示的有符号数的范围为 : -128 +127 当 n=16 时, 可表示的有符号数的范围为 : 1-32768 +32767 1
1.2 有符号二进制数的表示方法及溢出问题 两个有符号数进行加减运算时, 如果运算结果超出可表示的有符号数的范围时, 就会发生溢出, 使计算结果出错 很显然, 溢出只能出现在两个同号数相加或两个异号数相减的情况下
1.2 有符号二进制数的表示方法及溢出问题 例 : (+72)+(+98)=+170>+127 溢出 0 1 0 0 1 0 0 0 B + 0 1 1 0 0 0 1 0 B [+72] [+98] 补 补 1 0 1 0 1 0 1 0 B [-86] 补 有进位 =1 无进位 =0 溢出, 结果出错 ( 正溢出 ) C s C p C p C S = 1 设次高位 ( 数值部分最高位 ) 向最高位 ( 符号位 ) 的进位标志为 C p ; 最高位 ( 符号位 ) 和次高位的进位相加的进位标志为 C S
1.2 有符号二进制数的表示方法及溢出问题 例 : (-83)+(-80)=-163<-128 溢出 1 0 1 0 1 1 0 1 B + 1 0 1 1 0 0 0 0 B [-83] [-80] 补 补 [1] 0 1 0 1 1 1 0 1 B [+93] 补 无进位 =0 C p 有进位 =1 C S 溢出, 结果出错 ( 负溢出 ) C s C p = 1
1.2 有符号二进制数的表示方法及溢出问题 结论 : 对于加法运算 (1) 如果次高位有进位而最高位无进位, 则结果溢出 ; (2) 如果次高位无进位而最高位有进位, 则结果溢出 这两种情况分别是 : (1) 两负数相加, 结果超出范围, 形式上变为正数 ; (2) 两正数相加, 结果超出范围, 形式上变为负数
1.2 有符号二进制数的表示方法及溢出问题 同理, 我们可得出结论 : 对于减法运算 (1) 如果次高位有借位而最高位无借位, 则结果溢出 ; (2) 如果次高位无借位而最高位有借位, 则结果溢出
1.3 二进制编码的十进制数 (BCD 编码 ) 一 8241BCD 码前面讲过, 计算机只认识 0 1 二进制代码, 但人们最习惯的是十进制 为了解决这一矛盾, 提出了一个比较适合于十进制系统的二进制代码的特殊形式 BCD 码 BCD 码是用四位二进制数表示 1 位 0 9 的十进制数, 而 4 位二进制数码有 16 种组合, 原则上可任选 10 种作为代码, 但为便于记忆和比较直观, 最常用的是 8421BCD 码, 8 4 2 1 分别是 4 位二进制数的位权值 下面给出十进制数和 8421BCD 编码的对应关系
1.3 二进制编码的十进制数 (BCD 编码 ) 十进制数 0 1 2 3 4 5 6 7 8 9 8421BCD 码 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
1.3 二进制编码的十进制数 (BCD 编码 ) 如 : 十进制数和 BCD 码相互转换 75.4 BCD 码 75.4 = (01110101.0100) BCD BCD 码 10000101.0101 十进制数 ( 10000101.0101) BCD =85.5 同一个 8 位二进制代码表示的数, 当认为它表示的是二进制数和认为它表示的是二进制编码的十进制数, 数值是不相同的 如 : (00011000 =24 ) 2 (00011000 ) BCD =18
1.3 二进制编码的十进制数 (BCD 编码 ) 在计算机中,BCD 码有两种基本格式 a. 组合式 BCD 码 b. 分离式 BCD 码 a. 组合式 BCD 码 两位十进制存放在一个字节中 如数 24 的存放格式 : D7D6DD 5 4DD 3 2D1D0 0 0 1 0 0 1 0 0 2 4
1.3 二进制编码的十进制数 (BCD 编码 ) b. 分离式 BCD 码每位数存放在 8 位字节的低 4 位, 高 4 位的内容与数值无关 如数 24 的存放格式 : 二 BCD 码的加减法运算 D 7D 6D 5D 4D 3D 2D 1D 0 x x x x 0 0 1 0 x x x x 0 1 0 0 下面我们以组合式 BCD 码格式为例讨论 BCD 码的加减运算 由于 BCD 编码是将每个十进制数用一组 4 位二进制数表示, 若将这种 BCD 编码直接交计算机运算, 计算机总是把它按二进制数处理, 所以结果可能出错 2 4
1.3 二进制编码的十进制数 (BCD 编码 ) 如 :38+49=87 0 0 1 1 1 0 0 0BCD 38 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 1 BCD 49 87 出错原因 : 十进制相加应逢十进一, 但计算机按二进制运算, 每四位一组, 低四位向高四位进位相当十六进制运算, 逢十六进一 所以当结果超过 9 时将比正确值少 6 81 显然, 结果出错 解决办法 : 加六修正
1.3 二进制编码的十进制数 (BCD 编码 ) 加六修正规则 : (1) 如果两个 BCD 码位相加没有进位, 并且结果 9, 则该位不需修正 (2) 如果两个 BCD 码位相加有进位, 或者其结果 10 10, 该位进行加六修正 (3) 低位修正结果使高位 >9 时, 高位进行加六修正 例 :94+7 94+7=101
1.3 二进制编码的十进制数 (BCD 编码 ) 1 0 0 1 0 1 0 0 94 + + 0 0 0 0 0 1 1 1 7 1 0 0 1 1 0 1 1 低 4 位满足法则 2 0 0 0 0 0 1 1 0 加六修正 1 0 1 0 0 0 0 1 高 4 位满足法则 3 0 1 1 0 0 0 0 0 加六修正 + [1]0 0 0 0 0 0 0 1 101 结果正确
1.3 二进制编码的十进制数 (BCD 编码 ) 减六修正规则 : (1) 如果两个 BCD 码位相减没有借位, 则该位不需修正 (2) 如果两个 BCD 码位相减有借位, 则该位进行减六修正 例 :50 50-29 29=21 21
1.3 二进制编码的十进制数 (BCD 编码 ) ` 0 1 0 1 0 0 0 0 50 - - 0 0 1 0 1 0 0 1 29 0 0 1 0 0 1 1 1 低码位有借位 0 0 0 0 0 1 1 0 减六修正 0 0 1 0 0 0 0 1 21 结果正确
1.4 ASCII 字符代码 ASCII 美国国家信息标准交换码 ASCII 用 7 位二进制代码对任一字符编码, 包括 : 共 128 个 32 个通用控制符 0-- --9 10 个数字 52 个英文大小写字母 34 个专用符号 要求掌握常用字符的 ASCII 码 : 0~9, A~Z,a~z, 空格, 回车, 换行
记住下列 ASCII 码 0~9 : 30H~39H A~Z: 41H~5AH a~z : 61H~7AH 空格 : 20H 回车 :0DH 换行 :0AH
补充习题 : 1 设机器字长 16 位, 则 1024 的补码可表示为 H,-,-1024 的补码可表示为 2 设机器字长为 8 位, 十进制 -56 的原码为 H, 补码为 H 将十进制 157 表示成 16 进制数为 3 有符号数 78H+93H, 其结果是否溢出 4 机器字长为 8 位, 机器中字用补码表示, 则 -5 表示成 H,34H 表示成 H,-,-34H 表示成 H
作业作业作业作业本章习题本章习题本章习题本章习题 : 1.(1) 1.(1) 1.(1) 1.(12) 2. 2. 2. 2.(246 (46 (46 (46) 3. 3. 3. 3.(12) (2) (2) (2) 4. 4. 4. 4.(1 2) 5. 5. 5. 5.(12) (2) (2) (2) 6. 6. 6. 6.(1 2 6) 7. 7. 7. 7.(1 2 3) 6. 6. 6. 6.(1 2 6) 7. 7. 7. 7.(1 2 3) 8. 8. 8. 8.(1 234) (34) (34) (34) 9. 9. 9. 9.(1 256) (56) (56) (56) 10. 10. 10. 10.(2 3) 12. 12. 12. 12.(2 4) 14. 14. 14. 14.(1 358) (58) (58) (58) 15. 15. 15. 15.(1 4) 17. 17. 17. 17.(1 2) 19. 19. 19. 19.(3 6) 21. 21. 21. 21.(2) 22 22 22 22.(1 2)