今天的任务是,能够写一段汇编程序,并在CCS上成功运行。做这个的目的是了解CCS载入的汇编程序长什么样,有助于我的验证平台将用户友好型测试用例转换成汇编型测试用例。
首先是编写源程序的规则:
源语句语法: [标号] [ :] 助记符 [操作数1,操作数2,…][;注释]
注:“[ ]”表示该项可缺省。
标号域 —— 标号域是任选域,可有可无。若使用必须从源语句的第一列开始书写。标号包含1~32个字母、数字、字符,可识别符号的大小写,且第一个字符不能是数字。标号可以后随冒号。如果不使用标号,则第一个字必须是空格或分号或星号。
助记符域 —— 是关键部分,不能缺省,它表示本指令的操作类型。助记符不能从源语句的第一列开始。它包括下列操作码之一:
√ 汇编指令(例如ABS, MPY, SPH);
√ 伪指令(例如.data, .list, .set);
√ 宏指令(例如.macro, .mexit)。
操作数域 —— 是跟在助记符域后面的操作数列表,可缺省。如果多于两个操作数,则用逗号隔开。它可以是常数、符号和表达式。
注释域 —— 可以从源语句行的任一列开始并直至本行的末尾,即仅包括注释的源语句是有效的。如果它从第一列开始则可以用分号或星号开始;在行的其他地方开始的注释,必须以分号开始。
以上选自《DSP原理及应用技术课件》第六章
l 所有语句必须以标号、空格、星号或分号开头。
l 标号时可选的,若用标号,它必须写在第一列的开始(否则编译出错)。
l 必须用一个或多个空格分隔每个域。制表符(Tab)等效为空格。
l 注释是可选的。在第一列开始的注释可以用星号或分号(*或;)打头,但在其他任何列开始的注释必须以分号(;)开头。
l 助记符不能从第一列开始,否则将被视为标号。
l “[ ]”表示该项可选的。
以上选自《DSP原理及应用技术》第262页
根据《DSP原理及应用技术》第262页上的例子写了.asm文件,内容如下
two .set 2
Begin: MOV AR1, #two
.word 016h
LOOP MOV DP, #two
Build以后报了两个warning:
"D:CCStudio_v3.3C2000cgtoolsincl2000" -g -pdsw225 -fr"D:/CCStudio_v3.3/MyProjects/testasm/Debug" -d"_DEBUG" -d"LARGE_MODEL" -ml -v28 -@"Debug.lkf" "asm1.asm"
Warning: The project has no cmd file while the Text Linker is selected
[Linking...] "D:CCStudio_v3.3C2000cgtoolsincl2000" -@"Debug.lkf"
>> warning: entry point symbol _c_int00 undefined
上网查询,第一个warning的可能原因是没有选择rts库,加入库rts2800.lib以后,错误变多:
Warning: The project has no cmd file while the Text Linker is selected
>> warning: creating output section .reset without SECTIONS specification
>> warning: creating .stack section with default size of 400 (hex) words.
Use
-stack option to change the default size.
undefined first referenced
symbol in file
--------- ----------------
_main D:CCStudio_v3.3C2000cgtoolslib
ts2800.lib
>> error: symbol referencing errors - './Debug/testasm.out' not built
感觉是缺少.cmd所导致的。
在这种情况下强行run,在输出栏内会出现
Error: Can't write to data memory 0xE02, check memory config [-2184]
Can't Single Step Target Program: Can't write to data memory 0xE04, check memory config [-2184]
在查阅网上资料后,了解到CMD文件描述的是工程师对物理存储器管理、分配及使用情况。那么,我将CCS中自带的一些C28x的CMD文件选一个导入进来行不行?
一开始我选择了inout.cmd,build以后情况是2个errors和1个warning,再换成mainapplication.cmd就只剩下两个error了。回过头去看那个warning,问题是
>> warning: creating .stack section with default size of 400 (hex) words.
原因是默认的.stack空间是 400 * 4 = 1600= 1.6K。而你申请的栈的大小超过1.6K时会出现警告提示。
网上的解决方法是在CMD文件前加入-stack xxx,观察两个CMD文件后,果然在后者前发现了-stack 400,其余差异也只有两处,大部分一样。至此,CMD文件的问题暂告一段落。
剩下两个errors,发现是rts库用错了,去除rts库以后,build结果为一个warning
>> warning: entry point symbol _c_int00 undefined
关于这个问题,网上有两种解决方案
将“Begin:”换成“_c_int00:”,或者去掉Build Option中linker下-c,在CMD文件头部加上“-e Begin”,总之,目的是表明程序入口。
至此,无error无warning,总算是编译过了。
然后是执行,还是Error: Can't write to data memory 0xE02, check memory config [-2184]
Can't Single Step Target Program: Can't write to data memory 0xE04, check memory config [-2184]
我开启了watch窗口,监视AR1和DP,发现run以后,AR1成功变成了2,然后,反汇编窗口显示,程序执行到“3E8002 0016 INTR INT7”也就是“.word 016h”出错,这是一句伪指令。查找相关问题,发现是CMD文件的问题。但是无论怎么改也不能解决问题。
暂时将这句注释掉,程序正常运行完。DP变为2。