资源描述
1. 引言
计算机的基本结构
主机、输入设备、输出设备、存储设备、通信接口
计算机的抽象结构
CPU、总线、存储器和寄存器,通过寄存器操作周边设备
图 1 计算机的抽象结构
存储器结构
存储单元(地址、值)
单片机
通常没有键盘和显示器这样的输入输出设备
依靠宿主机进行开发,通过通讯电缆连接
DSP
DSP是Digital Signal Processor(数字信号处理器)的缩写,它是专门为支持计算密集型应用而设计的特殊CPU,采用多总线结构,有独立乘法器支持高速乘加运算,通常还支持特殊寻址方式用于FFT(Fast Fourier Transform)。
普通的CPU采用冯·诺伊曼(Von Neumann)结构,程序和数据是不加区分的,它们都通过唯一的一条总线来访问。DSP采用哈佛(Harvard)结构,程序和数据各占一个地址空间,有两条总线分别为程序和数据提供通道。程序空间也可以存放常数
总线结构
数据线、地址线、控制线
程序读总线
地址 PAB
数据 PRDB
数据读总线
地址 DRAB
数据 DRDB
数据写总线
地址 DWAB
数据 DWEB
图 2 总线结构
流水线操作
取指、译码、取操作数、执行
图 3 流水线操作
最小系统
电源、晶振
图 4 最小系统实验板
图 5 电源部分电原理图
图 6 晶体振荡器部分电原理图
图 7 印刷电路板图
CPU的基本组成结构框图
控制单元、16位数据总线、32位累加器ACC、中央算术逻辑单元CALU、乘法单元、辅助寄存器算术单元ARAU
主线:存储器、输入定标器、中央算术逻辑单元、累加器、输出定标器
乘法器:经过乘积定标到总线或CALU
图 8 CPU结构简图
思考题
1. 一个存储单元有哪两个属性?寄存器与存储器有什么不同?
2. 由单片机构成的最小系统有哪几部分构成?
3. DSP是哪三个英文词的缩写?中文意义是什么?
4. 哈佛结构计算机与冯·诺伊曼结构计算机有什么差别?
5. 微控制器与微处理器有什么不同?
6. TMS320LF24xA系列单片机有几套总线?分别起什么作用?总线中数据线和地址线分别有多少条?最大可以访问多少存储单元?每个存储单元由多少位组成?
7. 什么是操作码?什么是操作数?
8. 实现一条指令的功能要经过哪四个阶段?CPU为什么要采用流水线结构?
图 9 CPU结构图
2. 寻址方式(上)
数据的存取
计算机中要处理的数据总是存放在存储单元中。
读取Read(也称为载入Load)是将数据从存储单元取到CPU的寄存器中,或是与CPU的寄存器进行运算。
写入Write(也称为保存Store)是将数据从CPU的寄存器放回到存储单元。
三种寻址方式
立即数寻址方式(Immediate Addressing Mode):操作数是常数,只能读取,存放在指令字中。
直接寻址方式(Direct Addressing Mode):操作数是存储单元,可读写,地址在指令字中。
间接寻址方式(Indirect Addressing Mode):操作数是存储单元,可读写,地址在辅助寄存器中。
负数的表示
16位二进制补码
无符号数 0x0000~0xFFFF(0~65535)
有符号正数 0x0000~0x7FFF(0~32767)
有符号负数 0x8000~0xFFFF(-32768~-1)
负数的三种表示(以-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
…
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位、9位或13位常数作为操作数。短立即数指令是单指令字,常数嵌入这个字中。
累加器低半字装载指令:
LACL
#k
将8位常数k装入累加器低16位,不管SXM为0或1,不作符号扩展。
例:
LACL
#18
; 指令编码B912
LACL
#12h
; 不论SXM为0或1,ACC为0x00000012
汇编语句格式:标号、操作符、操作数、注释
[标号:]
操作符
操作数
[;注释]
标号可缺省,此时行首必须是空格或制表符。“;”至行末为注释,注释可缺省。行首是*则为全行注释。本例LACL为操作符,表示装载累加器低半部;#18为操作数,表示常数18。
使用长立即数寻址的指令有一个16位的常数作为操作数,需要两个指令字。常数作为第二个指令字传送。这个16位值可以用作绝对值常数,也可以作为二进制补码值。
累加器装载指令:
LACC
#lk
将16位常数lk装入累加器。当SXM为0时,为无符号数,高位补0;当SXM为1时,为有符号数,高位符号扩展。
例:
LACC
#1234h
; 指令编码BF82 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
ARP
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
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
; 地址范围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
值
用“标识符”表示“值”,本例SCIRXBUF表示7075h,是串行通信口的接收缓存寄存器。用符号表示常量是一个好的编程习惯,增强程序的可读性,也便于修改常量。
使用变量
.data
; 以下内容放入data节
x
.int
1234h
; 建立变量x并赋初值0x1234
.text
; 以下内容放入text节
LDP
#x
; 编译器自动取高9位
LACL
x
; 编译器自动取低7位
.end
伪指令:指定数据节
.data
这条伪指令以下的内容在编译时将放在预先定义的名为“data”的节中,在链接时分配存放数据的地址。
伪指令:定义16位整型变量并赋初值
标识符
.int
初值
定义名为“标识符”的16位整型变量并赋“初值”。
伪指令:指定代码节
.text
这条伪指令以下的内容在编译时将放在预先定义的名为“text”的节中,在链接时分配存放代码的地址。
伪指令:结束汇编源程序
.end
安装与使用CCS
双击Setup按提示操作即可,安装完成后首次使用前需进行配置,将“C2xx Simulator”拖到左栏就可以在PC机上模拟C2xx系列单片机了。
简介:项目文件、汇编源文件、包含文件、链接命令文件
目标程序、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)位域指定当前辅助寄存器(即当前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
ARn, #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将这个地址传给数据读地址总线(DRAB);如果指令需要向数据存储器写,则它将这个地址传给数据写地址总线(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
; 将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为0x0101
跳过数组中一段
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+
; AR2为0x0002,向低位进位
LACL
*BR0+
; AR2为0x0006
LACL
*BR0+
; AR2为0x0001
指定下个辅助寄存器
除了更新当前辅助寄存器,一些指令也可以指定下个辅助寄存器,即下个AR。当指令执行完后,这个寄存器将成为当前辅助寄存器。
允许指定下个辅助寄存器的指令将新值装入ARP。当ARP装入这个值时,ARP的前一个值装入辅助寄存器指针缓存(ARB)。
任何支持间接寻址操作数的指令都可以修改辅助寄存器(除了以立即数为操作数或无操作数的指令外,所有指令都可以用间接寻址。)
支持间接寻址的指令结构如图 13所示。
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。
*+
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
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
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. 累加器和辅助寄存器操作
小数的表示
定点处理器不仅可以实现整数运算,还可以实现小数运算。小数点的位置由程序员指定,在输入、输出时相应调整。
表 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
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位定点数在进入累加器时经过移位可以实现对齐。
装载累加器
累加器、临时寄存器、输入/输出定标器在CPU结构简图中的位置,说明定标器实现移位功能。
介绍桶形移位器(Barrel Shifter),与移位链相比较,说明其优越性。
图 21 不移位、不作符号扩展
图 22 左移2位、不作符号扩展
图 23 左移2位、作符号扩展
累加器装载指令:
助记符
操作数
周期
编码
附加字
LACC
dma [, SHFT]
ind [, SHFT [, ARn]]
1
0001 SHFT IAAA AAAA
LACC
dma, 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位装入累加器,按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 1000 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 [, SHF [, 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 AAAA
将存储单元的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
将指定的辅助寄存器内容保存到存储单元。
注:如果保存当前AR,则保存的是由间接寻址指定的增减之前的值。
注:使用SAR保存辅助寄存器,使用LAR恢复辅助寄存器。
修改辅助寄存器
辅助寄存器操作指令:
助记符
操作数
周期
编码
附加字
MAR
ind [, ARn]
1
1000 1011 IAAA AAAA
NOP
指令本身无功能,利用间接寻址增减当前AR,指定下个AR。任何使用间接寻址的指令都可以实现同样的功能。
注:本指令的直接寻址方式助记符为NOP,表示空操作,用于占用一拍。
辅助寄存器加法指令:
助记符
操作数
周期
编码
附加字
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. 指令LACC #1234h, 2和指令LACC #0ABCDh, 2执行后累加器ACC中为何值?与SXM的状态有关吗?
4. 累加器中是0x12345678,指令SACH *, 2和指令SACL *, 2分别保存的是什么值?指令执行后,累加器中是什么值?
5. 加法运算
长整数
32位有符号数,低16位无符号,高16位有符号:
64位有符号数,低3段16位无符号,最高16位有符号:
累加器32位,存储器和总线16位。长整数分段存放在存储器中。
小端格式,低位字在低地址,高位字在高地址。优点:值相同时,与短整数兼容。缺点:符号位的位置与长度有关。
大端格式,高位字在低地址,低位字在高地址。优点:符号位的位置固定。缺点:与短整数不兼容。
CPU一次可以存取多个存储单元时,大小端定义与CPU结构相关。如80x86是小端格式,而ARM则同时支持大端和小端两种格式。24x系列CPU一次只能存取一个存储单元,大小端定义与CPU结构无关,此时大小端格式由软件选择,通常选择小端格式。
多倍精度计算
从存储器和总线宽度来看,多于16位的计算都属于多倍精度计算,需分多次进行。而从累加器和CALU的宽度来看,多于32位的计算才属于多倍精度计算,此时需要考虑进位/借位。
32位加法分3次进行,低16位相加,与x高16位相加,再与y高16位相加:
从算术的角度来看,每一位相加都可能产生进位,但这些进位都在累加器中,只有超出累加器的进位才是计算机中的进位。可以将进位位和累加器合并看作33位寄存器。
由于计算机中数的表示范围是有限的,用二进制补码表示有符号数时可以看作一个环,最小的负数与最大的正数是相邻的,如32位最大正数0x7FFFFFFF与最小负数0x80000000是相邻的。加减法的结果越过这个边界就发生了溢出。严格的定义是无进位/借位而向符号位进位/借位时就发生了溢出。直观的解释是正数增大变成负数,或是负数减小变成正数,这时就发生了溢出。
由于溢出时,数值发生了很大的跳变,在控制等应用领域会产生严重的后果,这时希望结果能“温和”一点,可以采用饱和的方式。即正数增加到最大为止,负数减少到最小为止。
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
; 装载地址高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
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的地址装载到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
*+, 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位数据左移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位数据按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]
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位加法程序:
.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
减法与借位
用条件减法实现除法
单指令重复
C程序编译结果
本次课小结
分类
助记符
寻址方式
移位
说明
减法
SUB
直接/间接
0~15,16
从ACC减
长立即数
0~15
短立即数
8位无符号
SUBT
直接/间接
0~15
由TREG低4位指定移位
SUBS
直接/间接
抑制符号扩展
SUBB
带借位
除法
SUBC
直接/间接
条件减,用于单步除法
其它控制
RPT
直接/间接
重复下条指令
短立即数
8位
7. 乘法运算
乘法器、临时寄存器、乘积寄存器、乘积定标器
乘积移位方位式控制位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位
展开阅读全文