文档介绍:第5章 TMS320C54x的汇编语言程序设计
概述
堆栈的使用方法
控制程序
算术运算程序
概述
汇编语言源程序格式
助记符指令一般包含4个部分:
[标号][:] 助记符[操作数] [;注释]
(1)标号—所有汇编指令和大多数汇编伪指令前面都可以带有标号;必须从第一列开始书写;最多32个字符;由字母、数字、下划线和$组成,且不能以数字开头;分大小写;冒号不属于标号名;没有标号的源语句第一列必须为空格、星号或分号。
(2)助记符—不能从第一列开始,否则被认为是标号;指令助记符一般用大写;汇编伪指令一般为小写,且以“.”开头。
(3)操作数—操作数列表,可以是常数、符号或表达式。操作数间需用“,”号隔开;三种前缀形式:#, *, @。
(4)注释—用“*”号或“;”号开头。
汇编语言源程序格式
数据类型
举例
二进制
10011000B,01111010b(最多16位)
八进制
226q,1001Q,0124(多达6位)
十进制
1,2,1024(不超过65535)
十六进制
0DH,123H,0X89,0x0D(多达4位)
浮点数
(浮点数仅在C语言使用)
字符常数
‘a’,’b’…
字符串
“example”
常数与字符串
类型
含义
标号
符号地址(,.ref,.def的操作数)
局部标号
$n, name? (临时性的标号,,.sect,.text,.data,.include,.copy取消定义和复位)
符号常数
.set, .struct/.tag/.endstruct (提高可读性)
预定义符号常数
$, 寄存器符号, 其他…
替代符号
符号替代变量, .asg “high”, AR2(可重新定义)
标号:只掌握标号和符号常数!!
举例:
1、def ABC,abc,Abc (注:ABC、abc、Abc是3个不同的标号)
2、符号常数的定义:
.set等同于单片机中的EQU、BIT伪指令!!
序号
符号
运算操作
求值顺序
1
+ - ~ !
取正、取负、按位求补、逻辑负
从右至左
2
* / %
乘法、除法、求模
从左至右
3
+ -
加法、减法
从左至右
4
^
指数
从左到右
5
<< >>
左移、右移
从左至右
6
< <=
小于、小于等于
从左至右
7
> >=
大于、大于等于
从左至右
8
!= =
不等于、等于
从左至右
9
&
按位与运算
从左至右
10
∧
按位异或运算
从左至右
11
|
按位或运算
从左至右
汇编语言表达式
有效定义表达式
先定义,再引用,合乎逻辑矣!!
堆栈的使用方法
堆栈操作要点总结:
1、子程序调用及返回、中断及返回以及使用堆栈操作指令时将涉及到堆栈的使用。
2、压栈时指针先减,SP-1,再压入数据;
注:压入数据时,堆栈从高地址向低地址增长。
3、出栈时,先弹出数据后,再SP+1。
注:如要用堆栈,必须先设置,后使用。
堆栈的使用方法
堆栈操作示例:
.title ""
.mmregs
.def start
size .set 100
STACK .usect “STK”,size
.bss length,10H
主程序文件:
.text
start: STM #STACK+size,SP
LD #-8531,A
STM #length,AR1
MVMM SP,AR7
loop: STL A,*+AR7(-1)
BANZ loop,*AR1-
end: B end
.end
思考:1、分析这段程序堆栈区会有多少个“DEAD”?
2、如何实现堆栈区100个单元全部数据变为“DEAD”?
3、如何改写主程序,用其它指令实现该程序的功能?
这条指令模拟先减一再入栈的过程