【DSP原理及应用】实验-CCS的使用与汇编程序设计

2024-01-08 15:49:02

实验 CCS的使用和汇编程序设计

一、实验目的

  1. 熟悉CCS开发软件

  2. 学会C55X汇编语言程序设计

  3. 熟悉c55x汇编指令

二、试验设备

计算机,CCS开发环境

三、实验内容

  1. 安装CCS5.5

  2. 熟悉CCS的基本操作,工程的打开、导入

  3. 熟悉用CCS调试程序、查看寄存器

  4. 利用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

指令分析:

  1. ADD *AR3+, T0, T1:这是一个寄存器操作指令。它将 AR3 指向的内存位置的值与寄存器 T0 的值相加,结果存储在寄存器 T1 中,并递增 AR3 的值。

  2. MOV *AR3+ << 16, AC1:这是一个移位和加载指令。它将 AR3 指向的内存位置的值左移 16 位(二进制左移16位相当于十六进制左移四位,所以在右边补四个0),然后将结果加载到累加器 AC1 中,并递增 AR3 的值。

  3. ADDSUBCC *AR1, AC0, TC2, AC1:这是一个累加-减指令。它将 AR1 指向的内存位置的值和 AC0 寄存器中的值相加,并将结果存储到 AC1 寄存器中,同时将进位(carry)结果存储到 TC2 寄存器。

  4. AMAR *AR2+ :: MAC uns(*AR1), uns(*CDP), AC0 >> #16:这是一系列的宏指令。它是一种特殊的操作,包含了更多的操作代码(宏定义),主要用于特定的运算或功能。这里的宏定义了一些不同的操作,包括了取模运算和移位操作。

  5. 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 架构编写的程序,主要包含了一些寄存器操作和指令。下面对代码的不同部分进行解释和分析:

  1. .mmregs:这个部分主要是定义了寄存器变量和分配内存,为代码中使用的寄存器和内存空间分配了一定的存储空间。

  2. .model call=c55_std:指定使用 C55x 标准模型。

  3. .sect ".text":定义了一个文本段,通常用于存放可执行代码。

  4. .global start:声明一个名为 start 的全局标签。

  5. MOV #2, *(#y)MOV #1, *(#x):将值 21 分别存储到 yx 所指向的内存位置。这里使用 # 表示立即数,*() 表示存储到内存的操作。

  6. L1::定义一个标签 L1,用于在程序中作为一个跳转的目标点。

  7. MOV *(#y), AR3:将 y 所指向的内存位置的值加载到 AR3 寄存器中。

  8. ADD *(#x), AR3, AR3:将 x 所指向的内存位置的值与 AR3 寄存器中的值相加,结果存储回 AR3 寄存器。

  9. MOV AR1, *(#z):将 AR1 寄存器中的值存储到 z 所指向的内存位置。

  10. AMAR *AR2+ :: MAC uns(*AR1), uns(*CDP), AC0 >> #16:这是一个复杂的宏指令,涉及到一些特殊操作,包括乘法和移位等。具体的操作需要参考相关的宏定义和上下文,这个宏指令的含义需要更多代码或宏定义的信息才能完全解释清楚。

  11. ADD *AR1 << T0, AC1, AC0:将 *AR1 所指向的内存位置的值左移 T0 寄存器中的值所指定的位数,并将结果与 AC1 寄存器中的值相加,最终结果存储在 AC0 寄存器中。

需要注意的是,这段代码在涉及到宏定义和一些特殊指令时,其具体含义和操作需要结合整个程序的上下文和宏定义来理解。

文章来源:https://blog.csdn.net/m0_51993913/article/details/135438809
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。