MCU

ADSP-BF53x系列处理器汇编指令介绍

0
阅读(3890)

Blackfin 处理器系列汇编语言指令集使用易于编程和可读性强的代数语法。采用专门调整的灵活的高密度编码的指令,这些指令被编译后只占用非常小的存储空间。指令集还提供了体现ADSP-BF531/2/3 全部特点的多功能指令,以使在一个指令中能够使用多个处理器内核资源。除许多微控制器上常见的功能外,指令集编译C 和C++源代码时效率非常高。此外,指令集还支持用户(算法/应用代码)和管理员(O/S内核,设备驱动,调试器,ISRs)两种运行模式,允许对处理器内核资源的多级访问。

汇编语言采用了处理器独特的体系结构,具有以下优点:

无缝集成DSP/CPU特征,对8位和16位操作进行了优化。

并发加载/存储的改进哈佛体系结构,每个周期支持2个16位MAC或4个8位ALU+2个加载/存储+2个指针更新。

所有的寄存器、I/O、和存储器被映射成为统一4GB存储空间,提供了一个简化编程模式。

微控制器特征,如任意位和位域操作,插入和提取,对8位、16位和32位数据类型上的整数操作,独立的用户和管理员堆栈指针。

代码密度增强,包括混合的16和32位指令(无模式转换和代码分离)。常用指令以16位编码。

下面介绍十种比较常用到的汇编指令:

一、程序流控制指令

1.跳转指令

JUMP, JUMP.S, JUMP.L

语法

JUMP (Preg) ;      跳转至寄存器Preg所指向的一个绝对地址

JUMP (PC + Preg) ; 跳转至PC(程序计数器)的一个相对地址,偏移量为Preg寄存器的内容

JUMP offset ;      跳转至PC+offset

JUMP.S offset ;    短跳转至PC=PC+offset

JUMP.L offset ;    长跳转至PC=PC+offset

JUMP user_label ;  跳转至用户定义标记的绝对地址

2.条件跳转指令

IF CC JUMP

语法

IF CC JUMP destination ; 如果CC=1,则跳转

IF !CC JUMP destination ; 如果CC=0,则跳转

二、调用和返回指令

1.子程序调用指令

CALL

语法

CALL (Preg) ;      调用寄存器Preg所指向的一个绝对地址的子程序

CALL (PC + Preg) ; 调用PC的一个相对地址,偏移量为Preg寄存器的内容

CALL offset ;      调用一个相对地址PC+offset

2.RTS, RTI, RTX, RTN, RTE

语法

RTS ; 由子程序返回,将RETS寄存器的值放入PC

RTI ; 由从中断返回,将RETI寄存器的值放入PC

RTX ; 由特殊情况返回,将RETX寄存器的值放入PC

RTN ; 由非屏蔽中断返回,将RETN寄存器的值放入PC

RTE ; 由竞争返回,将RETE寄存器的值放入PC

三、循环指令

语法

有两种指令格式,第一种是

LOOPloop_name loop_counter ;

LOOP_BEGIN loop_name ;

LOOP_END loop_name ;

第二种是

LSETUP (Begin_Loop, End_Loop)Loop_Counter ;

四、进栈指令

--SP (Push)

语法

[ -- SP ] = src_reg ;         对一个寄存器进行压栈

[ -- SP ] = (src_reg_range) ; 对多个寄存器进行连续压栈

五、出栈指令

SP++ (Pop)

语法

dest_reg = [ SP ++ ] ;

(dest_reg_range) = [ SP ++ ] ;

六、移位指令

1.算术移位

dest_reg >>>= shift_magnitude ;

dest_reg = src_reg >>> shift_magnitude (opt_sat) ;

dest_reg = src_reg << shift_magnitude (S) ;

accumulator = accumulator >>> shift_magnitude ;

dest_reg = ASHIFT src_reg BY shift_magnitude (opt_sat) ;

accumulator = ASHIFT accumulator BY shift_magnitude;

2.逻辑移位

语法

dest_pntr = src_pntr >> 1 ;

dest_pntr = src_pntr >> 2dest_pntr = src_pntr << 1 ;

dest_pntr = src_pntr << 2dest_reg >>= shift_magnitude ;

dest_reg <<= shift_magnitude ;

dest_reg = src_reg >> shift_magnitude ;

dest_reg = src_reg << shift_magnitude ;

dest_reg = LSHIFT src_reg BY shift_magnitude;

七、加法指令

加法

语法

dest_reg = src_reg_1 + src_reg_2;

八、预减比例的加法

语法

dest_reg = src_reg_0 + src_reg_1 (RND20);

九、预增比例的加法

语法

dest_reg = src_reg_0 + src_reg_1 (RND12)

十、立即数加法

语法

register += constant;