Thumb-2汇编伪操作命令集

Thumb-2汇编伪操作命令集
Thumb-2汇编伪操作命令集

Thumb-2汇编伪操作命令集

1.符号定义伪操作(定义变量,变量赋值,寄存器取别名相关)

操作符功能语法格式

LCLA定义一个局部的算术变量并初始化为0LCLA变量名(定义的)

LCLL定义一个局部的逻辑变量并初始化为FALSE(false)LCLL变量名(定义的)LCLS定义一个局部的字符串变量并初始化为空串LCLS变量名(定义的)

GBLA定义一个全局的算术变量并初始化为0GBLA变量名(定义的)

GBLL定义一个全局的逻辑变量并初始化为FALSE(false)GBLL变量名(定义的)GBLS定义一个全局的字符串变量并初始化为空串GBLS变量名(定义的)

SETA给一个算术变量(全局或局部)赋值变量名SETA变量值

SETL给一个逻辑变量(全局或局部)赋值变量名SETL变量值

SETS给一个字符串变量(全局或局部)赋值变量名SETS变量值

RLIST给一个通用寄存器列表定义名称(定义的)名称RLIST{寄存器列表}

VFP矢量浮点预算

SN给一个单精度VFP寄存器定义名称(定义的)名称SN VFP寄存器编号

DN给一个双精度VFP寄存器定义名称(定义的)名称DN VFP寄存器编号

FN FPA给一个FPA浮点寄存器定义名称(定义的)名称FN FPA浮点寄存器编号

CP给一个协处理器定义名称(定义的)名称CP协处理器编号

CN给一个协处理器的寄存器定义名称(定义的)名称CN协处理器寄存器编号

注意:

1.(与RLIST相关)在LDM/STM指令中,寄存器列表中的寄存器访问次序总是先访问编号低的寄存器再访问编号高的寄存器。

2.(与SN,DN相关)VFP寄存器编号:单精度寄存器编号范围0-31,双精度寄存器编号范围0-15。(D0-D15),(S0-S15)不能再用,因为汇编器已经预先定义了。

3.(与FN相关)FPA否点寄存器编号范围0-7。(F0-F7)不能再用,因为汇编器已经预先定义了。

4.(与CP相关)协处理器编号范围0-15。(p0-p15)不能再用,因为汇编器已经预先定义了。

5.(与CN相关)写处理器寄存器编号范围0-15。(c0-c15)不能再用,因为汇编器已经预先定义了。

2.数据定义伪操作(特定数据分配存储单元已分配存储单元初始化相关)

操作符功能语法格式

DCB分配一片连续的字节存储单元并赋值初始化

DCW分配一段半字内存单元区域(半字对齐)

DCWU分配一段半字内存单元

DCD分配一段字内存单元(半字对齐)

DCDU分配一段字内存单元区域

DCFS分配一段单精度浮点数内存单元(半字对齐)

DCFSU分配一段单精度浮点数内存单元

DCFD分配一段双精度浮点数内存单元(半字对齐)

DCFDU分配一段双精度浮点数内存单元

DCQ分配一个或多个双子内存块(半字对齐)

DCQU分配一个或多个双子内存块

LTORG声明一个数据缓冲池(literal pool)

SPACE(%与SPACE同义)分配一片连续的字节存储区域并初始化为0

MAP(可用^代替MAP命令)定义一个结构化的内存表首地址

FIELD(可用#代替FIFLD命令)定义一个结构化内存表的数据域

DCDO将内存单元的内容初始化为相对地址

DCI分配一段存放代码的内存单元

3.汇编代码控制伪操作

操作符功能

IF if条件判断语句

ELSE条件判断语句

ENDIF条件结束语句

WHILE循环判断语句

WEND循环结束语句

MACRO标识宏定义的开始

MEND标识宏定义的结束

MEXIT中途跳转出宏

4.汇编信息报告控制伪操作(程序调试阶段使用)

操作符功能

ASSERT

INFO或!

OPT

TTL

SUBT

5.指令集类型标识伪操作

助记符功能

ARM指示编译器将要处理的是32位的ARM指令

CODE32指示编译器将要处理的是32位的ARM指令

THUMB指示编译器32位Thumb-2指令或者16位Thumb指令(对于ARM7就是指16位Thumb)

CODE16指示编译器将要处理的是16位Thumb指令

6.文件包含伪操作

助记符功能

GET将一个源文件包含到当前源文件中,并将被包含的源文件在其当前位置进行汇编处理INCLUDE和GET功能相同(INCLUDE=GET)

INCBIN将一个文件包含到当前源文件中,被包含的文件不进行汇编处理

7.其他伪操作

助记符)功能

ALIGN设置对齐方式(缺省时,认为对齐到下一个字的位置)

AREA定义一个代码段或数据段

END通知汇编程序它已达到源文件的末尾

ENTRY声明程序的入口点

EQU(可用“*”代替)为数值常量,标号指定一个符号名称。*是EQU的同义词EXPORT声明一个符号可以被其他文件引用,相当于声明一个全局变量

GLOBAL和EXPORT功能相同(GLOBAL=EXPORT)

EXPORTAS将符号导出到目标文件中,该符号与对应的源文件的符号不同

IMPORT通知编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可以引用该符号。不管该符号在当前汇编中是否被引用,该符号将

被加入到本源文件的符号表中

EXTERN通知编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可以引用该符号。如果本源文件没有实际引用该符号该符号将不会被加入到本源文件的符号表中

KEEP指示汇编器将局部符号保留在目标文件的符号表中

NOFP禁止源程序中包含浮点运算指令

REQUIRE指定段之间的相互依赖关系

REQUIRE8当前代码中要求数据栈8字节(64)对齐

PRESERVE8指定当前代码中数据栈是8字节对齐的

ROUT标记局部变量的作用域范围

8.结构描述伪操作

FRAME ADDRESS

FRAME POP

FRAME PUSH

FRAME REGISTER

FRAME RESTORE

FRAME RETURN ADDRESS f

FRAME SAVE

FRAME STATE REMEMBER

FRAME STATE RESTORE

FRAME UNWIND ON

FRAME UNWIND OFF

FUNCTION或PROC标记一个兼容AAPCS的函数开始。PROC和FUNCTION作用相同ENDFUNC或ENDP标记一个遵循AAPCS规则的函数体结束

使用说明

1.AREA

sectionname{,attr}{,attr}……大括号内为可选项

语法格式:AREA sectionname{,attr}{,attr}

sectionname:段名(注意:段名用数字开头的要用两竖杠括起来,例如:|1_Date|;有些名称是习惯名称,例如|.text|,表示用C编译器生成的代码段或以某种方式与C库关联

的代码节)

attr:节属性,包括以下各属性:

ALING(expr):默认4字节对齐;2的expr次方字节对齐

ASSOC(section):指定与本段相关的ELF段,任何时候链接section段必须包含该段(sectionname段)

CODE:代码段,只读为默认属性

COMDEF:定义通用段,可包含代码或数据。在多个源文件中同名COMDEF段必须相同,否则链接报错

COMMON:定义一个通用数据段,不包含任何用户数据和代码。被连接时自动初始化为

0.各个同名COMMON段使用相同的内存空间,各个同名COMMON段大小不一定要相

同,连接时以最大尺寸的CONMON段所占用的空间为准给CONMON段分配内存DATA:数据段,可读写为默认属性

NOALLOC:指定该段为虚段,并不为其在目标系统上分配内存

NOINIT:指定本数据段不被初始化,或可初始化为0.该操作为SPACE/DCB/DCD/DCW/DCQ等伪操作保留了内存单元

READONLY:指定该段为只读

DEADWRITE:指定该段为可读写

2.FUNCTION或PROC

语法格式:label FUNCTION[{Reglist1}[,{Reglist2}]]

Reglist1:是一个可选的由被调用函数保存的ARM寄存器列表。如果reglist1不出现并且调试程序检查寄存器使用情况,则将假定函数符合AAPCS规则。

Reglist2:是一个可选的由被调用函数保存的VFP寄存器列表。

使用说明

使用FUNCTION来标记函数的开始。在为ELF生成DWARF调用框架信息时汇编程序使用FUNCTION来标识一个函数的开始。FUNCTION将规范框架地址设置为sp并将框架状态栈清空。

每个FUNCTION伪操作必须有一个相匹配的ENDFUNC伪操作,也就是说FUNCTION和ENDFUNC必须成对出现。不能嵌套FUNCTION/ENDFUNC对,并且它们不能包含PROC 或ENDP命令。

如果正在使用自己的程序调用标准,可以使用可选的reglist参数来将有关此备选程序调用标准的信息通知调试程序,并非所有调试程序都支持此功能。

DSP汇编指令学习笔记

Knowledge 问题 谁在DSP的汇编语言中加入了NOP指令? NOP指令加入的条件是什么? About DSP 1.DSP是实时数字信号处理的核心和标志。 2.DSP分为专用和通用两种类型。专用DSP一般采用定点数据结构(一般不支持小数), 数据结构简单,处理速度快;通用DSP灵活性好,但是处理速度有所降低。 3.DSP采用取指、译码、执行三个阶段的流水线(Pipeline)技术,缩短了执行时间,提高了 运行速率。DSP具有8个Functional unit,如果并行处理的话,以600MHz的时钟计算,如果执行的指令是single cycle指令,则可以4800MIPS(指令每秒)。 4.DSP的8个functional Unit,具有独特的功能,对滤波、矩阵运算、FFT(傅里叶变换) 具有 哈弗结构 把指令空间与数据空间隔离的存储方式。 这样实现是为了实现指令的连续读取,而实现pipeline流水线结构。 传统哈弗结构:两个独立的存储空间,还使用独立总线。让取指与执行存储独立,加快执行速度。 改进型哈弗结构:指令与数据的存储空间还是独立的。但是使用公共的总线(地址总线与数据总线)。这样实现的原因是因为出现了CACHE,数据的存储动作大部分被内部的CACHE 总线承接了,所以总线冲突的情况会大大减少。同时让总线的结构与控制变得简单,CACHE 存储的速度也明显快于外设存储器。 冯诺依曼结构:是指令空间与数据空间共享的存放方式。它不能实现pipeline的执行过程。 Pipeline(流水线)技术 是把指令的取指-译码和指令的执行独立开来的技术。虽然每条指令的过程还是要经过取指-译码-执行三个阶段最少3个CPU Cycle。但是多个指令同时并行先后进行,保证总体的指

ARM伪指令详述

1、AREA 语法格式: AREA 段名属性1,属性2,…… AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用―|‖括起来,如|1_test|。 属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下:— CODE属性:用于定义代码段,默认为READONL Y。 — DATA属性:用于定义数据段,默认为READWRITE。 — READONL Y属性:指定本段为只读,代码段默认为READONL Y。 — READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。—ALIGN属性:使用方式为ALIGN 表达式。在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐方式为2表达式次方。—COMMON属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的COMMON段共享同一段存储单元。 一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。 使用示例: AREA Init,CODE,READONL Y 指令序列 ;该伪指令定义了一个代码段,段名为Init,属性为只读 2、ALIGN 语法格式: ALIGN {表达式{,偏移量}} ALIGN伪指令可通过添加填充字节的方式,使当前位置满足一定的对其方式|。其中,表达式的值用于指定对齐方式,可能的取值为2的幂,如1、2、4、8、16等。若未指定表达式,则将当前位置对齐到下一个字的位置。偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方式为:2的表达式次幂+偏移量。 使用示例: AREA Init,CODE,READONL Y,ALIEN=3 ;指定后面的指令为8字节对齐。 指令序列 END 3、CODE16、CODE32 语法格式: CODE16(或CODE32) CODE16伪指令通知编译器,其后的指令序列为16位的Thumb指令。 CODE32伪指令通知编译器,其后的指令序列为32位的ARM指令。 若在汇编源程序中同时包含ARM指令和Thumb指令时,可用CODE16伪指令通知编译器其后的指令序列为16位的Thumb指令,CODE32 伪指令通知编译器其后的指令序列为32位的ARM指令。因此,在使用ARM指令和Thumb指令混合编程的代码里,可用这两条伪指令进行切换,但注意他们只通知编译器其后指令的类型,并不能对处理器进行状态的切换。使用示例: AREA Init,CODE,READONL Y …… CODE32 ;通知编译器其后的指令为32位的ARM指令

DSP汇编指令总结

DSP汇编指令总结 一、寻址方式: 1、立即寻址: 短立即寻址(单指令字) 长立即数寻址(双指令字) 第一指令字 第二指令字 16位常数=16384=4000h 2、直接寻址 ARU 辅助寄存器更新代码,决定当前辅助寄存器是否和如何进行增或减。N规定是否改变ARP值,(N=0,不变)

4.3.1、算术逻辑指令(28条) 4.3.1.1、加法指令(4条); 4.3.1.2、减法指令(5条); 4.3.1.3、乘法指令(2条); 4.3.1.4、乘加与乘减指令(6条); 4.3.1.5、其它算数指令(3条); 4.3.1.6、移位和循环移位指令(4条); 4.3.1.7、逻辑运算指令(4条); 4.3.2、寄存器操作指令(35条) 4.3.2.1、累加器操作指令(6条) 4.3.2.2、临时寄存器指令(5条) 4.3.2.3、乘积寄存器指令(6条) 4.3.2.4、辅助寄存器指令(5条) 4.3.2.5、状态寄存器指令(9条) 4.3.2.6、堆栈操作指令(4条) 4.3.3、存储器与I/O操作指令(8条)4.3.3.1、数据移动指令(4条) 4.3.3.2、程序存储器读写指令(2条) 4.3.3.3、I/O操作指令(2条) 4.3.4、程序控制指令(15条) 4.3.4.1、程序分支或调用指令(7条) 4.3.4.2、中断指令(3条) 4.3.4.3、返回指令(2条) 4.3.4.4、其它控制指令(3条)

4.3.1、算术逻辑指令(28条) 4.3.1.1、加法指令(4条); ▲ADD ▲ADDC(带进位加法指令) ▲ADDS(抑制符号扩展加法指令) ▲ADDT(移位次数由TREG指定的加法指令) 4.3.1.2、减法指令(5条); ★SUB(带移位的减法指令) ★SUBB(带借位的减法指令) ★SUBC(条件减法指令) ★SUBS(减法指令) ★SUBT(带移位的减法指令,TREG决定移位次数)4.3.1.3、乘法指令(2条); ★MPY(带符号乘法指令) ★MPYU(无符号乘法指令) 4.3.1.4、乘加与乘减指令(6条); ★MAC(累加前次积并乘)(字数2,周期3) ★MAC(累加前次积并乘) ★MPYA(累加-乘指令) ★MPYS(减-乘指令) ★SQRA(累加平方值指令) ★SQRS(累减并平方指令) 4.3.1.5、其它算数指令(3条); ★ABS(累加器取绝对值指令) ★NEG(累加器取补码指令) ★NORM(累加器规格化指令) 返回 4.3.1.6、移位和循环移位指令(4条); ▲ SFL(累加器内容左移指令) ▲ SFR(累加器内容右移指令) ▲ROL(累加器内容循环左移指令) ▲ROR(累加器内容循环右移指令) 返回 4.3.1.7、逻辑运算指令(4条); ▲ AND(逻辑与指令) ▲ OR(逻辑或指令) ▲ XOR(逻辑异或指令) ▲ CMPL(累加器取反指令) 返回 4.3.2、寄存器操作指令(35条) 4.3.2.1、累加器操作指令(6条)

ARM的汇编指令讲解

汇编知识点的要求: 1、能看的懂 2、可以做修改 3、不需要用汇编直接编写程序 汇编代码的应用场合: 1、ARM的启动代码必须要汇编,如:uboot最开始初始化硬件的代码 2、内核在最开始初始化的位置。。。。 一、ARM汇编指令的编码格式 1、编码格式 ARM汇编指令编译成机器码以后,机器码的长度是32bits,这32bits的编码有一个固定的格式。不同ARM 汇编指令,编码格式不同。 2、举例 C: if(a==10) a++; else a--;

汇编1: CMP R0, #10; ADDEQ R0,R0,#1 SUBNE R0,R0,#1 汇编2 SUBS R1, R0, #10; //S ---运算的结果会影响条件码标志位:CPSR:NZCV ADDEQ R0,R0,#1 SUBNE R0,R0,#1 提示: 空指令NOP,实际上是占用CPU的时间,但是执行后,没有什么意义。 NOP ---- MOV R0,R0 3、条件码标识 10 -10 Z = 1 C = 0 N = 0 V = 0 ================================================================================= 二、ARM的寻址方式 1、立即数寻址 操作数,有立即数。 ADD R0,R0,#1

MOV R1,#10 ORR R1,R1,#0xf @ R1=R1 | 0xf BIC R1,R1,#0xf @R1 = R1&(~(0xf)) 错误: ADD R1,#1,#2 注意:立即数合法的条件 在ARM汇编指令中,并不是所有的立即数,立即数是有一定的限制的。 什么样的立即数是合法的??? 1、如果一个立即数是小于256的(即该立即数是8bits以内的,0~255),该立即数是合法的。 2、如果一个立即数是大于等于256,该立即数经过循环左移偶数位,可以得到一个小于256的数,则该立即数合法。 256 = 0x100 ------→左移20位0x10000000----→左移4 0x1 合法 0x111 非法 0x102 非法 0x104 合法 0xfff 0xff00 0x12000 0x450000 0xab 原因: 在数据处理指令编码的时候,立即数用12bits来表示: 高4bits:循环左移左移偶数位除以2 低8bits:循环左移后的结果。 重要问题: ADD R1,R0,#0xffff 非法 解决: LDR R2,=0xffff // R2=0xffff,将立即数0xffff的值传送给R2 ADD R1, R0, R2 2、寄存器寻址 所有的操作数都是寄存器,没有立即数 ADD R0,R0,R1 MOV R1,R0 ORR R1,R1,R0 @ R1=R1 | 0xf BIC R1,R1,R0 @R1 = R1&(~(0xf))

ARM汇编语言源程序格式

ARM汇编语言源程序格式ARM汇编语言源程序格式2010-11-16 13:52 来源:MCU嵌入式领域 常用ARM源程序文件类型 汇编语言程序的结构1 汇编语言程序的结构2 汇编语言程序的结构3 汇编语言程序的结构4 ARM的汇编语言程序一般由几个段组成,每个段均由AREA伪操作定义。 段可以分为多种,如代码段、数据段、通用段,每个段又有不同的属性,如代码段的默认属性为READONLY,数据段的默认属性为READWRITE。 本程序定义了两个段,第一个段为代码段codesec,它在存储器中存放用于程序执行的代码以及main函数的本地字符串;第二个段为数据段constdatasec,存放了全局的字符串,由于本程序没有对数据进行写操作,该数据段定义属性为READONLY。 汇编语言的行构成1 格式: [标签]指令/伪操作/伪指令操作数[;语句的注释] 所有的标签必须在一行的开头顶格写,前面不能留空格,后面也不能跟C 语言中的标签一样加上":";

ARM汇编器对标识符的大小写敏感,书写标号及指令时字母的大小写要一致; 注释使用";"符号,注释的内容从";"开始到该行的结尾结束 汇编语言的行构成2 标签 标签是一个符号,可以代表指令的地址、变量、数据的地址和常量。 一般以字母开头,由字母、数字、下划线组成。 当符号代表地址时又称标号,可以以数字开头,其作用范围为当前段或者在下一个ROUT伪操作之前。 指令/伪操作 指令/伪操作是指令的助记符或者定义符,它告诉ARM的处理器应该执行什么样的操作或者告诉汇编程序伪指令语句的伪操作功能。 汇编语言的标号1 标号代表地址。 标号分为段内标号和段外标号。段内标号的地址值在汇编时确定,段外编号的地址值在链接时确定。 在程序段中,标号代表其所在位置与段首地址的偏移量。根据程序计数器(PC)和偏移量计算地址即程序相对寻址。 在映像中定义的标号代表标号到映像首地址的偏移量。映像的首地址通常被赋予一个寄存器,根据该寄存器值与偏移量计算地址即寄存器相对寻址。 例如:

DSP 汇编指令缩写

ABS Absolute value of Accumulator ADD add to accumulator ADDC add to accumulator with carry ADDT add to accumulator with shift specified by TREG AND and with accumulator CMPL complement accumulator LACC load accumulator with shift LACL load low accumulator and clear high accumulator LACT load accumulator with shift specified by TREG NEG negate accumulator NORM normalize contents of accumulator OR or with accumulator ROL/ROR rotate accumulator left/right SACH/SACL store high/low accumulator with shift SFL/SFR shift accumulator left/right SUB subtract from accumulator SBUC conditional subtract SUBS subtract from accumulator with sign extension suppressed SUBT subtract from accumulator with shift specified by TREG XOR exclusive or with accumulator ZALR zero low accumulator and load high accumulator with rounding ADRK add short limmediate value to AR BANZ branch on AR not zero CMPR compare AR with AR0 LAR load AR MAR modify AR STR store AR SBRK subtract short limmediate APAC add PREG to accumulator LPH load PREG LT load TREG LTA load TREG and ACC previous product LTD load TREG ACC previous product and move date LTS load TREG and subtract previous product MAC multiply and accumulate MACD multiply and accumulate wit data move MPY multiply MPY A multiply and accumulate previous product MPYS multiply and subtract previous product MPYS multiply unsign PAC load accumulator with PREG SPAC subtract PREG from accumulator SPH/SPL store high/low PREG SPM set PREG output shift mode

伪指令

A51汇编解释---伪指令 2011-05-11 17:51:46| 分类:默认分类| 标签: |举报 |字号大 中 小订阅 一:定义符号的伪指令 1)SEGMENT 格式: 段名符号 SEGMENT 段类型 [再定位类型] SEGMENT指令可声明一个可再定位(区别于CSEG,DSEG,XSEG,BSEG,ISEG等定义的在相对应的空间固定地址定义的绝对段—在连接的过程中不允许重新定位)的段符号和一个可选的再定位类型,段符号可以用来定义段,L51连接器可将多个模块内的具有相同段名和再定位类型的几个段合成为一个段.段类型说明了段所处的地址空间. 如果是编写的汇编程序要与C源程序接口,即被C源程序调用,则全部的汇编子程序所命名的定义的代码段的段名必须是可用SEGMENT来定义的,而且名字的命名的方法也应该参照C51编译器产生的局部段的段名的转换规则.段名的作用主要是在汇编的时候用RSEG来激活的,在连接定位的时候用到的.与段名相应的是用于存储和传递参数的别名,可以在汇编源程序中直接应用局部段的别名,这个别名主要是在传递函数参数的时候用的.在汇编程序中要用PUBLIC 声明被其他模块引用的全局符号. DATA (可直接寻址的内部RAM空间) IDATA (可间接寻址的内部RAM空间) XDATA (外部数据存储空间) BIT (内部RAM低地址区的可位寻址的空间) CODE (程序存储器空间) 可选的再定位类型定义了L51连接时的定位方式,再定位类型: UNIT:定义一个可开始于任一单元的段对于BIT型的段,一个单元是一个位, 其它所有的段一个单元是一个字节. PAGE:定义一个起始地址必须是256的整数倍的段,段的绝对地址由L51自己计算,该类型只允许用于XDATA和CODE类型段. INPAGE:定义一个由L51连接后必须包含在256B的块中,只适用于XDATA和CODE段. INBLOCK:定义一个L51连接后必须包含在2KB中的段,只适用于CODE段. OVERLAYABLE:定义一个可与其他段交叠的覆盖段,其段名符号必须按C51或者PL/M51的规则命名.C51把局部数据段和局部位段定义成?DT?FUNCTIONNAME?MODULENAME 和?BI?FUNCTIONNAME?MODULENAME这是在small模式下.其他的模式略有不同。BITADDRESSABLE:定义一个L51连接后位于可位寻址的区,段长不能超过16B. 2) EQU 格式: 符号名 EQU 表达式 符号名 EQU 寄存器名 EQU伪指令定义一表示数值或寄存器的符号,该符号可用于表达式或助记符指令的操作数,EQU指令定义的符号不能被改变或重新定义,其段类型取决于表达式中的操作数类型类型,无类型的EQU符号可用于任何表达式中. LIMIT EQU 200 VALUE EQU LIMIT-100+’A’

DSP28335汇编教程

DSP28335汇编教程 当硬件执行指令时,寻找指令所指定的参与运算飞操作数的方式——寻址方式。根据程序的要求采用不同的寻址方式,可以有效地缩短程序的运行时间和提高代码执行效率。汇编指令是可执行指令,每一条指令对应一条机器码,用来控制处理器仲的执行部分进行各种操作。在本章节当中将主要以基于C28x的DSP芯片为例,为读者讲解DSP的寻址方式和汇编指令系统,其中大部分内容也可适用于其他Ti公司的DSP产品。 6.1汇编语言指令集概述 在学习C28x系列DSP的寻址方式和汇编指令指令之前,先来对一些基础的知识进行讲解一下先,在汇编程序当中开发人员会常常使用到许多的特殊符号和标志,它们都具有特殊的含义,在学习汇编之前读者们必须先理解这些符号和标志含义,在这里会对其中最常用最重要的操作数符号和寄存器经行详细说明。 在进行汇编讲解之前先来了解一下开发的核心——CPU。在TMS320C2000系列中,CPU 内核为: C20x/C24x/C240x:C2xLP: C27x/C28x:C27x、C28x 这些CPU的硬件结构有一定差别,指令集也不相同,但是,在C28x芯片中可以通过选择兼容特性模式,使C28xCPU与C27xCPU及C2xLPCPU具有最佳兼容性。可通过状寄存器STl的位OBJMODE和位AMODE的组合,选定模式。 C28x芯片具有3种操作模式: 1.C28x模式:在该模式中,用户可以使用C28x的所有有效特性、寻址方式和指令系统, 因此,一般应使C28x芯片工作于该种模式。 2.C27x目标——兼容模式:在复位时,C28x的CPU处于C27x目标-兼容模式。在该模式 下,目标码与C27xCPU完全兼容,且它的循环—计数也与C27xCPU兼容。 3.C2xLP源——兼容模式:该模式允许用户运行C2xLP的源代码,这些源代码是用C28x 代码生成工具编译生成的。 在下面的讲解当中会牵涉到模式的转换,希望读者要搞清楚每一个模式的对应关系。 本节假设条件为芯片工作于C28x模式(OBJMODE=1,AMODE=0)。复位后,通过执行指令C28OBJ或者SETC OBJMODE将ST1中的OBJMODE位置1,芯片即可工作于C28x模式。 6.1.1 DSP中的操作数 汇编语言离不开操作符和操作数,操作符可以认为就是CPU的指令或者编译器上的伪指令,操作数是指令执行过程中的参与者,也可以说操作数就是指令所控制的对象。 如表6-1,表6-2和表6-3对指令中常用到的一些操作数符号进行说明

ARM汇编伪指令宏的用法详解_MACRO-MEND_.

ARM 汇编伪指令宏的用法详解(MACRO-MEND 宏是一段独立的程序代码,它是通过伪指令定义的,在程序中使用宏指令即可调用宏。当程序被汇编时,汇编程序将对每个调用进行展开,用宏定义取代源程序中的宏指令。 MACRO 、MEND 语法格式: MACRO [$ label] macroname{ $ parameter1, $ parameter,…… } 指令序列 MEND MACRO 伪操作标识宏定义的开始,MEND 标识宏定义的结束。用MACRO 及MEND 定义一段代码,称为宏定义体,这样在程序中就可以通过宏指令多次调用该代码段。 其中, $ label在宏指令被展开时,label 会被替换成相应的符号,通常是一个标号。在一个符号前使用$表示程序被汇编时将使用相应的值来替代$后的符号。 macroname 为所定义的宏的名称。 $parameter为宏指令的参数。当宏指令被展开时将被替换成相应的值,类似于函数中的形式参数,可以在宏定义时为参数指定相应的默认值。 宏指令的使用方式和功能与子程序有些相似,子程序可以提供模块化的程序设计、节省存储空间并提高运行速度。但在使用子程序结构时需要保护现场,从而增加了系统的开销,因此,在代码较短且需要传递的参数较多时,可以使用宏汇编技术。首先使用MACRO 和MEND 等伪操作定义宏。包含在 MACRO 和 MEND 之

间的代码段称为宏定义体,在MACRO 伪操作之后的一行声明宏的原型(包含宏名、所需的参数),然后就可以在汇编程序中通过宏名来调用它。在源程序被汇编时,汇编器将宏调用展开,用宏定义体代替源程序中的宏定义的名称,并用实际参数值代替宏定义时的形式参数。 宏定义中的$label是一个可选参数。当宏定义体中用到多个标号时,可以使用类似$label.$internallabel的标号命名规则使程序易读。 MACRO 、 MEND 伪操作可以嵌套使用。 使用示例: MACRO $HandlerLabel HANDLER $HandleLabel ;宏的名称为HANDLER ,有1个参数$HandleLabel $HandlerLabel sub sp,sp,#4 stmfd sp!,{r0} ;decrement sp(to store jump address ;PUSH the work register to stack(lr does not push because it return to original address ;load the address of HandleXXX to r0 ;load the contents(service routine start address of HandleXXX ;store the contents(ISR of HandleXXX to stack ;POP the work register and pc(jump to ISR ldr r0,=$HandleLabel ldr r0,[r0] str r0,[sp,#4] ldmfd sp!,{r0,pc} MEND ;在程序中调用该宏

dsp汇编指令系统介绍(精)

汇编指令集 本节根据指令的功能来分,提供六张表来说明指令集的概况: 累加器、算数和逻辑指令(表2); 辅助寄存器和数据页指针指令(表3); TREG、PREG和乘法指令(表4); 转移指令(表5); 控制指令(表6); I/O和存储器操作(表7)。 在每张表中,指令按字母顺序排列。执行每条指令所需要的周期数在表中给出,所有指令都假设从内部程序存储器和内部数据存储器中执行,指令的周期数适用于单指令执行,不适用于重复方式。编程时,用户必须对每条指令的寻址方式了解清楚,因此这里也在表中给出了每条指令的寻址方式。由于指令的操作码对用户编程没有多大指导意义,在这里就没有列出来。 为了参照起见,我们先定义这六张概述表的符号意义: ACC 累加器。 AR BITX CM 辅助寄存器。 4位数值,用于指定数据存储器数值中的哪一位将被BIT指令所测试。 2位数值,CMPR指令执行CM值所声明的比较: 若CM=00,测试当前AR=AR0否; 若CM=01,测试当前ARAR0否; 若CM=11,测试当前AR≠AR0否。 Shift TP 4位右移量。用于条件执行指令的2位数值,代表如下4种条件:若BIO引脚为低, TP=00;若TC位=1,TP=01;若TC位=0,TP=10;无条件TP=11。 ARX 用于LAR和SAR指令的3位数据值,指定被操作的辅助寄存器。 52 表2 累加器、算数和逻辑指令 ABS 周期 |(ACC)|→ACC 1 (ACC)+(数据存储器地址)×1 2shift→ACC (ACC)+(数据存储器地址)×

216→ACC 1(ACC)+k→ACC 1 shift (ACC)+lk×2→ACC 2 指令功能 (ACC)+(数据存储器地址)+(C)→ ACC 寻址方式 直接/间接 直接/间接短立即数长立即数 指令说明 ACC取绝对值 移位时低位填0,若SXM=1,高位用符号扩展;若SXM=0,高位填0;结果存在ACC中,该指令使C=0。寻址短立即数时,加操作不受SXM的影响,且不能重复执行。 ADD ADDC 1 直接/间接该指令抑制符号扩展 该指令抑制符号扩展;无论SXM为何值,数据均作无符号16位数看待。当SXM=0和 直接/间接 移位次数等于0时,ADDS与ADD指令结果相同。 被寻址的数据寄存器单元的内容左移并加 直接/间接到ACC,移位次数由TREG的低4位确定, SXM位的值控制移位时是否作符号扩展。 使用直接/间接寻址,ACC的低位字与数据直接/间接存储器单元的值作与运算,结果存在ACC 的低字,ACC的高位字清0。使用立即数寻 址,长立即数可以左移,移位时,32位中长立即数未被长立即操作数填充的位均被清零。 长立即数累加器中的内容用其逻辑反取代指定的数据存储器单元的内容或16位常数直接/间接左移并加载到ACC,低位填0,若SXM= 1,高位用符号位扩展;若SXM=0,则填直接/间接0。 长立即数 指定的数据存储器单元的内容或用0扩展

ARM常用的伪指令

在线学习好工作https://www.360docs.net/doc/56541073.html,/ ARM常用的伪指令 AREA就是常见的伪指令之一。AREA是声明区域段,数据区,代码区等等。什么是数据段呢?数据段是来定义数据结构体的。格式是AREA test,CODE,READONLY。还有指令CODE16、CODE32,格式就直接写上就是。目的是声明以下是32位还是16位指令,注意不是切换arm和thunmb模式。如果是16位,那就是thunmb指令。 操作:这是之前的,如果在这里做一个声明,CODE32,也就是表示ARM指令。如果这里CODE16,就表示一下代码是16位指令,也就是thunmb指令, 也就是说在编译的时候会按照thunmb指令来进行汇编。大家注意一点,在这里通过这个切换,并不会改变处理器的运行的处理模式。不会把ARM指令状态切换为thunmb指令状态。这个切换是在状态寄存器里面去切换T。这个地方只是告诉汇编器而已,所以并不会更换运行时候的指令切换方式。 entry:entry伪指令用于指定汇编程序的入口点。在一个完整的汇编程序中至少要一个entry(也可以多个,当有多个entry时,程序的真正入口点由链接器指定),但在一源文件里最多只能有一个entry(可以没有)。 END:END伪指令用于通知编译器已经到了源程序的结尾。 EQU:EQU伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于c语言的#define。格式是UARTLCON0EQU.0x3FFD00。比方说:SUNDYCON1

EQU0x3200000,我们定义了一个常量,这个常量可以拿来直接用。这里注意一点,我们编译先看一下。这里就出错了。 未知的操作代码。这是怎么回事?汇编这一块,跟自己的汇编器,编译器是有关系的,有时跟ID的环境都有关。在ARM里面,特别ADS里面,他对是否顶头,和Tab要求非常严格。因为我们这里不是一个标准指令,它会看第一个是什么操作码,这里操作码是不识别的,所以这里就出错认不出来。这是应该怎样做呢?首先把SUNDY顶头,就可以知道只是个伪指令。 EXPOET:export伪指令用于程序中声明一个全局的标号,该标号可在其他的文件中引用。export可用GLOBAL代替。标号在程序中区分大小写,weak选项声明其他的同名标号优先于该标号被引用。 IMPORT相当于静态引用。IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号都会被加入到当前源文件的符号表中。 EXTERN相当于动态引用。EXTERN伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前的源文件中引用,如果当前源文件实际未引用该标号,该标号就不会被加到当前源文件的符号表中。 GET相当于引用文件。GET伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET。 RN:RN伪指令用于给一个寄存器定义一个别名。采用这种方式可以方便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。

ARM汇编指令 对比记忆 (整理)

参考资料: 1. Richard Blum,Professional Assembly Language 2. GNU ARM 汇编快速入门,https://www.360docs.net/doc/56541073.html,/u/31996/showart.php?id=326146 3. ARM GNU 汇编伪指令简介,https://www.360docs.net/doc/56541073.html,/jb8164/archive/2008/01/22/41661.aspx 4. GNU汇编使用经验,https://www.360docs.net/doc/56541073.html,/u1/37614/showart_39009 5.html 5. GNU的编译器和开发工具,https://www.360docs.net/doc/56541073.html,/blog-htm-do-showone-uid-34335-itemid-81387-type-blog.html 6. 用GNU工具开发基于ARM的嵌入式系统,https://www.360docs.net/doc/56541073.html,/liren0@126/blog/static/32897598200821211144696/ 7. objcopy命令介绍,https://www.360docs.net/doc/56541073.html,/junhua198310/archive/2007/06/27/1669545.aspx 从网上找到一些关于ARM伪指令的资料,现整理如下: 一. Linux汇编行结构 任何汇编行都是如下结构: [:] [} @ comment [:] [} @ 注释 Linux ARM 汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要在一行的开始。 【例1】定义一个"add"的函数,返回两个参数的和。 .section .text, “x” .global add @ give the symbol add external linkage add: ADD r0, r0, r1 @ add input arguments MOV pc, lr @ return from subroutine @ end of program 1. LDR LDR R0, =0X3FF5000 ;伪指令,把0X3FF5000这个地址送给R0 LDR R0, 0XFF ; 把立即数0xff送给R0 LDR R0, =&FF ; &相当于0X BIC R0, R0, #%1011 ;.#表示立即数,%表示二进制 LDR R1, =0x3ff5000 ;伪指令 R1=0X3FF5000 LDR R1, 0x3ff5000 ;存储器访问指令 R1= [0x3ff5000] 2. adr与ldr比较 adr r0, InitSystem ; ldr r1, =InitSystem ; 伪指令adr r0,InitSystem 编译时汇编成:sub r0,PC,#offset to InitSystem

ARM汇编伪指令介绍

ARM汇编伪指令介绍 在ARM汇编语言程序中,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊助记符为伪指令,它们所完成的操作称为微操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。 在ARM 的汇编程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令及其它伪指令。 一、符号定义(Symbol Definition)伪指令 符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。 常见的符号定义伪指令有如下几种: —用于定义全局变量的GBLA、GBLL和GBLS。 —用于定义局部变量的LCLA、LCLL和LCLS。 —用于对变量赋值的SETA、SETL、SETS。 —为通用寄存器列表定义名称的RLIST。 1.GBLA、GBLL和GBLS 语法格式: GBLA(GBLL或GBLS)全局变量名 GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并将其初始化。 其中: GBLA伪指令用于定义一个全局的数字变量,并初始化为0; GBLL伪指令用于定义一个全局的逻辑变量,并初始化为F(假); GBLS伪指令用于定义一个全聚德字符串变量,并初始化为空; 由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。 使用示例: GBLA Test1:定义一个全局的数字变量,变量名为Test1 Test1 SETA 0xaa:将该变量赋值为0xaa GBLL Test2:定义一个全局的逻辑变量,变量名为Test2 Test2 SETL {TRUE};将该变量赋值为真 GBLS Test3:定义一个全局的字符串变量,变量名为Test3

arm汇编快速入门

ARM汇编语言 ARM汇编语言源程序语句,一般由指令,伪操作,宏指令和伪指令作成. ARM汇编语言的设计基础是汇编伪指令,汇编伪操作和宏指令. 伪操作,是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,在源程序运行汇编程序处理,而不是在计算机运行期间有机器执行.也就是说,这些伪操作只是汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之消失. 宏指令,是一段独立的程序代码,可以插在程序中,它通过伪操作来定义,宏在被使用之前必须提前定义好,宏之间可以互相调用,也可自己递归调用.通过直接书写宏名来使用宏.并本具宏指令的格式输入输出参数.宏定义本身不产生代码,只是在调用它时把宏体插入到原程序中.宏与C语言中的子函数形参和实参的调用相似,调用宏时通过实际的指令来代替宏体实现相关的一段代码,但宏的调用与子程序的调用有本质的区别,既宏并不会节省程序的空间,其优点是简化程序代码,提高程序的可读性以及宏内容可以同步修改. 伪操作,宏指令一般与编译程序有关,因此ARM汇编语言的伪操作,宏指令在不同的编译环境下有不同的编写形式和规则. 伪指令也是ARM汇编语言程序里的特殊助记符,也不在处理器运行期间由机器执行,他们在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作. 目前常用的ARM编译环境有2种.

1. ADS/SDT IDE:ARM公司开发,使用了CodeWarrior公司的编译器. 2. 集成了GNU开发工具的IDE开发环境;它由GNU的汇编器as,交叉汇编器gcc和连接器id组成. ADS编译环境下的ARM伪操作和宏指令,可参考北航出版社的<

ARM伪指令

AREA伪指令 此伪指令用于给一段汇编代码或数据段起一个名字.一个完整的汇编程序至少要有一个以上的代码段,其语法格式为 AREA 段名属性1,属性2,.... 例: AREA init CODE,READONLY 定义了段名为init的属性为只读的代码. 其用意主要是当代码比较长时,可以根据功能来划分代码段,增加程序的可读性.所以段名的命名要符合该程序段的功能,换句话说也就是让人一看段名就知道该程序段是干什么用的. 2. EQU伪指令 EQU(equal 相等的意思,EUQ两边具有等价关系,通俗的说就是给一个表达式,为什么要给表达式名字,一是表达式太长了不好记忆,二是该表达式用得比较多,方便修改.想当与C语言里的符号常量.语法格式: 名字 EQU 表达式 ;表达式可以是常量 例: Number EQU 50 实际上我们在ARM里用得比较多的是: GPFCON EUQ 0x56000050 因为寄存器名和其对应的地址都是系统设计好了的.所以在这里几是想当与将寄存器名和它对应的地址之间的关系建立起来.这样就可以直接通过寄存器名来访问该寄存器了. 3 EXPORT伪指令 在程序里我们常常要定义很多标号,但那些标号只能在本文件中使用,通常一个工程包含很多个文件,要想在别的文件中使用该文件定义的标号就必须使用EXPORT伪指令.含义就是定义一个全局标号,语法格式: EXPORT 标号 例: EXPORT LOOP1

4 IMPORT伪指令 语法格式为: IMPORT 标号 起含义通知编译器此标号在别的文件定义,但在此文件中要使用.一个比较常用的用法是在汇编语言调用C函数时: AREA Init,CODE,READONLY IMPORT Main ;通知编译器当前文件要引用标号Main,但Main在其他源文件中定义 镲 END 5 GET伪指令 相当C语言的INCLUDE指令,语法格式为: GET 文件名 例:GET a1.s ;通知编译器源文件a1.s被包含当前源文件. 作用用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理,但注意GET伪指令只能用于包含源文件,包含目标文件需要使用INCBIN. 伪指令 6 INCBIN INCBIN伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理 语法格式: INCBIN 文件名 INCBIN a1.dat ;通知编译器当前源文件包含文件a1.dat

(完整版)汇编语言中常用的伪指令档

汇编语言中常用的伪指令 分类:软件相关2013-01-23 20:13 515人阅读评论(0) 收藏举报areaequ伪指令常用汇编语言 汇编语言中,指令语句在源程序汇编时会产生可供计算机执行的指令代码,即目标代码。汇编程序除指令语句外,还需要提供一些指令,用于辅助源程序的汇编。比如指定程序或数据存放的起始地址,为数据分配一段连续的内存单元等。这些指令在汇编时并不生成目标代码,不影响程序执行,因此称之为伪指令。本文简单总结了常用的伪指令,如下。 1、EQU(Equate) 一般格式为:标号:EQU 操作数 指令功能为将操作数赋予标号,两边的值完全相等。使用EQU伪指令给一个标号赋值后,此标号在整个源文件中值固定。 AREA: EQU 1000H ;将标号AREA赋值为1000H 2、ORG(Origin) 一般格式为:ORG xxxxH(绝对地址或标号) XxxxH决定此语句后第一条指令(或数据)的地址。该段源程序或数据被连续存放在此后的地址内,直到下一条ORG指令为止。 ORG 8000H ;此后目标代码存储在存储器中以0x8000h开始的地址空间中。 ADD R1,#1 MOV R2, #2 3、DB(Define Byte) 一般格式为:标号:DB 字节常数或字符或表达式 标号字段可有可无,字节常数或字符是指一个字节数据。此伪指令的功能是把字节常数或字节串存放至内存连续的地址空间中。 ORG 8000H DATA1:DB 43H,09H,08H DATA2:DB 07H 伪指令DB指定了43H,09H,08H 顺序存放在8000H开始的存储单元中,DATA2中的07H紧挨着DATA1的地址空间存放,即07H存放在8003H单元中。 注:DW(Define Word)指令定义与DB类似,区别在于DW定义一个字,DB定义一个字节。

DSPC2000汇编指令汇编

第六章 DSP的寻址方式和汇编指令 当硬件执行指令时,寻找指令所指定的参与运算飞操作数的方式——寻址方式。根据程序的要求采用不同的寻址方式,可以有效地缩短程序的运行时间和提高代码执行效率。汇编指令是可执行指令,每一条指令对应一条机器码,用来控制处理器仲的执行部分进行各种操作。在本章节当中将主要以基于C28x的DSP芯片为例,为读者讲解DSP的寻址方式和汇编指令系统,其中大部分内容也可适用于其他Ti公司的DSP产品。 6.1汇编语言指令集概述 在学习C28x系列DSP的寻址方式和汇编指令指令之前,先来对一些基础的知识进行讲解一下先,在汇编程序当中开发人员会常常使用到许多的特殊符号和标志,它们都具有特殊的含义,在学习汇编之前读者们必须先理解这些符号和标志含义,在这里会对其中最常用最重要的操作数符号和寄存器经行详细说明。 在进行汇编讲解之前先来了解一下开发的核心——CPU。在TMS320C2000系列中,CPU 内核为: C20x/C24x/C240x:C2xLP: C27x/C28x:C27x、C28x 这些CPU的硬件结构有一定差别,指令集也不相同,但是,在C28x芯片中可以通过选择兼容特性模式,使C28xCPU与C27xCPU及C2xLPCPU具有最佳兼容性。可通过状寄存器STl的位OBJMODE和位AMODE的组合,选定模式。 C28x芯片具有3种操作模式: 1.C28x模式:在该模式中,用户可以使用C28x的所有有效特性、寻址方式和指令系统, 因此,一般应使C28x芯片工作于该种模式。 2.C27x目标——兼容模式:在复位时,C28x的CPU处于C27x目标-兼容模式。在该模式 下,目标码与C27xCPU完全兼容,且它的循环—计数也与C27xCPU兼容。 3.C2xLP源——兼容模式:该模式允许用户运行C2xLP的源代码,这些源代码是用C28x 代码生成工具编译生成的。 在下面的讲解当中会牵涉到模式的转换,希望读者要搞清楚每一个模式的对应关系。 本节假设条件为芯片工作于C28x模式(OBJMODE=1,AMODE=0)。复位后,通过执行指令C28OBJ或者SETC OBJMODE将ST1中的OBJMODE位置1,芯片即可工作于C28x模式。 6.1.1 DSP中的操作数 汇编语言离不开操作符和操作数,操作符可以认为就是CPU的指令或者编译器上的伪指令,操作数是指令执行过程中的参与者,也可以说操作数就是指令所控制的对象。

相关文档
最新文档