1、 1. 引言 计算机的基本结构 主机、输入设备、输出设备、存储设备、通信接口 计算机的抽象结构 CPU、总线、存储器和寄存器,通过寄存器操作周边设备 图 1 计算机的抽象结构 存储器结构 存储单元(地址、值) 单片机 通常没有键盘和显示器这样的输入输出设备 依靠宿主机进行开发,通过通讯电缆连接 DSP DSP是Digital Signal Processor(数字信号处理器)的缩写,它是专门为支持计算密集型应用而设计的特殊CPU,采用多总线结构,有独立乘法器支持高速乘加运算,通常还支持特殊寻址方式用于FFT(Fast Fourier Transform)。 普
2、通的CPU采用冯·诺伊曼(Von Neumann)结构,程序和数据是不加区分的,它们都通过唯一的一条总线来访问。DSP采用哈佛(Harvard)结构,程序和数据各占一个地址空间,有两条总线分别为程序和数据提供通道。程序空间也可以存放常数 总线结构 数据线、地址线、控制线 程序读总线 地址 PAB 数据 PRDB 数据读总线 地址 DRAB 数据 DRDB 数据写总线 地址 DWAB 数据 DWEB 图 2 总线结构 流水线操作 取指、译码、取操作数、执行 图 3 流水线操作 最小系统 电源、晶振 图 4 最小系统实验板 图 5 电源
3、部分电原理图 图 6 晶体振荡器部分电原理图 图 7 印刷电路板图 CPU的基本组成结构框图 控制单元、16位数据总线、32位累加器ACC、中央算术逻辑单元CALU、乘法单元、辅助寄存器算术单元ARAU 主线:存储器、输入定标器、中央算术逻辑单元、累加器、输出定标器 乘法器:经过乘积定标到总线或CALU 图 8 CPU结构简图 思考题 1. 一个存储单元有哪两个属性?寄存器与存储器有什么不同? 2. 由单片机构成的最小系统有哪几部分构成? 3. DSP是哪三个英文词的缩写?中文意义是什么? 4. 哈佛结构计算机与冯·诺伊曼结构计算机有什么差别? 5.
4、 微控制器与微处理器有什么不同? 6. TMS320LF24xA系列单片机有几套总线?分别起什么作用?总线中数据线和地址线分别有多少条?最大可以访问多少存储单元?每个存储单元由多少位组成? 7. 什么是操作码?什么是操作数? 8. 实现一条指令的功能要经过哪四个阶段?CPU为什么要采用流水线结构? 图 9 CPU结构图 2. 寻址方式(上) 数据的存取 计算机中要处理的数据总是存放在存储单元中。 读取Read(也称为载入Load)是将数据从存储单元取到CPU的寄存器中,或是与CPU的寄存器进行运算。 写入Write(也称为保存Store)是将数据从CPU的寄
5、存器放回到存储单元。 三种寻址方式 立即数寻址方式(Immediate Addressing Mode):操作数是常数,只能读取,存放在指令字中。 直接寻址方式(Direct Addressing Mode):操作数是存储单元,可读写,地址在指令字中。 间接寻址方式(Indirect Addressing Mode):操作数是存储单元,可读写,地址在辅助寄存器中。 负数的表示 16位二进制补码 无符号数 0x0000~0xFFFF(0~65535) 有符号正数 0x0000~0x7FFF(0~32767) 有符号负数 0x8000~0xFFFF(-32768~-1) 负数的
6、三种表示(以-1为例) 原码表示0x8001 反码表示0xFFFE 补码表示0xFFFF 0x0000的反码是0xFFFF,补码 = 反码 + 1 符号扩展 二进制补码(以-7为例) 4位表示为0x9,解释为0x9 - 0x10 8位表示为0xF9,解释为0xF9 - 0x100 规律:最高位(符号位)向上扩展 -128 … -8 -7 … -1 0 1 … 6 7 8 … 127 4位 8 9 … F 0 1 … 6 7 8位 80 … F8 F9 … FF 00 01 …
7、06 07 08 … 7F 数的表示范围、溢出的概念 例:4位二进制补码的表示范围是-8到7,7加1或-8减1会发生溢出。而8位二进制补码的表示范围增大到-128到127,此时7加1或-8减1并不会发生溢出。 状态与控制寄存器ST0与ST1,每次全部列出,遇到一个介绍一个,先介绍SXM 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ST0 ARP OV OVM 1 INTM DP ST1 ARB CNF TC SXM C 1 1 1 1 XF 1 1 PM 立即数
8、寻址 在立即数寻址方式中,指令字包含指令要操作的常数。在汇编指令中用#表示后面的数或标识符是一个立即数。 有两种类型的立即数寻址方式:短立即数寻址和长立即数寻址。 使用短立即数寻址的指令有8位、9位或13位常数作为操作数。短立即数指令是单指令字,常数嵌入这个字中。 累加器低半字装载指令: LACL #k 将8位常数k装入累加器低16位,不管SXM为0或1,不作符号扩展。 例: LACL #18 ; 指令编码B912 LACL #12h ; 不论SXM为0或1,ACC为0x00000012 汇编语句格式:标号、操作符、操作数、注释 [标
9、号:] 操作符 操作数 [;注释] 标号可缺省,此时行首必须是空格或制表符。“;”至行末为注释,注释可缺省。行首是*则为全行注释。本例LACL为操作符,表示装载累加器低半部;#18为操作数,表示常数18。 使用长立即数寻址的指令有一个16位的常数作为操作数,需要两个指令字。常数作为第二个指令字传送。这个16位值可以用作绝对值常数,也可以作为二进制补码值。 累加器装载指令: LACC #lk 将16位常数lk装入累加器。当SXM为0时,为无符号数,高位补0;当SXM为1时,为有符号数,高位符号扩展。 例: LACC #1234h ; 指令编码BF
10、82 1234 ; 不论SXM为0或1,ACC为0x00001234 LACC #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 ST0 AR
11、P OV OVM 1 INTM DP ST1 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
12、1 0 8 MSBs 0 dma 图 10 使用直接寻址的指令结构 图 11 直接寻址时的地址构成 不必在每条使用直接寻址的指令前设置数据页。如果在一块代码中所有的指令都访问同样的数据页,可以简单地在块之前装入DP。可是,如果在一块代码中访问不同的数据页,要确保每当访问新的数据页时改变DP。 累加器低半字装载指令: LACL dma 将地址dma对应的存储单元中存放的16位数据装入累加器低16位,高16位补零,不管SXM为0或1,不作符号扩展。 例:将地址00FFh处的内容装ACC。 LDP #(0FFh >> 7) ; 将1装入DP
13、 ; 地址范围0x0080~0x00FF LACL 0FFh ; 指令编码697F,编译器自动取低7位 使用符号常量,常用于访问存储器映射的I/O地址,如串行通讯口SCI的接收缓存地址0x7057,可以用符号SCIRXBUF表示。 SCIRXBUF .set 7057h ; SCI Receiver Data Buffer Register LDP #(SCIRXBUF >> 7) ; 将高9位0x0E0装入DP LACL SCIRXBUF ; 编译器自动取低7位 ; 读取SCI已接收到的内容 伪指令:定义符号常量 标识符 .set 值
14、 用“标识符”表示“值”,本例SCIRXBUF表示7075h,是串行通信口的接收缓存寄存器。用符号表示常量是一个好的编程习惯,增强程序的可读性,也便于修改常量。 使用变量 .data ; 以下内容放入data节 x .int 1234h ; 建立变量x并赋初值0x1234 .text ; 以下内容放入text节 LDP #x ; 编译器自动取高9位 LACL x ; 编译器自动取低7位 .end 伪指令:指定数据节 .data 这条伪指令以下的内容在编译时将放在预先定义的名为“data”的节中,
15、在链接时分配存放数据的地址。 伪指令:定义16位整型变量并赋初值 标识符 .int 初值 定义名为“标识符”的16位整型变量并赋“初值”。 伪指令:指定代码节 .text 这条伪指令以下的内容在编译时将放在预先定义的名为“text”的节中,在链接时分配存放代码的地址。 伪指令:结束汇编源程序 .end 安装与使用CCS 双击Setup按提示操作即可,安装完成后首次使用前需进行配置,将“C2xx Simulator”拖到左栏就可以在PC机上模拟C2xx系列单片机了。 简介:项目文件、汇编源文件、包含文件、链接命令文件 目标程序、
16、CPU状态 图 12 配置CCS 思考题 1. 有哪三种寻址方式? 2. 指令LACL #10与LACL 10有什么区别?各为什么寻址方式?含义是什么? 3. 指令LACC #1234h和LACC #0ABCDh执行后累加器ACC中为何值?与SXM的状态有关吗? 4. 要用直接寻址将地址0x0378处的值装入累加器,DP中应装入什么值?指令中包含这个地址的哪几位? 3. 寻址方式(下) 间接寻址 八个辅助寄存器(AR0-AR7)提供了灵活而强有力的间接寻址,64K数据空间的任何位置都可以用辅助寄存器中的16位地址访问。 状态寄存器ST0的辅助寄存器指针(ARP)位
17、域指定当前辅助寄存器(即当前AR)。在指令的处理过程中,当前辅助寄存器的内容用作所访问的数据存储器的地址。 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ST0 ARP OV OVM 1 INTM DP ST1 ARB CNF TC SXM C 1 1 1 1 XF 1 1 PM 指定当前AR指令: MAR *, ARn 指定ARn为当前AR,使ST0中的ARP成为n(0至7),同时ARP的原值保存到ST1的ARB位域。 AR装载指令: LAR AR
18、n, #Addr 将常量Addr装载到辅助寄存器ARn。 累加器低半字装载指令: LACL * 将当前AR中的地址指向的存储单元的16位数据装入累加器低16位,高16位补零。 例:将地址00FFh处的变量x的内容装ACL。 LAR AR2, #0FFh ; 将0x00FF装载到AR2 MAR *, AR2 ; 指定AR2为当前AR LACL * ; 指令编码6980 使用变量或符号常量 LAR AR2, #x ; 将x所代表的地址装载到AR2 如果指令需要从数据存储器读,则ARAU将这个地址传给数据读地址总线(DR
19、AB);如果指令需要向数据存储器写,则它将这个地址传给数据写地址总线(DWAB)。 移动指针 在指令使用了数据值之后,当前辅助寄存器的内容可以由ARAU增加或减少,ARAU实现无符号16位算术。 * 无增量或减量 *+ *- 加1 / 减1 *0+ *0- 按指标量AR0增加 / 减少 *BR0+ *BR0- 使用反向进位按指标量AR0增加 / 减少,用于FFT 例:从前向后访问数组 x .int 1, 2, 3, 4 ; int x[] = {1, 2, 3, 4}; ; 假设x的地址是0x0100 LAR AR2, #x
20、 ; 将x的首地址装载到AR2为0x0100 MAR *, AR2 ; 指定AR2为当前AR LACL *+ ; ACC为0x00000001, AR2为0x0101 LACL *+ ; ACC为0x00000002, AR2为0x0102 从后向前访问数组 MAR *, AR2 ; 指定AR2为当前AR LAR AR2, #(x+4-1) ; 将x的末地址装载到AR2为0x0103 LACL *- ; ACC为0x00000004, AR2为0x0102 LACL *- ; ACC为0x00000003, AR2为0x
21、0101 跳过数组中一段 MAR *, AR2 ; 指定AR2为当前AR LAR AR0, #2 LAR AR2, #x ; 将x的首地址装载到AR2为0x0100 LACL *0+ ; ACC为0x00000001, AR2为0x0102 LACL *0+ ; ACC为0x00000003, AR2为0x0104 二进制逆序 MAR *, AR2 ; 指定AR2为当前AR LAR AR0, #4 LAR AR2, #0 LACL *BR0+ ; AR2为0x0004 LACL *BR0
22、 ; AR2为0x0002,向低位进位 LACL *BR0+ ; AR2为0x0006 LACL *BR0+ ; AR2为0x0001 指定下个辅助寄存器 除了更新当前辅助寄存器,一些指令也可以指定下个辅助寄存器,即下个AR。当指令执行完后,这个寄存器将成为当前辅助寄存器。 允许指定下个辅助寄存器的指令将新值装入ARP。当ARP装入这个值时,ARP的前一个值装入辅助寄存器指针缓存(ARB)。 任何支持间接寻址操作数的指令都可以修改辅助寄存器(除了以立即数为操作数或无操作数的指令外,所有指令都可以用间接寻址。) 支持间接寻址的指令结构如图 13所示。
23、15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 8 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。
24、 *+ 010 加1 向当前AR值加1。 011 保留 *BR0 100 减指标量,减法采用反向借位 从当前AR值减去AR0的值,减法采用反向进位传递。 *0- 101 减指标量 从当前AR值减去AR0的值。 *0+ 110 加指标量 向当前AR值加上AR0的值。 *BR0+ 111 加指标量,加法采用反向进位 向当前AR值加上AR0的值,加法采用反向进位传递。 图 13 使用间接寻址的指令结构 例:指定下个AR MAR *, AR2 LAR AR2, #100h LAR AR3, #200h
25、 LACL *+, AR3 ; AR2为0x0101, AR3仍为0x0200 ; ARP为3,ARB为2 快速傅立叶变换 时域信号经过傅立叶变换可以分解为一系列余弦信号,这些余弦信号的幅值和相位就是傅立叶变换的结果,幅值随频率的分布称为频谱。 图 14 时域信号 图 15 频域分解 图 16 信号合成 图 17 幅频特性 图 18 相频特性 时间序列的傅立叶变换为: 其中: 表示顺时钟旋转圆周的单位矢量。 当N是2的幂次时,例如时: 0 1 2 3 4 5 6 7 二进制正序 000 001
26、010 011 100 101 110 111 二进制逆序 000 100 010 110 001 101 011 111 0 4 2 6 1 5 3 7 W 0 W 1 W 2 W 3 -W 0 -W 3 -W 2 -W 1 图 19 变换基 图 20 蝶形计算 思考题 1. 下列程序执行后,ARP、ARB、AR2和AR3的值分别是什么?累加器装入的值来自哪个地址? LAR AR2, #100h LAR AR3, #200h MAR *, AR2 LACL *+, AR3 4
27、 累加器和辅助寄存器操作 小数的表示 定点处理器不仅可以实现整数运算,还可以实现小数运算。小数点的位置由程序员指定,在输入、输出时相应调整。 表 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-1)*2-15 215*2-15 (216-1)*2-15 1
28、5位小数 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
29、各种格式的16位定点数在进入累加器时经过移位可以实现对齐。 装载累加器 累加器、临时寄存器、输入/输出定标器在CPU结构简图中的位置,说明定标器实现移位功能。 介绍桶形移位器(Barrel Shifter),与移位链相比较,说明其优越性。 图 21 不移位、不作符号扩展 图 22 左移2位、不作符号扩展 图 23 左移2位、作符号扩展 累加器装载指令: 助记符 操作数 周期 编码 附加字 LACC dma [, SHFT] ind [, SHFT [, ARn]] 1 0001 SHFT IAAA AAAA LACC dma,
30、16 ind, 16 [, ARn] 1 0110 1010 IAAA AAAA 将存储单元的16位数据左移0至16位装入累加器,按SXM确定是否符号扩展。 助记符 操作数 周期 编码 附加字 LACC #lk [, SHFT] 2 1011 1111 1000 SHFT (lk) 将长立即数左移0至15位装入累加器,按SXM确定是否符号扩展。 助记符 操作数 周期 编码 附加字 LACT dma ind [, ARn] 1 0110 1011 IAAA AAAA 将存储单元的16位数据按TREG低4位指定左移0至15位装入累加器,按
31、SXM确定是否符号扩展。可用于实现装载浮点数。 累加器低半字装载指令: 助记符 操作数 周期 编码 附加字 LACL dma ind [, ARn] 1 0110 1001 IAAA AAAA 将存储单元的16位数据装入累加器低16位,高16位补零。 助记符 操作数 周期 编码 附加字 LACL #k 1 1011 1001 KKKK KKKK 将短立即数装入累加器低16位,高16位补零。 累加器高半字装载并圆整指令: 助记符 操作数 周期 编码 附加字 ZALR dma ind [, ARn] 1 0110 1
32、000 IAAA AAAA 将存储单元的16位数据装入累加器高16位,低16位为0x8000。累加器内容表示Q16定点数,相当于加上0.5。 保存累加器 累加器低半字保存指令: 助记符 操作数 周期 编码 附加字 SACL dma [, SHF] ind [, SHF [, ARn]] 1 1001 0SHF IAAA AAAA 将累加器内容左移0至7位后取其低16位保存到存储单元。移位时高位丢弃,低位补零。累加器自身保持不变 累加器高半字保存指令: 助记符 操作数 周期 编码 附加字 SACH dma [, SHF] ind [, S
33、HF [, ARn]] 1 1001 0SHF IAAA AAAA 将累加器内容左移0至7位后取其高16位保存到存储单元。移位时高位丢弃,低位补零。累加器自身保持不变 注:编写中断服务程序时要保证CPU状态不变,可以在中断服务程序入口处保存CPU状态,在中断服务程序出口处不得CPU状态。使用SACL和SACH可以保存累加器,使用LACL恢复累加器低半字,要恢复累加器高半字需要用到加法指令。 装载辅助寄存器 辅助寄存器装载指令: 助记符 操作数 周期 编码 附加字 LAR ARn, dma ARn, ind [, ARn] 2 0000 0ARX IAAA A
34、AAA 将存储单元的16位数据装入指定的辅助寄存器。 助记符 操作数 周期 编码 附加字 LAR ARn, #k 2 1011 0ARX KKKK KKKK LAR ARn, #lk 2 1011 1111 0000 1ARX (lk) 将立即数装入指定的辅助寄存器。 注:如果装载当前AR,则由间接寻址指定的增减不起作用。 保存辅助寄存器 辅助寄存器保存指令: 助记符 操作数 周期 编码 附加字 SAR ARn, dma ARn, ind [, ARn] 1 1000 0ARX IAAA AAAA 将指定的辅助寄存器内容保
35、存到存储单元。 注:如果保存当前AR,则保存的是由间接寻址指定的增减之前的值。 注:使用SAR保存辅助寄存器,使用LAR恢复辅助寄存器。 修改辅助寄存器 辅助寄存器操作指令: 助记符 操作数 周期 编码 附加字 MAR ind [, ARn] 1 1000 1011 IAAA AAAA NOP 指令本身无功能,利用间接寻址增减当前AR,指定下个AR。任何使用间接寻址的指令都可以实现同样的功能。 注:本指令的直接寻址方式助记符为NOP,表示空操作,用于占用一拍。 辅助寄存器加法指令: 助记符 操作数 周期 编码 附加字 ADR
36、K #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. 指令LACC #1234h, 2和指令LACC #
37、0ABCDh, 2执行后累加器ACC中为何值?与SXM的状态有关吗? 4. 累加器中是0x12345678,指令SACH *, 2和指令SACL *, 2分别保存的是什么值?指令执行后,累加器中是什么值? 5. 加法运算 长整数 32位有符号数,低16位无符号,高16位有符号: 64位有符号数,低3段16位无符号,最高16位有符号: 累加器32位,存储器和总线16位。长整数分段存放在存储器中。 小端格式,低位字在低地址,高位字在高地址。优点:值相同时,与短整数兼容。缺点:符号位的位置与长度有关。 大端格式,高位字在低地址,低位字在高地址。优点:符号位的位置固定。缺点
38、与短整数不兼容。 CPU一次可以存取多个存储单元时,大小端定义与CPU结构相关。如80x86是小端格式,而ARM则同时支持大端和小端两种格式。24x系列CPU一次只能存取一个存储单元,大小端定义与CPU结构无关,此时大小端格式由软件选择,通常选择小端格式。 多倍精度计算 从存储器和总线宽度来看,多于16位的计算都属于多倍精度计算,需分多次进行。而从累加器和CALU的宽度来看,多于32位的计算才属于多倍精度计算,此时需要考虑进位/借位。 32位加法分3次进行,低16位相加,与x高16位相加,再与y高16位相加: 从算术的角度来看,每一位相加都可能产生进位,但这些进位都在累加器中,
39、只有超出累加器的进位才是计算机中的进位。可以将进位位和累加器合并看作33位寄存器。 由于计算机中数的表示范围是有限的,用二进制补码表示有符号数时可以看作一个环,最小的负数与最大的正数是相邻的,如32位最大正数0x7FFFFFFF与最小负数0x80000000是相邻的。加减法的结果越过这个边界就发生了溢出。严格的定义是无进位/借位而向符号位进位/借位时就发生了溢出。直观的解释是正数增大变成负数,或是负数减小变成正数,这时就发生了溢出。 由于溢出时,数值发生了很大的跳变,在控制等应用领域会产生严重的后果,这时希望结果能“温和”一点,可以采用饱和的方式。即正数增加到最大为止,负数减少到最小为止。
40、 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ST0 ARP OV OVM 1 INTM DP ST1 ARB CNF TC SXM C 1 1 1 1 XF 1 1 PM 16位加法 例:直接寻址 .data x .int 2 …… y .int 3 …… z .int 0, 0 ; 要保证在同一数据页 .text CLRC SXM ; 以下为无符号运算 LDP #x ;
41、装载地址高9位 LACC x ; 装载x到累加器 LDP #y ADD y ; y加到累加器 LDP #z SACL z ; 保存结果低16位 SACH z+1 ; 保存结果高16位 L B L ; 在此死循环 .end 例:间接寻址 SETC SXM ; 以下为有符号运算 MAR *, AR2 ; 指定AR2为当前AR LAR AR2, #x ; 将x的地址装载到AR2 LAR AR3, #y LACC *, AR3 ; 装载x到累加器,下个AR为AR3
42、 ADD * ; y加到累加器 LAR AR3, #z SACL *+ ; 保存结果低16位,移动AR3 SACH ; 保存结果高16位 装载32位数 例:间接寻址 MAR *, AR2 ; 指定AR2为当前AR LAR AR2, #x ; 将x的地址装载到AR2 LACL *+ ; x低16位装载到累加器低16位 ADD *, 16 ; x高16位加到累加器高16位 32位加法 例:间接寻址 MAR *, AR2 ; 指定AR2为当前AR LAR AR2, #x ; 将x的地址装载
43、到AR2 LAR AR3, #y ; 将y的地址装载到AR3 LAR AR4, #z ; 将z的地址装载到AR4 LACL *+, AR3 ; xL装载到累加器低半,无符号 ADDS *+, AR2 ; yL加到累加器低半,无符号 ADD *+, 16, AR3 ; xH加到累加器高半,可能进位 ADD *+, 16, AR4 ; yH加到累加器高半,可能进位 SACL *+ ; 保存zL SACH *+, AR2 ; 保存zH 64位加法 例:间接寻址,完成低32位加法后,再进行高32位加法 LACL
44、 *+, AR3 ; xHL,无符号 ADDC *+, AR2 ; yHL,无符号,带进位C ADD *, 16, AR3 ; xHH加到累加器高半,可能进位 ADD *, 16, AR4 ; yHH加到累加器高半,可能进位 加法指令 加法指令: 助记符 操作数 周期 编码 附加字 ADD dma [, SHFT] ind [, SHFT [, ARn]] 1 0010 SHFT IAAA AAAA ADD dma, 16 ind, 16 [, ARn] 1 0110 0001 IAAA AAAA 将存储单元的16位数
45、据左移0至16位加到累加器,按SXM确定是否符号扩展。 助记符 操作数 周期 编码 附加字 ADD #lk [, SHFT] 2 1011 1111 1001 SHFT (lk) 将长立即数左移0至15位加到累加器,按SXM确定是否符号扩展。 助记符 操作数 周期 编码 附加字 ADD #k 1 1011 1000 KKKK KKKK 将短立即数加到累加器,按SXM确定是否符号扩展。 助记符 操作数 周期 编码 附加字 ADDT dma ind [, ARn] 1 0110 0011 IAAA AAAA 将存储单元的16位
46、数据按TREG低4位指定左移0至15位后加到累加器,按SXM确定是否符号扩展。 例:乘以3 LACC x ; x装载到累加器 ADD x, 1 ; 2x加到累加器 例:乘以6 LACC x, 1 ; 2x装载到累加器 ADD x, 2 ; 4x加到累加器 抑制符号扩展加法指令: 助记符 操作数 周期 编码 附加字 ADDS dma ind [, ARn] 1 0110 0010 IAAA AAAA 带进位加法指令: 助记符 操作数 周期 编码 附加字 ADDC dma ind [, ARn]
47、 1 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的值是什么?与我们所希望的结果相同吗? 6. 完成下列32位加法程
48、序: .data x .int 78h, 56h, 34h, 12h y .int 0EFh, 0CDh, 0ABh, 9h z .int 0, 0, 0, 0 .text LAR AR2, #x LAR AR3, #y …… LAR AR2, #z SACL *+ SACH * .end 7. 接着上题完成64位加法程序。 6. 减法与除法运算 16位减法 例:直接寻址 LDP #x ; 装载地址高9位 LACC x ; 装载x到累加器 SUB y ; 从累加器减去y,与x在同一DP 减法与借位 用条件减法实现除法 单指
49、令重复 C程序编译结果 本次课小结 分类 助记符 寻址方式 移位 说明 减法 SUB 直接/间接 0~15,16 从ACC减 长立即数 0~15 短立即数 8位无符号 SUBT 直接/间接 0~15 由TREG低4位指定移位 SUBS 直接/间接 抑制符号扩展 SUBB 带借位 除法 SUBC 直接/间接 条件减,用于单步除法 其它控制 RPT 直接/间接 重复下条指令 短立即数 8位 7. 乘法运算 乘法器、临时寄存器、乘积寄存器、乘积定标器
50、 乘积移位方位式控制位PM 有符号数与无符号数的乘法 例:16位有符号整数乘法 LT x ; x装载到TREG MPY y ; TREG与y相乘,结果32位在PREG SPM 0 ; 整数结果Q0 SPL zL ; 保存低16位 SPH zH ; 保存高16位 例:16位有符号纯小数乘法 LT x ; x装载到TREG MPY y ; TREG与y相乘,结果32位在PREG SPM 1 ; 纯小数结果Q30转换为Q31 SPL zL ; 保存低16位 SPH zH ; 保存高16位






