DSP汇编语言初步资料
第3章 汇编语言(2011) DSP
symbol: 对应于用户正保留空间的变量名 指向此次被.usect伪指令调用所保留空间的首字节 Size in words:所保留存储空间的长度 Section name: 段名 告诉汇编器保留一定的空间给段命名 (SECTIONS中必须有相应分配)
symbol: 对应于用户正在保留空间的变量名, 指向此次被.bss伪指令调用所保留空间的首字节 Size in words: 所保留存储空间的长度
三、.set和.equ伪指令(符号赋值) 格式: symbol .set value symbol .equ value 功能: .set和.equ伪指令将常数值赋给左边符号 说明:.set和.equ伪指令是等同的,可以互换使用 symbol(符号)必须出现在标号域 value(数值)表达式中的符号必须已在前面定义 (.def或者.global伪指令能使由.set定义的符号成 为外部可见的。采用这种方法,用户可以定义全局绝对 常数。)
第3章 汇编语言
2011/6/5
第3章
汇编语言
第3章
汇编语言
DSP开发环境: CCS 文件扩展名: .out COFF核心:使用代码块和数据块编程 优点: 良好的可读性和可移植性,利于模块化程序设计 缺点: 编译系统复杂,对系统的存储器结构和映射方式非常了解 COFF文件产生过程 : 编译 *.asm *.c 汇编器 *.obj *.cmd 链接 *.out
PAGE 1 PAGE 1
.data : }
2
第3章 汇编语言
2011/6/5
实验中使用的存储器配置
MEMORY { PAGE 0 : VECS:origin = 00000h, length = 00040h CODE: origin = 00100h, length = 01800h PAGE 1 : Regs: origin BLK_B2: origin BLK_B0 : origin BLK_B1: origin = 00000h, length = 00060h = 00060h, length = 00020h = 00200H, length = 00100H = 00300H, length = 00100H
DSP汇编语言编程基础
实验二 DSP汇编语言编程基础一、 实验目的1、了解DSP的寻址方式;2、了解DSP的汇编语言与C语言混合编程。
二、 实验器材1、安装有CCS的PC机一台;三、 实验内容1、建立一个工程;2、用汇编语言编程实现一个可被C程序调用的例程。
四、 实验步骤1、汇编语言和C语言混合编程:(1) 运行CCS,建立一个工程,取名exp2a,并保存到c:\ti\myprojects\xxx\Experiment2\目录下。
(2) 编辑如下C文件,取名exp2a.c并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。
/* Assembly routine */extern int sum(int *);/* define x[] as global array */int x[2]={0x1234,0x4321};/* define result s as global variable */int s;void main(){s = sum (x); /* return sum product */}(3) 编辑如下汇编文件,取名exp2_sum.asm并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。
* * * * * * * * * * * * * * * * * * * * * * * * * * * * ** exp2_sum.asm SUM subroutine* called by exp2a.c* Input: Array pointer* Output: Return sum result in T0* * * * * * * * * * * * * * * * * * * * * * * * * * * * *.global _sum_summov *AR0+,AC0 ; AC0 = x[1]add *AR0+,AC0 ; AC0 = x[1]+x[2]mov AC0,T0ret ; Return T0.end(4) 编辑如下链接命令文件,取名link.cmd并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。
第五章 DSP的汇编指令..
第五章 TMS320C55x系列DSP的汇编指令
(2) 用户自定义的双指令的并行
这两条指令的并行是通过用户或C编译器定义的。两条指令 同时执行两个操作,用并行符“||”区分并行执行的两条指令。 例:
MPYM *AR1+, *CDP, AC1 ;D单元的一个MAC来完成
||XOR AR2,T1
;A单元的ALU来完成
第五章 TMS320C55x系列DSP的汇编指令
1、高速数字信号处理中常采用汇编语言编程。 2、汇编语言中的两种指令集 (1) 助记符指令集:有助于记忆的符号来表示指令。 (2) 代数指令集:类似于代数表达式,运算关系清楚明了。 注意:DSP的软件开发工具只支持单一的指令形式,不支持助记
符指令和代数指令的混合形式。 3、术语、符号和缩写见P93的表5-1 4、运算符见表5-2
令执行的条件:
TCx(测试/控制标志为1) !TCx(测试/控制标志为0)
TC1&TC2 TC1&!TC2 TC1|TC2 TC1|!TC2 TC1^TC2 TC1^!TC2
!TC1&TC2 !TC1&!TC2 !TC1|TC2 !TC1|!TC2 !TC1^TC2 !TC1^!TC2
第五章 TMS320C55x系列DSP的汇编指令
4、双16比特算术指令: [(1)语法、(2)操作数、(3)状态位] 在D单元中利用其ALU的双16比特模式,同时执行(并行)两个16
比特算术运算,包括加-减、减-加、两个加和两个减运算。
例:
说明: NO:不能并行执行 3:指令的长度为3字节 1:周期为1 X:在X(执行)流水线阶段处理
D – ALU:在D单元ALU执行。 执行结果:AC0=(*AR3)+CARRY+AC1 状态位: Affected by CARRY,C54CM,M40等
dsp第六章汇编程序
§6.3 宏指令
• 为了简化汇编语言程序的书写,常把一些频繁出现的程序段定义为宏指令
• 当程序需要执行这一段程序段时只要一条宏调用语句 ,减少汇编语言程序的重复书写
• TMS320系列DSP汇编器支持宏例指1 令
(1)宏定义
宏定义:
(2)宏调用 举例
parms
.macro x, y, z
LACC
x
• 这类伪指令使汇编器根据表达式 求值结果的真或假来汇编代码的某 些段。
• 伪指令分为8类。 1)段定义伪指令 2)初始化常数伪指令 3)段程序计数器排列伪指令 4)输出列表格式伪指令 5)引用其他文件伪指令 6)条件汇编伪指令 7)汇编时的符号伪指令 8)其他伪指令
• 该类伪指令使定义的符号名等同于 常数值或字符串
例 .set .equ .struct .endstruct
• 常用的伪指令
• 定义标题伪指令 .title 句法: .title “字符串” 例: .title “example
• 终止源程序汇编伪指令 .end
• 赋值伪指令 .set 和 .equ 句法: 符号 .set 数值 符号 .equ 数值 例: DAC0 .set 0001h
• 伪指令分为8类。 1)段定义伪指令 2)初始化常数伪指令 3)段程序计数器排列伪指令 4)输出列表格式伪指令 5)引用其他文件伪指令 6)条件汇编伪指令 7)汇编时的符号伪指令 8)其他伪指令
•该类伪指令为文件提供信息或提供这 些文件的信息。
• 伪指令分为8类。 1)段定义伪指令 2)初始化常数伪指令 3)段程序计数器排列伪指令 4)输出列表格式伪指令 5)引用其他文件伪指令 6)条件汇编伪指令 7)汇编时的符号伪指令 8)其他伪指令
DSP技术与应用_线性汇编语言简介
C代码转换为线性汇编
• 第二步:暂时存放临时数据的寄存器定名, 由.reg ( register)完成
.reg
addr_a,addr_x
.reg
m,n
.reg
product,sum
C代码转换为线性汇编• 第三步, Nhomakorabea据初始化
MV MV ZERO
cptr0,addr_a cptr1,addr_x sum
unit operands;comments
(3)[condition]条件
A 如果指令没有指出条件,指令总被执行;
B 如果给定条件,当条件为真,指令执行;
C 如果给定条件,当条件为假,指令不执行。
如[A1]
A1!=0 A1=0
[!A1]
A1=0 A1!=0
汇编代码结构
Label: parallel bars [condition] instruction unit operands;comments
•
.reg
m,n
•
MV
cptr0,addr_a
•
MV
cptr1,addr_x
•
ZERO sum0
•
ZERO sum1
•
SHR
vptr,1,vptr
•
loop:
•
LDW
*addr_a++,m
•
LDW
*addr_x++,n
•
MPY
m,n,product0
•
MPYH m,n,product1
•
ADD
sum0,product0,sum0
.reg
product,sum
DSP 课件 第六章 汇编语言
;将2装入DP
;初始化一个字为16h
1、标号域
标号包含1~32个字母、数字、字符(A~Z,a~2,0~9,—及$),可识别符号的 大小写,且规定第一个字符不能是数字。 标号可以后随冒号(:),冒号并不作为标号的一部分被处理。 如果不使用标号,则第一个字必须是空格或分号或星号。
当选用标号时,其值是段程序计数器 (SPC)的当前值,标号指向与它们相关联的 语句。例如,如果用.word伪指令初始化几个字,那么标号将指向第一个字。
(2)已初始化块
已初始化块包含可执行代码或已初始化数据。块的内容存储在目标 文件中,当程序装入时存放在DSP存储器中。每个已初始化块可以独立 地进行重定位,且可访问在其他块中定义的符号。链接器可自动解决块 与块之间符号访问的问题。有四个命令通知汇编器将代码或数据存放在 严格块中,格式为: .text .data .sect “块名” .asect “块名”,地址 上述命令中, .text 和 .data建立的块名就是.text 和 .data,而后两 命令建立的是自定义块,其中.asect 建立的块有绝对地址,一般不建议 使用。
2、字符串
字符串是包含在双引号内的一串字符,双引号是字符串的一部分。串的 最大长度是变化的,并由每一个使用字符串的伪指令定义。字符在内部 被表示为8位ASCII字符,如:“sample program”定义13个字符的字符 串sample program。 字符串用于下列场合:
(1).copy “filename”中的文件名;
6.3 通用目标文件格式
CCS开发环境可以看成是一个大的软件包,里面包含了源代码 编辑器,以及工程文件组织、编译和调试等一切功能模块。该软件 包里,shell程序可以完成3个功能:编译、汇编和链接。shell程序 缺省在C盘安装时,被安装在 C:\ti\c2400\cgtool子目录下,对应的 文件名为dspcl.exe。 (1)编辑器:包括分析器、优化器、代码产生器。把C语言程序编译 成汇编语言程序。 (2)汇编器:把汇编语言源代码或 C语言已经编译成汇编语言代码进 行汇编,以产生COFF目标文件。 (3)链接器:将文件链接,产生可执行的目标文件。
第五章DSP汇编语言开发
三、COFF文件 汇编器和连接器建立的目标文件,是可以在C54x DSP器件上执行的文件。这些目标文件的格式称为公共目 标文件格式COFF (Common Object File Format )文件。 汇编器建立的是一种相对地址的COFF文件。汇编器根 据汇编命令用适当的段将各部分程序代码和数据连在一起, 构成目标文件。 连接器建立的是一种绝对地址的COFF文件。连接器建 立COFF文件时,要把各部分程序代码和数据段重新定位到 目标存储器中,也就是为各个程序代码或数据分配存储单 元。
③. 自定义段 自定义段,由用户定义的段,和默认的段.text .data .bss 的使用完全相同,而且独立分配,但是自定义段单独被汇 编,不和.text.data .bss混在一起。.usect和.bss类似,.sect 和与.data和.text类似。 语法格式如下: 标号 .usect “段名”,字数 .sect “段名” .asect “段名” ,地址
子段可以单独为其分配存储单元,或在基段之后。
⑤、段程序计数器(SPC)
汇编器为每个段都安排一个单独的程序计数器——段 程序计数器(SPC)。SPC表示一个程序代码段或数据段 内的当前地址。连接器在连接时对每个段进行重新定位。 汇编开始时,汇编器将每个SPC置0。当汇编器将程序 代码或数据加到一个段内时,相应的SPC就增加。如果再 继续对某个段汇编,则相应的SPC就在先前的数值上继续 增加。连接器在连接时要对每个段进行重新定位。
例5-2: 汇编源程序经汇编后的列表文件(段命令的应用):
该例中一共建立了5个段: .text段: 段内有10个字的程序代码。 .data段: 段内有7个字的数据。 vectors段: 是一个用.sect建立的自定义段,段 内有2个字的已初始化数据。 .bss段: 在存储器中为变量保留了10个存储 单元。 newvars段: 用.usect建立的自定义段,在存储器 B y .def x
第9讲 DSP的C及汇编语言
OnFileLoaded()函数
GEL文件—回调函数
该回调函数在加载program/symbol(.out)文件之后执行。 可以建立调试源搜索路径(在没有CCS工程文件的时候), 设定断点和探针,完成软件的复位和重启。
GEL文件—回调函数
OnReset()函数
当目标处理器复位后该函数被调用。如果你需要每次重
无论用哪种方法定义中断服务函数,都须注意以下问题:
(1)中断处理函数必须是void类型,而且不能有任何
输入参数。
(2)进入中断服务函数,编译器将自动产生程序保护 所有必要的寄存器,并在中断服务函数结束时恢复运行 环境。 (3)进入中断服务函数,编译器只保护与运行上下文 相关的寄存器,而不是保护所有的寄存器。中断服务函 数可以任意修改不被保护的寄存器,如外设控制寄存器 等。 (4)要注意IMR、INTM等中断控制量的设置。通常 进入中断服务程序要设置相应寄存器将中断屏蔽,退出 中断服务程序时再打开,避免中断嵌套。
需要注意的问题
(2)指针类型转换是必须的,关系到接收分配 好的内存块的地址可以向前看多少字节。 如果不做指针类型转换会怎么样? void * 指针存在的意义。
需要注意的问题
(3)内存块大小的可移植性问题
分配一个整型变量数组应使用: 数组元素个数 * sizeof(int) 确定内存块的大小 问题:sizeof和strlen函数的区别
/*进行CCS存储器映射,告知目标处理器哪些空间可以访问,哪些不可以访问。*/
Setup_Memory_Map( ); } OnTargetConnect( )//对处理器进行最小初始化 { Setup_Cache( ); //设置缓存L1P,L1D,L2 Setup_Pin_Mux( ); // 设置管脚 Setup_Psc_All_On( ); // 设置psc Setup_PLL0_594_MHz_OscIn( ); // 设置dsp主频[DSP @ 594 MHz][Core 1.20V] Setup_PLL1_DDR_135_MHz_OscIn();//设置ddr时钟频率 Setup_Aemif_8Bit_Bus( ); // 设置Async-EMIF[8-bit bus] }
DSP讲义4-汇编语言编程
表4-4 对齐段程序计数器(SPC)指令
指令格式 .align [size]
说 明 将SPC对齐由参数size指定的一个边界,参数必须 是2的指数。size的单位对于代码段为字节,对 于数据段为字,默认为128字节(代码段)或 者128字(数据段) 等于.align 2
.even
表4-5 引用其他文件的指令
初始化一个或多个文本字符串
初始化当前段的连续字节或字
.uhalf value_l[,…,value_n]
.ushort value_l[,…,value_n] .uint value_l[,…,value_n] .ulong value_l[,…,value_n] .uword value_l[,…,value_n] .word value_l[,…,value_n] .xfloat value_l[,…,value_n]
当前段或者指定段使能有条件连接
定义一个.data段 定义一个自定义段 定义一个.text段 定义一个自定义段,段长度size的单位为字
表4-3 初始化常数(数据和存储器)伪指令(1)
指令格式 .byte value_l[,…,value_n] .char value_l[,…,value_n] 说 明 当前段初始化一个或者多个连续的字节或字
源代码(PC)—编译和链接(PC)
----链接后的文件—执行(PC)
堆栈空间预置
堆栈段名 ENDS
数据段名 SEGMENT 代码段名 SEGMENT ASSUME 段寄存器指定 过程名1 PROC 类型 过程体1 过程名1 ENDP …… 过程名n PROC 类型 过程体n 过程名n ENDP 启动标号: 段寄存器装填 主程序体 程序结束指令序列 代码段名 ENDS END 启动标号
DSP汇编语言程序设计入门
CCS的使用与汇编语言程序设计入门一、实验目的1、了解DSP开发系统的组成和结构;2、熟悉DSP 集成开发环境;3、掌握TMS320C54X程序空间的分配;4、掌握TMS320C54X数据空间的分配;5、掌握操作TMS320C54X存储器的相关指令;6、掌握TMS320C54X相关运算的指令;7、TMS320C54X相关程序流程控制类的指令;8、熟悉DSP开发软件的使用;二、实验内容设计一汇编程序,实现从一组所给的数的累加,并将结果送数码管显示。
三、实验设备硬件:DSP实验与开发系统、JTAG仿真器、PC机Pentumn100以上。
软件:PC机操作系统win98或以上、CCS集成开发环境、仿真器驱动程序。
四、实验步骤1)连接好 DSP开发系统,运行CCS软件;2)用汇编语言设计一程序及相应的链接命令文件(.CMD文件):, 或输入参考程序及链接命令文件(.CMD文件)(附后),使一组所给的数累加,并将结果送数码管显示。
3)新建一个工程;4)向工程添加汇编程序及链接命令文件(.CMD文件):;5)编译、链接工程工程中的所有文件,生成out文件;6)装载上述out文件,并运行;五、程序汇编语言程序:.title "mac.asm".mmregs.def startSIZE .set 100stack .usect "STK", SIZESEGSEL .set 0001b ;数码管使能控制数据,此处第0数码管选通SEGSELPORT .set 0h ;数码管使能控制口地址SEGPORT .set 1h ;数码管数据口地址.bss SEG_DA TA,10 ;用于存放从SEG_V ALUE装载进来的数码管编码数据.bss x,5 ;用于存放从table0装载进来输入数据.bss z,1 ;用于存放输出数据(计算结果).datatable0: .word 1,2,3,4,5 ;待计算的一组输入数据;以下用于存放数码管编码数据,分别控制数码管显示0~9SEG_V ALUE .word 077h,014h,0b3h,0b6h,0d4h,0e6h,0e7h,034h,0f7h,0f6H.textstart:stm #stack+SIZE, SP;;;;;;;;;C5402 初始化;;;;;;;;;;;;;;;stm #2b40h,ST1;STM #2B40H,ST1;stm #1e00h,ST0;stm #02024h,PMST ;IPTR=0010,0000,0 ->RESET=2000Hstm #0h,SWWSRstm #04007h,CLKMD ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;stm #SEG_DA TA, AR3 ;将数码管编码数据从SEG_V ALUE装入SEG_DATA rpt #9mvpd SEG_V ALUE, *AR3+stm #x,AR1 ;从空间table0装载输入数据进入空间xrpt #4mvpd table0,*AR1+call sum ;调用累加子程序ld #SEGSEL,B ;第0个数码管选通portw *(0bH), SEGSELPORTstlm A,AR0 ;累加子程序返回的计算结果转入AR0stm #SEG_DA TA,AR7 ;数码管编码数据区首地址送AR7nopmar *AR7+0 ;首地址(AR7中内容)+偏移地址(AR0中内容)nopportw *AR7,SEGPOR T ;让数码管显示计算结果end: b endsum: stm #x,AR3 ;累加子程序rptz A,#4add *AR3, Astm #z,AR4stl A,*AR4ret.end链接命令文件(.CMD文件):mac.obj-o mac.out-m mac.map-e startMEMORY{PAGE 0:EPROM :org=02000h,len=200hPAGE 1:SPRAM :org=0060h,len=001fhDARAM :org=0080h,len=100h}SECTIONS{.text :>EPROM PAGE 0.data :>EPROM PAGE 0.bss :>SPRAM P AGE 1.stack :>DARAM PAGE 1}六、实验现象与结果:运行程序后, 用CCS观察相应的存储单元(参考程序中用z), 该单元存储了所给一组数的累加值, 且与数码管显示结果一致。
DSP常用汇编语言指令简介
;指定当前工作寄存器
MAR *+,AR1 ;把当前寄存器AR0的内容加
间接寻址方式 TMS320LF240X中八个辅助寄存器(AR0-AR8) 提供了灵活而强大的间接寻址能力,在使用时,包 括: (1)设置辅助寄存器指针(ARP) 例如: MAR *,AR1 LDP #04H LAR AR1,0 ;指明当前寄存器为AR1 ;指明当前数据页码 ;把地址为200H单元内容 ;装载入AR1寄存器
南航自动化学院DSP技术应用实验 室
直接寻址方式 使用直接寻址方式时,包括: (1)设置数据页 例如:LDP #4 ; 指向第4个数据页 (2)指明偏移量 例如: LDP #4 ;指向第4个数据页 ADD 1 ; 把地址为204h的数据单元内 ; 容加到累加器内
南航自动化学院DSP技术应用实验 室
2. 工作寄存器等指令举例
Example1:MAR *+,AR1;把当前工作寄 存器的内容加1,然后再改变工作寄存器为 AR1。 Example2:LAR AR4,#8123h;把AR4的 值改变为立即数。 LAR AR0,16;(DP=6)把 地址=310H的内存单元内容装入AR0。 Example3:SAR AR0,*+;(如果当前工 作寄存器=AR1)把AR0的内容拷贝到AR1 南航自动化学院DSP技术应用实验 指向的内存单元。 室
4. 转移指令举例
南航自动化学院DSP技术应用实验 室
EQ NEQ LT LEQ GT GEQ NC C NOV BIO NTC TC UNC
ACC = 0 ACC <>0 ACC < 0 ACC <=0 ACC > 0 ACC >=0 C=0 C=1 OV = 0 BIO_ low TC = 0 TC = 1
BWDSP汇编入门
调试
• 进入汇编程序后,选择“register”,定制 寄存器组,本例程序中使用了“core X”、 “U address”。 • 按F11开始指令级调试。注意部分程序因流 水线执行及因数据相关被编译器自动插入 nop(未显示),导致寄存器值的变化不随 按下F11而单步变化。
}
result = asm_add (a, b, c, &d); printf ("result is %f\n", result); return 0;
纯汇编调用子函数--子函数乘法
.text .global __main __main: _main_1: [u8 += -1,0] = xr63 || xr63 = u9 [u8 += -1,0] = xr63 u9 = u8 + 0 u8 = u8 + -10 _main_2: xr0 = 100 || xfr1 = 2.5 //需要有类型转换 xr3 = __str_0_pcf__ .code_align 16 call __asm_mul [u8 + 1,0] = xr3 [u8 + 2,0] = xr8 .code_align 16 call __printf _main_3: u8 = u9 + 0 xr63 = [u8 + 1,0] u9 = xr63 || u8 = u8 + 2 .code_align 16 ret .data __str_0_pcf__: .str32z "result is %f\n" .global __main .global __asm_mul .global __printf
.text .global __asm_mul __asm_mul: _asm_mul_1: xr40 = r0 || xr41 = r1 xfr40 = float r40 xfr42 = fr40 * fr41 xr8 = r42 .code_align 16 ret .global __asm_mul
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目的:用汇编语言编写简单程序
BIT/TI
第四讲 汇编语言初步
1
学习内容
• 汇编代码的结构 • 汇编程序的构成 • 编写简单算法:y = mx+b
BIT/TI
第四讲 汇编语言初步
2
一、汇编代码的构成
label: || [cond] instruction .unit operand ;comment
BIT/TI 第四讲 汇编语言初步 20
例程2:乘加运算汇编程序
BIT/TI
第四讲 汇编语言初步
第四讲 汇编语言初步 4
二、汇编程序的构成
程序=数据结构+算法
C程序的数据结构和算法实现
数据结构
算法
BIT/TI
第四讲 汇编语言初步
5
汇编程序-数据结构
用汇编语言声明数据结构
: : : :
BIT/TI
第四讲 汇编语言初步
6
汇编程序-算法
用汇编语言编写算法
:
:
BIT/TI 第四讲 汇编语言初步 7
功能单元(可选) 操作数: • 寄存器 • 常量 • 指针 条件寄存器
注释
标号:代码或 变量地址 x .int 10 MPY .M1 A1, A3, A7 || ADD .L1x A2, B2, A5
BIT/TI 第四讲 汇编语言初步
指令: • 助记符(mnemonic) • 伪指令(directive)
完整的汇编程序构成
m: x: b: y:
.sect “myData” .int 5 .int 10 .int 2 .int 0
BIT/TI
.sect “myCode” start: LD .D1 *A0,A1 . . . ST .D1 A7,*A6 end: B end NOP 5
第四讲 汇编语言初步
MVK/ MVKL把一个16位常数放入寄存器
BIT/TI
第四讲 汇编语言初步
12
1b.取数据
LDH .D1 LDH .D1 LDH .D1 NOP
BIT/TI
*A0, A1 *A2, A3 *A4, A5 4
第四讲 汇编语言初步
; 取m ; 取x ; 取b
13
LD/ST指令
• 三种Load指令,对应不同长度的数据 – LDW 取32位字(word) – LDH 取16位的半字(short) 数据取入寄存器 – LDB 取8位字节(byte) 后进行符号扩展 • 对无符号数(字节、16位半字) – LDBU 无符号扩展 – LDHU • 指令延迟:四个延迟间隙 • 三个存储指令 – STW – STH – STB
BIT/TI
第四讲 汇编语言初步
9
三、用汇编指令编写y=mx+b
1.数据取入寄存器:m,x,b存储器->寄存器
1a. 初始化数据指针 1b. 取数据
2.乘法 3.加法 4.存储数据:y寄存器->存储器
BIT/TI
第四讲 汇编语言初步
10
1a.指针初始化
32位常量 MVK .S1 MVKH.S1 MVK .S1 MVKH.S1 MVK .S1 MVKH.S1
.L1
.S1
.D1
或 ADD .?
BIT/TI
或
A5, A7, A7
第四讲 汇编语言初步 18
4.存储结果
BIT/TI
第四讲 汇编语言初步
19
完整的y=mx+b汇编程序
.title "lab4.asm" mvk .s1 y,A6 ; A6=&y /*定义数据结构*/ mvkh .s1 y,A6 .sect "myData” /*取数据*/ m .short 10 ldh .d1 *A0,A1 ; A1= m x .short 5 ldh .d1 *A2,A3 ; A3=x b .short 2 ldh .d1 *A4,A5 ; A5=b y .short 0 nop 4 /*算法*/ /*核心算法*/ .sect "myCode" start: mpy .m1 A1,A3,A7 ; A7=mx /*指针初始化*/ nop 1 init: mvk .s1 m,A0 ;A0=&m add .l1 A5,A7,A7 ; A7=mx+b mvkh .s1 m,A0 sth .d1 A7,*A6 mvk .s1 x,A2 ;A2=&x /*结束循环*/ mvkh .s1 x,A2 b$ ; endless loop mvk .s1 b,A4 ;A4=&b nop 5 mvkh .s1 b,A4
BIT/TI 第四讲 汇编语言初步 14
指令延迟间隙
延迟间隙:多周期指令所需要插入的NOP指令个数
BIT/TI
第四讲 汇编语言初步
15
2.乘法
MPY .M1 A1, A3, A7 NOP
BIT/TI
第四讲 汇编语言初步
16
乘法指令
• 四种乘法指令
– MPY(U/US/SU) 16LSB×16LSB
– MPYH(U/US/SU)
– MPYH(U/S)L(U/S) – MPYL(U/S)H(U/S) 16LSB×16MSB • 指令延迟槽:1
16MSB×16MSB
16MSB×16LSB
• 两个乘法单元可以在一个周期内做两次乘法
BIT/TI 第四讲 汇编语言初步 17
3.加法
ADD.? 应该使用哪个功能单元?
BIT/TI
m, A0 m, A0 x, A2 x, A2 b, A4 b, A4
第四讲 汇编语言初步
; &m->A0 ; &x->A2
; &b->A4
11
指令MVK
MVK/MVKL - Move a Signed Constant into a Register and Sign-Extend (~C64x)
3
常用伪指令
汇编指令 .sect .usect .int .long .word .short .half .byte 说明 定义一个代码段或数据段 定义一个未初始化数据段 定义和初始化32位变量 定义和初始化16位变量 定义和初始化8位变量
注意
BIT/TI
在C语言里long是40Байду номын сангаас,在汇编语言里long是32位
8
搬移指令
搬移指令共有3类:MV, MVC, MVK:
MV指令用于在通用寄存器之间传送数据。 MVC指令用于在通用寄存器与控制寄存器之 间传送数据,此条指令只能使用.S2功能单元. MVK类指令用于把16位常数送入通用寄存器。 在C6000指令集内,只能往寄存器送16位常数, 可选择MVK 、MVKH或MVKL指令向寄存 器的高16位送数。