熟悉CCS开发软件
学会C55X汇编语言程序设计
熟悉c55x汇编指令
计算机,CCS开发环境
安装CCS5.5
熟悉CCS的基本操作,工程的打开、导入
熟悉用CCS调试程序、查看寄存器
利用CCS软件观察如下指令运行结果
指令1:
ADD *AR3+, T0, T1
含义:AR3间接寻址得到的内容与T0的内容相加,结果装入T1,并将AR3增1。
Before After
AR3 0302 AR3 0303
302 EF00 302 EF00
T0 3300 T0 3300
T1 0 T1 2200
CARRY 0 CARRY 0
指令2:
MOV *AR3+ << #16,AC1
Before After
AC1 00 0200 FC00 AC1 00 3400 0000
AR3 0200 AR3 0201
200 3400 200 3400
指令3:
ADDSUBCC *AR1,AC0,TC2,AC1
Before After
AC0 00 EC00 0000 AC0 00 EC00 0000
AC1 00 0000 0000 AC1 01 1F00 0000
AR1 0200 AR1 0200
200 3300 200 3300
TC2 1 TC2 1
SXMD 0 SXMD 0
M40 0 M40 0
AC0V1 0 AC0V1 1
CARRY 0 CARRY 1
指令4:
AMAR *AR2+
:: MAC uns(*AR1), uns(*CDP), AC0 >> #16
Before After
AC0 00 6900 0000 AC0 00 95C0 9200
AC1 00 0023 0000 AC1 00 0023 0000
*AR1 EF00 *AR1 EF00
AR2 0201 AR2 0202
*CDP A067 *CDP A067
ACOV0 0 ACOV0 1
ACOV1 0 ACOV1 0
CARRY 0 CARRY 0
M40 0 M40 0
FRCT 0 FRCT 0
SATD 0 SATD 0
指令5:
ADD *AR1 << T0, AC1, AC0
Before After
AC0 00 0000 0000 AC0 00 2330 0000
AC1 00 2300 0000 AC1 00 2300 0000
T0 000C T0 000C
AR1 0200 AR1 0200
200 0300 200 0300
SXMD 0 SXMD 0
M40 0 M40 0
ACOV0 0 ACOV0 0
CARRY 0 AC0V1 1
指令分析:
ADD *AR3+, T0, T1
:这是一个寄存器操作指令。它将 AR3
指向的内存位置的值与寄存器 T0
的值相加,结果存储在寄存器 T1
中,并递增 AR3
的值。
MOV *AR3+ << 16, AC1
:这是一个移位和加载指令。它将 AR3
指向的内存位置的值左移 16 位(二进制左移16位相当于十六进制左移四位,所以在右边补四个0),然后将结果加载到累加器 AC1
中,并递增 AR3
的值。
ADDSUBCC *AR1, AC0, TC2, AC1
:这是一个累加-减指令。它将 AR1
指向的内存位置的值和 AC0
寄存器中的值相加,并将结果存储到 AC1
寄存器中,同时将进位(carry)结果存储到 TC2
寄存器。
AMAR *AR2+ :: MAC uns(*AR1), uns(*CDP), AC0 >> #16
:这是一系列的宏指令。它是一种特殊的操作,包含了更多的操作代码(宏定义),主要用于特定的运算或功能。这里的宏定义了一些不同的操作,包括了取模运算和移位操作。
ADD *AR1 << T0, AC1, AC0
:这是一个寄存器操作指令。它将 *AR1
指向的内存位置的值左移 T0
寄存器中的值所指定的位数,并将结果与 AC1
寄存器中的值相加,最终结果存储在 AC0
寄存器中。
这些指令主要是对寄存器进行操作、内存加载和移位运算等,实现了对数据的加减、移位等操作。
.mmregs
.model call=c55_std
;.model mem=large
.global x
.bss x,1,0,0
.sym x,x, 4, 2, 16
.global y
.bss y,1,0,0
.sym y,y, 4, 2, 16
.global z
.bss z,1,0,0
.sym z,z, 4, 2, 16
.sect ".text"
.align 4
.global start
.sym start,start, 36, 2, 0
start:
MOV #2, *(#y)
MOV #1, *(#x)
L1:
MOV *(#y), AR3
ADD *(#x), AR3, AR3
MOV AR1, *(#z)
;ADD *AR3+, T0, T1
;MOV *AR3+ << #16, AC1
;ADDSUBCC *AR3,AC0,TC2,AC1
AMAR *AR2+
:: MAC uns(*AR1), uns(*CDP), AC0 >> #16
ADD *AR1 << T0, AC1, AC0
B L1
这段汇编代码是为 C55x DSP 架构编写的程序,主要包含了一些寄存器操作和指令。下面对代码的不同部分进行解释和分析:
.mmregs
:这个部分主要是定义了寄存器变量和分配内存,为代码中使用的寄存器和内存空间分配了一定的存储空间。
.model call=c55_std
:指定使用 C55x 标准模型。
.sect ".text"
:定义了一个文本段,通常用于存放可执行代码。
.global start
:声明一个名为 start
的全局标签。
MOV #2, *(#y)
和 MOV #1, *(#x)
:将值 2
和 1
分别存储到 y
和 x
所指向的内存位置。这里使用 #
表示立即数,*()
表示存储到内存的操作。
L1:
:定义一个标签 L1
,用于在程序中作为一个跳转的目标点。
MOV *(#y), AR3
:将 y
所指向的内存位置的值加载到 AR3
寄存器中。
ADD *(#x), AR3, AR3
:将 x
所指向的内存位置的值与 AR3
寄存器中的值相加,结果存储回 AR3
寄存器。
MOV AR1, *(#z)
:将 AR1
寄存器中的值存储到 z
所指向的内存位置。
AMAR *AR2+ :: MAC uns(*AR1), uns(*CDP), AC0 >> #16
:这是一个复杂的宏指令,涉及到一些特殊操作,包括乘法和移位等。具体的操作需要参考相关的宏定义和上下文,这个宏指令的含义需要更多代码或宏定义的信息才能完全解释清楚。
ADD *AR1 << T0, AC1, AC0
:将 *AR1
所指向的内存位置的值左移 T0
寄存器中的值所指定的位数,并将结果与 AC1
寄存器中的值相加,最终结果存储在 AC0
寄存器中。
需要注意的是,这段代码在涉及到宏定义和一些特殊指令时,其具体含义和操作需要结合整个程序的上下文和宏定义来理解。