1、1. 引言计算机的基本结构主机、输入设备、输出设备、存储设备、通信接口计算机的抽象结构CPU、总线、存储器和寄存器,通过寄存器操作周边设备图 1 计算机的抽象结构存储器结构存储单元(地址、值)单片机通常没有键盘和显示器这样的输入输出设备依靠宿主机进行开发,通过通讯电缆连接DSPDSP 是 Digital Signal Processor(数字信号处理器)的缩写,它是专门为支持计算密集型应用而设计的特殊 CPU,采用多总线结构,有独立乘法器支持高速乘加运算,通常还支持特殊寻址方式用于 FFT(Fast Fourier Transform) 。普通的 CPU 采用冯 诺伊曼(Von Neumann
2、)结构,程序和数据是不加区分的,它们都通过唯一的一条总线来访问。DSP 采用哈佛(Harvard)结构,程序和数据各占一个地址空间,有两条总线分别为程序和数据提供通道。程序空间也可以存放常数总线结构数据线、地址线、控制线程序读总线地址 PAB数据 PRDB数据读总线地址 DRAB数据 DRDB数据写总线地址 DWAB数据 DWEB图 2 总线结构流水线操作取指、译码、取操作数、执行图 3 流水线操作最小系统电源、晶振图 4 最小系统实验板图 5 电源部分电原理图图 6 晶体振荡器部分电原理图图 7 印刷电路板图CPU 的基本组成结构框图控制单元、16 位数据总线、32 位累加器 ACC、中央算
3、术逻辑单元 CALU、乘法单元、辅助寄存器算术单元 ARAU主线:存储器、输入定标器、中央算术逻辑单元、累加器、输出定标器乘法器:经过乘积定标到总线或 CALU图 8 CPU 结构简图思考题1. 一个存储单元有哪两个属性?寄存器与存储器有什么不同?2. 由单片机构成的最小系统有哪几部分构成?3. DSP 是哪三个英文词的缩写?中文意义是什么?4. 哈佛结构计算机与冯诺伊曼结构计算机有什么差别?5. 微控制器与微处理器有什么不同?6. TMS320LF24xA 系列单片机有几套总线?分别起什么作用?总线中数据线和地址线分别有多少条?最大可以访问多少存储单元?每个存储单元由多少位组成?7. 什么是
4、操作码?什么是操作数?8. 实现一条指令的功能要经过哪四个阶段?CPU 为什么要采用流水线结构?图 9 CPU 结构图2. 寻址方式(上)数据的存取计算机中要处理的数据总是存放在存储单元中。读取 Read(也称为载入 Load)是将数据从存储单元取到 CPU 的寄存器中,或是与CPU 的寄存器进行运算。写入 Write(也称为保存 Store)是将数据从 CPU 的寄存器放回到存储单元。三种寻址方式立即数寻址方式(Immediate Addressing Mode):操作数是常数,只能读取,存放在指令字中。直接寻址方式(Direct Addressing Mode):操作数是存储单元,可读写,
5、地址在指令字中。间接寻址方式(Indirect Addressing Mode):操作数是存储单元,可读写,地址在辅助寄存器中。负数的表示16 位二进制补码无符号数 0x00000xFFFF(065535)有符号正数 0x00000x7FFF(032767)有符号负数 0x80000xFFFF(-32768-1)负数的三种表示(以-1 为例)原码表示 0x8001反码表示 0xFFFE补码表示 0xFFFF0x0000 的反码是 0xFFFF,补码 = 反码 + 1 符号扩展二进制补码(以-7 为例)4 位表示为 0x9,解释为 0x9 - 0x108 位表示为 0xF9,解释为 0xF9 -
6、 0x100规律:最高位(符号位)向上扩展-128 -8 -7 -1 0 1 6 7 8 1274位8 9 F 0 1 6 78位80 F8 F9 FF 00 01 06 07 08 7F数的表示范围、溢出的概念例:4 位二进制补码的表示范围是-8 到 7,7 加 1 或-8 减 1 会发生溢出。而 8 位二进制补码的表示范围增大到-128 到 127,此时 7 加 1 或-8 减 1 并不会发生溢出。状态与控制寄存器 ST0 与 ST1,每次全部列出,遇到一个介绍一个,先介绍 SXM15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0ST0 ARP OV OVM1 IN
7、TM DPST1 ARB CNF TC SXM C 1 1 1 1 XF 1 1 PM立即数寻址在立即数寻址方式中,指令字包含指令要操作的常数。在汇编指令中用#表示后面的数或标识符是一个立即数。有两种类型的立即数寻址方式:短立即数寻址和长立即数寻址。使用短立即数寻址的指令有 8 位、9 位或 13 位常数作为操作数。短立即数指令是单指令字,常数嵌入这个字中。累加器低半字装载指令:LACL #k将 8 位常数 k 装入累加器低 16 位,不管 SXM 为 0 或 1,不作符号扩展。例:LACL #18 ; 指令编码 B912LACL #12h ; 不论 SXM 为 0 或 1,ACC 为0x00
8、000012汇编语句格式:标号、操作符、操作数、注释标号: 操作符 操作数 ;注释标号可缺省,此时行首必须是空格或制表符。 “;”至行末为注释,注释可缺省。行首是*则为全行注释。本例 LACL 为操作符,表示装载累加器低半部;#18 为操作数,表示常数18。使用长立即数寻址的指令有一个 16 位的常数作为操作数,需要两个指令字。常数作为第二个指令字传送。这个 16 位值可以用作绝对值常数,也可以作为二进制补码值。累加器装载指令:LACC #lk将 16 位常数 lk 装入累加器。当 SXM 为 0 时,为无符号数,高位补 0;当 SXM 为 1 时,为有符号数,高位符号扩展。例:LACC #1
9、234h ; 指令编码 BF82 1234; 不论 SXM 为 0 或 1,ACC 为0x00001234LACC #8765h ; 指令编码 BF82 8765; 当 SXM 为 0 时,ACC 为 0x00008765; 当 SXM 为 1 时,ACC 为 0xFFFF8765直接寻址直接寻址方式中,数据存储器按 128 字的块寻址,这些块称为数据页(Data Page) 。全部 64K 数据存储器由 512 个数据页构成,编号为 0 到 511。当前数据页由状态寄存器 ST0中的 9 位数据页指针(DP)的值确定。15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
10、ST0 ARP OV OVM1 INTM DPST1 ARB CNF TC SXM C 1 1 1 1 XF 1 1 PM数据页装载指令:LDP #addr将常量 addr 装载到 ST0 的 DP。除了数据页,处理器还必须知道这个页中正引用的特定的字,这由 7 位偏移量确定。偏移量由 IR 寄存器中 7 个最低有效位(LSB)提供,指令寄存器( IR)保存下条要执行指令的操作码。使用直接寻址的指令结构如 图 10 所示,操作数的 16 位地址按 图 11 构成。15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 08 MSBs 0 dma图 10 使用直接寻址的指令结构图
11、 11 直接寻址时的地址构成不必在每条使用直接寻址的指令前设置数据页。如果在一块代码中所有的指令都访问同样的数据页,可以简单地在块之前装入 DP。可是,如果在一块代码中访问不同的数据页,要确保每当访问新的数据页时改变 DP。累加器低半字装载指令:LACL dma将地址 dma 对应的存储单元中存放的 16 位数据装入累加器低 16 位,高 16 位补零,不管SXM 为 0 或 1,不作符号扩展。例:将地址 00FFh 处的内容装 ACC。LDP #(0FFh 7) ; 将 1 装入 DP; 地址范围 0x00800x00FFLACL 0FFh ; 指令编码 697F,编译器自动取低 7位使用符
12、号常量,常用于访问存储器映射的 I/O 地址,如串行通讯口 SCI 的接收缓存地址 0x7057,可以用符号 SCIRXBUF 表示。SCIRXBUF .set 7057h ; SCI Receiver Data Buffer RegisterLDP #(SCIRXBUF 7) ; 将高 9 位 0x0E0 装入 DPLACL SCIRXBUF ; 编译器自动取低 7 位; 读取 SCI 已接收到的内容伪指令:定义符号常量标识符 .set 值用“标识符”表示“值” ,本例 SCIRXBUF 表示 7075h,是串行通信口的接收缓存寄存器。用符号表示常量是一个好的编程习惯,增强程序的可读性,也便
13、于修改常量。使用变量.data ; 以下内容放入 data 节x .int 1234h ; 建立变量 x 并赋初值 0x1234.text ; 以下内容放入 text 节LDP #x ; 编译器自动取高 9 位LACL x ; 编译器自动取低 7 位.end伪指令:指定数据节.data这条伪指令以下的内容在编译时将放在预先定义的名为“data”的节中,在链接时分配存放数据的地址。伪指令:定义 16 位整型变量并赋初值标识符 .int 初值定义名为“标识符”的 16 位整型变量并赋“初值” 。伪指令:指定代码节.text这条伪指令以下的内容在编译时将放在预先定义的名为“text”的节中,在链接时
14、分配存放代码的地址。伪指令:结束汇编源程序.end安装与使用 CCS双击 Setup 按提示操作即可,安装完成后首次使用前需进行配置,将“C2xx Simulator”拖到左栏就可以在 PC 机上模拟 C2xx 系列单片机了。简介:项目文件、汇编源文件、包含文件、链接命令文件目标程序、CPU 状态图 12 配置 CCS思考题1. 有哪三种寻址方式?2. 指令 LACL #10 与 LACL 10 有什么区别?各为什么寻址方式?含义是什么?3. 指令 LACC #1234h 和 LACC #0ABCDh 执行后累加器 ACC 中为何值?与 SXM 的状态有关吗?4. 要用直接寻址将地址 0x03
15、78 处的值装入累加器,DP 中应装入什么值?指令中包含这个地址的哪几位?3. 寻址方式(下)间接寻址八个辅助寄存器(AR0-AR7)提供了灵活而强有力的间接寻址,64K 数据空间的任何位置都可以用辅助寄存器中的 16 位地址访问。状态寄存器 ST0 的辅助寄存器指针( ARP)位域指定当前辅助寄存器(即当前 AR) 。在指令的处理过程中,当前辅助寄存器的内容用作所访问的数据存储器的地址。15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0ST0 ARP OV OVM1 INTM DPST1 ARB CNF TC SXM C 1 1 1 1 XF 1 1 PM指定当前 A
16、R 指令:MAR *, ARn指定 ARn 为当前 AR,使 ST0 中的 ARP 成为 n(0 至 7) ,同时 ARP 的原值保存到 ST1 的ARB 位域。AR 装载指令:LAR ARn, #Addr将常量 Addr 装载到辅助寄存器 ARn。累加器低半字装载指令:LACL *将当前 AR 中的地址指向的存储单元的 16 位数据装入累加器低 16 位,高 16 位补零。例:将地址 00FFh 处的变量 x 的内容装 ACL。LAR AR2, #0FFh ; 将 0x00FF 装载到 AR2MAR *, AR2 ; 指定 AR2 为当前 ARLACL * ; 指令编码 6980使用变量或符
17、号常量LAR AR2, #x ; 将 x 所代表的地址装载到 AR2如果指令需要从数据存储器读,则 ARAU 将这个地址传给数据读地址总线(DRAB) ;如果指令需要向数据存储器写,则它将这个地址传给数据写地址总线(DWAB) 。移动指针在指令使用了数据值之后,当前辅助寄存器的内容可以由 ARAU 增加或减少,ARAU实现无符号 16 位算术。* 无增量或减量*+ *- 加 1 / 减 1*0+ *0- 按指标量 AR0 增加 / 减少*BR0+ *BR0- 使用反向进位按指标量 AR0 增加 / 减少,用于 FFT例:从前向后访问数组x .int 1, 2, 3, 4 ; int x = 1
18、, 2, 3, 4; 假设 x 的地址是 0x0100LAR AR2, #x ; 将 x 的首地址装载到 AR2 为 0x0100MAR *, AR2 ; 指定 AR2 为当前 ARLACL *+ ; ACC 为 0x00000001, AR2 为 0x0101LACL *+ ; ACC 为 0x00000002, AR2 为 0x0102从后向前访问数组MAR *, AR2 ; 指定 AR2 为当前 ARLAR AR2, #(x+4-1) ; 将 x 的末地址装载到 AR2 为 0x0103LACL *- ; ACC 为 0x00000004, AR2 为 0x0102LACL *- ; A
19、CC 为 0x00000003, AR2 为 0x0101跳过数组中一段MAR *, AR2 ; 指定 AR2 为当前 ARLAR AR0, #2LAR AR2, #x ; 将 x 的首地址装载到 AR2 为 0x0100LACL *0+ ; ACC 为 0x00000001, AR2 为 0x0102LACL *0+ ; ACC 为 0x00000003, AR2 为 0x0104二进制逆序MAR *, AR2 ; 指定 AR2 为当前 ARLAR AR0, #4LAR AR2, #0LACL *BR0+ ; AR2 为 0x0004LACL *BR0+ ; AR2 为 0x0002,向低位
20、进位LACL *BR0+ ; AR2 为 0x0006LACL *BR0+ ; AR2 为 0x0001指定下个辅助寄存器除了更新当前辅助寄存器,一些指令也可以指定下个辅助寄存器,即下个 AR。当指令执行完后,这个寄存器将成为当前辅助寄存器。允许指定下个辅助寄存器的指令将新值装入 ARP。当 ARP 装入这个值时,ARP 的前一个值装入辅助寄存器指针缓存(ARB) 。任何支持间接寻址操作数的指令都可以修改辅助寄存器(除了以立即数为操作数或无操作数的指令外,所有指令都可以用间接寻址。 )支持间接寻址的指令结构如 图 13 所示。15 14 13 12 11 10 9 8 7 6 5 4 3 2
21、1 08 MSBs 1 ARU N NAR位 缩写 说明15:8 8 MSBs 指定指令类型,还包含数据移位的信息。7 指示直接/间接,0/1 = 直接/间接6:4 ARU 辅助寄存器更新码。确定当前辅助寄存器是否增减、如何增减。3 指示下个辅助寄存器,0/1 = ARP 内容不变/变化。2:0 NAR 下个辅助寄存器值。操作数 ARU 说明* 000 无增减*- 001 减 1从当前 AR 值减 1。*+ 010 加 1向当前 AR 值加 1。011 保留*BR0 100 减指标量,减法采用反向借位从当前 AR 值减去 AR0 的值,减法采用反向进位传递。*0- 101 减指标量从当前 AR
22、 值减去 AR0 的值。*0+ 110 加指标量向当前 AR 值加上 AR0 的值。*BR0+ 111 加指标量,加法采用反向进位向当前 AR 值加上 AR0 的值,加法采用反向进位传递。图 13 使用间接寻址的指令结构例:指定下个 ARMAR *, AR2LAR AR2, #100hLAR AR3, #200hLACL *+, AR3 ; AR2 为 0x0101, AR3 仍为 0x0200; ARP 为 3,ARB 为 2快速傅立叶变换时域信号经过傅立叶变换可以分解为一系列余弦信号,这些余弦信号的幅值和相位就是傅立叶变换的结果,幅值随频率的分布称为频谱。图 14 时域信号图 15 频域分
23、解图 16 信号合成图 17 幅频特性图 18 相频特性时间序列 的傅立叶变换为:nx10NnmnmWX其中: Nje2表示顺时钟旋转 圆周的单位矢量。1当 N 是 2 的幂次时,例如 时:87432541642403013 xWxWxxWX mmmmkkkk 0 1 2 3 4 5 6 7二进制正序 000 001 010 011 100 101 110 111二进制逆序 000 100 010 110 001 101 011 1110 4 2 6 1 5 3 7W0W1W2W3-W 0-W 3-W2-W 1图 19 变换基图 20 蝶形计算思考题1. 下列程序执行后,ARP、 ARB、AR
24、2 和 AR3 的值分别是什么?累加器装入的值来自哪个地址?LAR AR2, #100hLAR AR3, #200hMAR *, AR2LACL *+, AR34. 累加器和辅助寄存器操作小数的表示定点处理器不仅可以实现整数运算,还可以实现小数运算。小数点的位置由程序员指定,在输入、输出时相应调整。表 1 16 位无符号定点数格式 0x0001 0x7FFF 0x8000 0xFFFF 说明Q0 1*20 (215-1) *20 215 *20 (216-1) *20 整数Q1 1*2-1 (215-1)*2-1 215*2-1 (216-1)*2-1 1 位小数Q15 1*2-15 (215
25、-1)*2-15 215*2-15 (216-1)*2-15 15 位小数Q16 1*2-16 (215-1)*2-16 215*2-16 (216-1)*2-16 16 位小数表 2 16 位有符号定点数格式 0x0001 0x7FFF 0x8000 0xFFFF 说明Q0 1*20 (215-1) *20 -215*20 -1*20 整数Q1 1*2-1 (215-1)*2-1 -215*2-1 -1*2-1 1 位小数Q15 1*2-15 (215-1)*2-15 -215*2-15 -1*2-15 15 位小数在累加器中指定小数点的位置,比如 Q16。各种格式的 16 位定点数在进入累
26、加器时经过移位可以实现对齐。装载累加器累加器、临时寄存器、输入/输出定标器在 CPU 结构简图中的位置,说明定标器实现移位功能。介绍桶形移位器(Barrel Shifter) ,与移位链相比较,说明其优越性。图 21 不移位、不作符号扩展图 22 左移 2 位、不作符号扩展图 23 左移 2 位、作符号扩展累加器装载指令:助记符 操作数 周期 编码 附加字LACC dma , SHFTind , SHFT , ARn1 0001 SHFT IAAA AAAALACC dma, 16ind, 16 , ARn1 0110 1010 IAAA AAAA将存储单元的 16 位数据左移 0 至 16
27、位装入累加器,按 SXM 确定是否符号扩展。助记符 操作数 周期 编码 附加字LACC #lk , SHFT 2 1011 1111 1000 SHFT (lk)将长立即数左移 0 至 15 位装入累加器,按 SXM 确定是否符号扩展。助记符 操作数 周期 编码 附加字LACT dmaind , ARn1 0110 1011 IAAA AAAA将存储单元的 16 位数据按 TREG 低 4 位指定左移 0 至 15 位装入累加器,按 SXM 确定是否符号扩展。可用于实现装载浮点数。累加器低半字装载指令:助记符 操作数 周期 编码 附加字LACL dmaind , ARn1 0110 1001
28、IAAA AAAA将存储单元的 16 位数据装入累加器低 16 位,高 16 位补零。助记符 操作数 周期 编码 附加字LACL #k 1 1011 1001 KKKK KKKK将短立即数装入累加器低 16 位,高 16 位补零。累加器高半字装载并圆整指令:助记符 操作数 周期 编码 附加字ZALR dmaind , ARn1 0110 1000 IAAA AAAA将存储单元的 16 位数据装入累加器高 16 位,低 16 位为 0x8000。累加器内容表示 Q16 定点数,相当于加上 0.5。保存累加器累加器低半字保存指令:助记符 操作数 周期 编码 附加字SACL dma , SHFind
29、 , SHF , ARn1 1001 0SHF IAAA AAAA将累加器内容左移 0 至 7 位后取其低 16 位保存到存储单元。移位时高位丢弃,低位补零。累加器自身保持不变累加器高半字保存指令:助记符 操作数 周期 编码 附加字SACH dma , SHFind , SHF , ARn1 1001 0SHF IAAA AAAA将累加器内容左移 0 至 7 位后取其高 16 位保存到存储单元。移位时高位丢弃,低位补零。累加器自身保持不变注:编写中断服务程序时要保证 CPU 状态不变,可以在中断服务程序入口处保存CPU 状态,在中断服务程序出口处不得 CPU 状态。使用 SACL 和 SACH
30、 可以保存累加器,使用 LACL 恢复累加器低半字,要恢复累加器高半字需要用到加法指令。装载辅助寄存器辅助寄存器装载指令:助记符 操作数 周期 编码 附加字LAR ARn, dmaARn, ind , ARn2 0000 0ARX IAAA AAAA将存储单元的 16 位数据装入指定的辅助寄存器。助记符 操作数 周期 编码 附加字LAR ARn, #k 2 1011 0ARX KKKK KKKKLAR ARn, #lk 2 1011 1111 0000 1ARX (lk)将立即数装入指定的辅助寄存器。注:如果装载当前 AR,则由间接寻址指定的增减不起作用。保存辅助寄存器辅助寄存器保存指令:助记
31、符 操作数 周期 编码 附加字SAR ARn, dmaARn, ind , ARn1 1000 0ARX IAAA AAAA将指定的辅助寄存器内容保存到存储单元。注:如果保存当前 AR,则保存的是由间接寻址指定的增减之前的值。注:使用 SAR 保存辅助寄存器,使用 LAR 恢复辅助寄存器。修改辅助寄存器辅助寄存器操作指令:助记符 操作数 周期 编码 附加字MAR ind , ARn 1 1000 1011 IAAA AAAANOP指令本身无功能,利用间接寻址增减当前 AR,指定下个 AR。任何使用间接寻址的指令都可以实现同样的功能。注:本指令的直接寻址方式助记符为 NOP,表示空操作,用于占用
32、一拍。辅助寄存器加法指令:助记符 操作数 周期 编码 附加字ADRK #k 1 0111 1000 KKKK KKKK当前 AR 加上无符号立即数,由 ARAU 执行。辅助寄存器减法指令:助记符 操作数 周期 编码 附加字SBRK #k 1 0111 1100 KKKK KKKK当前 AR 减去无符号立即数,由 ARAU 执行。思考题1. 累加器中 0x12345678 除了表示整数外还可以表示小数,如果是 Q31 格式表示什么?如果是 Q16 格式呢?2. 16 位数 0x1234 左移 0 至 15 位可以表示哪些整数?如果是 Q31 格式可以表示哪些小数?如果是 Q16 格式呢?3. 指
33、令 LACC #1234h, 2 和指令 LACC #0ABCDh, 2 执行后累加器 ACC 中为何值?与SXM 的状态有关吗?4. 累加器中是 0x12345678,指令 SACH *, 2 和指令 SACL *, 2 分别保存的是什么值?指令执行后,累加器中是什么值?5. 加法运算长整数32 位有符号数,低 16 位无符号,高 16 位有符号:LHLH xSxSx 16151631 2264 位有符号数,低 3 段 16 位无符号,最高 16 位有符号: LLHHLHxxS16321614862累加器 32 位,存储器和总线 16 位。长整数分段存放在存储器中。小端格式,低位字在低地址,
34、高位字在高地址。优点:值相同时,与短整数兼容。缺点:符号位的位置与长度有关。大端格式,高位字在低地址,低位字在高地址。优点:符号位的位置固定。缺点:与短整数不兼容。CPU 一次可以存取多个存储单元时,大小端定义与 CPU 结构相关。如 80x86 是小端格式,而 ARM 则同时支持大端和小端两种格式。24x 系列 CPU 一次只能存取一个存储单元,大小端定义与 CPU 结构无关,此时大小端格式由软件选择,通常选择小端格式。多倍精度计算从存储器和总线宽度来看,多于 16 位的计算都属于多倍精度计算,需分多次进行。而从累加器和 CALU 的宽度来看,多于 32 位的计算才属于多倍精度计算,此时需要
35、考虑进位/借位。32 位加法分 3 次进行,低 16 位相加,与 x 高 16 位相加,再与 y 高 16 位相加:0:15:16:316:2yyxy从算术的角度来看,每一位相加都可能产生进位,但这些进位都在累加器中,只有超出累加器的进位才是计算机中的进位。可以将进位位和累加器合并看作 33 位寄存器。由于计算机中数的表示范围是有限的,用二进制补码表示有符号数时可以看作一个环,最小的负数与最大的正数是相邻的,如 32 位最大正数 0x7FFFFFFF 与最小负数0x80000000 是相邻的。加减法的结果越过这个边界就发生了溢出。严格的定义是无进位/借位而向符号位进位/借位时就发生了溢出。直观
36、的解释是正数增大变成负数,或是负数减小变成正数,这时就发生了溢出。由于溢出时,数值发生了很大的跳变,在控制等应用领域会产生严重的后果,这时希望结果能“温和”一点,可以采用饱和的方式。即正数增加到最大为止,负数减少到最小为止。15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0ST0 ARP OV OVM1 INTM DPST1 ARB CNF TC SXM C 1 1 1 1 XF 1 1 PM16 位加法例:直接寻址.datax .int 2y .int 3z .int 0, 0 ; 要保证在同一数据页.textCLRC SXM ; 以下为无符号运算LDP #x ; 装
37、载地址高 9 位LACC x ; 装载 x 到累加器LDP #yADD y ; y 加到累加器LDP #zSACL z ; 保存结果低 16 位SACH z+1 ; 保存结果高 16 位L B L ; 在此死循环.end例:间接寻址SETC SXM ; 以下为有符号运算MAR *, AR2 ; 指定 AR2 为当前 ARLAR AR2, #x ; 将 x 的地址装载到 AR2LAR AR3, #yLACC *, AR3 ; 装载 x 到累加器,下个 AR 为 AR3ADD * ; y 加到累加器LAR AR3, #zSACL *+ ; 保存结果低 16 位,移动 AR3SACH ; 保存结果高
38、 16 位装载 32 位数例:间接寻址MAR *, AR2 ; 指定 AR2 为当前 ARLAR AR2, #x ; 将 x 的地址装载到 AR2LACL *+ ; x 低 16 位装载到累加器低 16 位ADD *, 16 ; x 高 16 位加到累加器高 16 位32 位加法例:间接寻址MAR *, AR2 ; 指定 AR2 为当前 ARLAR AR2, #x ; 将 x 的地址装载到 AR2LAR AR3, #y ; 将 y 的地址装载到 AR3LAR AR4, #z ; 将 z 的地址装载到 AR4LACL *+, AR3 ; xL 装载到累加器低半,无符号ADDS *+, AR2 ;
39、 yL 加到累加器低半,无符号ADD *+, 16, AR3 ; xH 加到累加器高半,可能进位ADD *+, 16, AR4 ; yH 加到累加器高半,可能进位SACL *+ ; 保存 zLSACH *+, AR2 ; 保存 zH64 位加法例:间接寻址,完成低 32 位加法后,再进行高 32 位加法LACL *+, AR3 ; xHL,无符号ADDC *+, AR2 ; yHL,无符号,带进位 CADD *, 16, AR3 ; xHH 加到累加器高半,可能进位ADD *, 16, AR4 ; yHH 加到累加器高半,可能进位加法指令加法指令:助记符 操作数 周期 编码 附加字ADD dm
40、a , SHFTind , SHFT , ARn1 0010 SHFT IAAA AAAAADD dma, 16ind, 16 , ARn1 0110 0001 IAAA AAAA将存储单元的 16 位数据左移 0 至 16 位加到累加器,按 SXM 确定是否符号扩展。助记符 操作数 周期 编码 附加字ADD #lk , SHFT 2 1011 1111 1001 SHFT (lk)将长立即数左移 0 至 15 位加到累加器,按 SXM 确定是否符号扩展。助记符 操作数 周期 编码 附加字ADD #k 1 1011 1000 KKKK KKKK将短立即数加到累加器,按 SXM 确定是否符号扩展
41、。助记符 操作数 周期 编码 附加字ADDT dmaind , ARn1 0110 0011 IAAA AAAA将存储单元的 16 位数据按 TREG 低 4 位指定左移 0 至 15 位后加到累加器,按 SXM 确定是否符号扩展。例:乘以 3LACC x ; x 装载到累加器ADD x, 1 ; 2x 加到累加器例:乘以 6LACC x, 1 ; 2x 装载到累加器ADD x, 2 ; 4x 加到累加器抑制符号扩展加法指令:助记符 操作数 周期 编码 附加字ADDS dmaind , ARn1 0110 0010 IAAA AAAA带进位加法指令:助记符 操作数 周期 编码 附加字ADDC
42、dmaind , ARn1 0110 0000 IAAA AAAA同 ADDS,但加上 C。思考题1. 累加器中原为 0x0000ABCD,与 0x6789 相加后,C 和 OV 有什么变化?2. 累加器中原为 0xFFFFABCD,与 0x6789 相加后,C 和 OV 有什么变化?3. 累加器中原为 0x7FFFABCD,与 0x6789 相加后,C 和 OV 有什么变化?4. 累加器中原为 0x7FFFFFFE,加 2 后,累加器中是什么值?与 OVM 有什么关系?5. 累加器中原为 0xFFFFABCD,与 0x8888 相加后,再与 0x1234 相加,C 和 OV 的值是什么?与我
43、们所希望的结果相同吗?6. 完成下列 32 位加法程序:.datax .int 78h, 56h, 34h, 12hy .int 0EFh, 0CDh, 0ABh, 9hz .int 0, 0, 0, 0.textLAR AR2, #xLAR AR3, #yLAR AR2, #zSACL *+SACH *.end7. 接着上题完成 64 位加法程序。6. 减法与除法运算16 位减法例:直接寻址LDP #x ; 装载地址高 9 位LACC x ; 装载 x 到累加器SUB y ; 从累加器减去 y,与 x 在同一 DP减法与借位用条件减法实现除法单指令重复C 程序编译结果本次课小结分类 助记符
44、寻址方式 移位 说明减法 SUB 直接/间接 015,16 从 ACC 减长立即数 015短立即数 8 位无符号SUBT 直接/间接 015 由 TREG 低 4 位指定移位SUBS 直接/间接 抑制符号扩展SUBB 带借位除法 SUBC 直接/间接 条件减,用于单步除法其它控制 RPT 直接/间接 重复下条指令短立即数 8 位7. 乘法运算乘法器、临时寄存器、乘积寄存器、乘积定标器乘积移位方位式控制位 PM有符号数与无符号数的乘法例:16 位有符号整数乘法LT x ; x 装载到 TREGMPY y ; TREG 与 y 相乘,结果 32 位在 PREGSPM 0 ; 整数结果 Q0SPL
45、zL ; 保存低 16 位SPH zH ; 保存高 16 位例:16 位有符号纯小数乘法LT x ; x 装载到 TREGMPY y ; TREG 与 y 相乘,结果 32 位在 PREGSPM 1 ; 纯小数结果 Q30 转换为 Q31SPL zL ; 保存低 16 位SPH zH ; 保存高 16 位例:乘以 13 位有符号纯小数常值LT x ; x 装载到 TREGMPY #800h ; 13 位有符号立即数 Q12SPM 2 ; 纯小数结果 Q27 转换为 Q31SPL zL ; 保存低 16 位SPH zH ; 保存高 16 位例:16 位有无符号整数或纯小数乘法LT x ; x 装
46、载到 TREGMPYU y ; TREG 与 y 相乘,结果 32 位在 PREGSPM 0 ; 整数结果 Q0 或纯小数 Q32SPL zL ; 保存低 16 位SPH zH ; 保存高 16 位例:16 位有符号纯小数连续乘加MAR AR2 ; 指定当前 ARLAR AR2, #x ; AR2 指向 x LAR AR3, #y ; AR3 指向 y LACL #0 ; 累加器清零SPM 3 ; 准备累加 128 项,每次乘积为 Q24LT *+, AR3 ; x0装入 TREGMPY *+, AR2 ; TREG 乘以 y0,结果在 PREGLT *+, AR3 ; x1装入 TREGMP
47、YA *+, AR2 ; 乘以 y1,原 PREG 加到 ACCLT *+, AR3 ; x127装入 TREGMPYA *+, AR2 ; 乘以 y127,原 PREG 加到 ACCAPAC ; 最后一次积加到 ACC,结果 Q保存乘法器的状态SPM 0 ; 乘积不移位SPH *+ ; 保存 PREG_HSPL *+ ; 保存 PREG_LMPY #1h ; 使 TREG 到 PREG_LSPL *+ ; 保存 TREG恢复乘法器的状态MAR *- ; 跳过 TREGLT *+ ; 恢复 PREG_LMPY #1LT *- ; 恢复 TREGMAR *- ; 跳过 PREG_LLPH *-
48、; 恢复 PREG_H32 位乘法LT * ; yHSACL * ; xLMPY *- ; xL * yHLT * ; yLSACH * ; xHPAC ; ACC = xL * yHMPY * ; xH * yLAPAC ; xH * yL + xL * yHSACL *LACC *+, 16 ; (xH * yL + xL * yH) 16MPYU * ; xL * yLAPAC ; ACC += xL * yL本次课小结分类 助记符 寻址方式 移位 说明乘法 MPY 直接/间接 与 TREG 相乘短立即数 13 位无符号MPYU 直接/间接 无符号乘加/乘减 MAC 直接/间接 两数相乘
49、,前次积加到 ACCMACD 带数据移动MPYA 与 TREG 相乘,前次积加到 ACCMPYS 前次积从 ACC 减SQRA 乘方,前次积加到 ACCSQRS 前次积从 ACC 减状态寄存器 SPM 设置乘积移位方式临时寄存器 LT 直接/间接 装载 TREGLTA 前次积加到 ACCLTS 前次积从 ACC 减LTD 前次积加到 ACC,移动数据LTP 前次积装载到 ACC乘积寄存器 SPL 直接/间接 保存 PREG 低半部SPH 保存 PREG 高半部LPH 装载 PREG 高半部PAC PREG 移到 ACCAPAC PREG 加到 ACCSPAC PREG 从 ACC 减思考题1. 乘法指令为什么要区分有符号数和无符号数?2. MPY 指令的一个乘数由寻址方式得到,另一个乘数在哪里?两个乘数各为多少位?乘积放在哪里?乘积是多少位?3. 为什么要对乘积移位?有哪几种选择?各有什么用途?4. 采用间接寻址,写出保存与恢复 TREG 和 PREG 的程序。5.