湖南响应式网站公司,免费建网站赚钱,怎么做网站站长,app开发公司重庆文章目录 上一篇编译环境ADS编译环境下的伪操作GNU编译环境下的伪操作ARM汇编语言的伪指令 汇编语言程序设计相关运算操作符汇编语言格式汇编语言程序重点C语言的一些技巧 下一篇 上一篇
嵌入式系统复习–Thumb指令集
编译环境
ADS/SDT IDE开发环境#xff1a;它由ARM公司开… 文章目录 上一篇编译环境ADS编译环境下的伪操作GNU编译环境下的伪操作ARM汇编语言的伪指令 汇编语言程序设计相关运算操作符汇编语言格式汇编语言程序重点C语言的一些技巧 下一篇 上一篇
嵌入式系统复习–Thumb指令集
编译环境
ADS/SDT IDE开发环境它由ARM公司开发使用了CodeWarrior公司的编译器
一般的集成了GNU开发工具的IDE开发环境它由GNU的汇编器as、交叉编译器gcc、和链接器ld等组成
伪操作ARM汇编语言程序里的特殊指令助记符主要作用是完成汇编程序各种准备工作在源程序进行编译时由汇编程序处理而不是在计算机运行期间执行宏指令是一段独立的代码、可插在源程序中它通过伪操作来定义。通过实际指令替代宏体实现相关的一段代码伪指令ARM汇编语言里的特殊指令助记符不在处理器运行期间由机器执行。它们在编译时将被合适的机器指令替代
ADS编译环境下的伪操作
常用伪操作可分为
符号定义伪操作 定义全局变量 伪操作语法格式作用GBLAGBLA Variable声明一个全局的算术变量初始化为0GBLLGBLL Variable声明一个全局的逻辑变量初始化为falseGBLSGBLS Variable声明一个全局字符串变量初始化为空串 定义局部变量 伪操作语法格式作用LCLALCLA Variable声明一个局部的算术变量初始化为0LCLLLCLL Variable声明一个局部的逻辑变量初始化为falseLCLSLCLS Variable声明一个局部字符串变量初始化为空串 为变量赋值 伪操作语法格式作用SETAVariable SETA expr给一个算术变量赋值SETLVariable SETL expr给一个逻辑变量赋值SETSVariable SETS expr给一个字符串赋值 给一串寄存器命名 伪操作语法格式作用RLISTname RLIST {list of registers}为一个通用寄存器列表定义名称 数据定义伪操作 为一个变量分配内存地址 伪操作语法格式作用DCB{label} DCB expr分配一段字节的内存单元用字节的方式放exprDCD{label} DCD expr分配一段字的内存单元用字的方式放expr 定义数据块的起始地址 伪操作语法格式作用LTORGLTORG声明一个数据缓冲池的开始说明此指令后面不是代码而是数据了 汇编控制伪操作 条件IF 逻辑表达式
{
ELSE
}
ENDIF循环WHILE 逻辑表达式
...
WEND宏定义 类似子程序调用但是他不是跳转到子程序而是直接将宏定义的代码直接复制到宏名称那里MACRO
{$label} macroname {$parameter}
MEND信息报告伪操作 在程序运行不同阶段可以设置让他弹出信息 伪操作语法格式作用OPTOPT n通过OPT可以在源程序中设置列表选项 其他伪操作 告诉编译器要选择的指令 伪操作语法格式作用CODE 16CODE 16告诉编译器后面是Thumb指令CODE 32CODE 32告诉编译器后面是ARM指令 定义常量给变量或标号赋值 伪操作语法格式作用EQUname EQU expr将name赋值为expr 程序结构指令 伪操作语法格式作用AREAAREA sectioname {, attr}定义一个代码段或数据段ENTRYENTRY指定程序的入口点ENDEND告诉编译器已经到了源程序结尾 混合调用用到的指令 伪操作语法格式作用EXPORT/GLOBALEXPORT symbol {[WEAK]}声明一个文件可以被其他文件引用相当于声明以个全局变量IMPORT/EXTERNIMPORT/EXTERN symbol {[WEAK]}告诉编译器当前符号不是在本源文件中定义的而是在其他文件中而在本文件中可能使用
GNU编译环境下的伪操作
常用伪操作为 常量编译控制伪操作 伪操作语法格式作用.byte.byte expr分配一段字节空间并用字节的方式放入expr.hword/ .short.hword expr分配一段半字节空间并用半字的方式放入expr.ascii.ascii expr定义字符串expr(非零结束符.asciz/.string.asciz定义字符串以 /0 为结束符.word.word expr分配一段字内存空间 汇编程序代码控制伪操作 伪操作语法格式作用.section.section expr定义域中包含的段.text.text{subsection}代码.data.data {subsection}数据.code 16.code 16表明后面是Thumb指令集.code 32.code 32表明后面是ARM指令集.end.end结束标识符.include.include “filename”将一个源文件包含到当前源文件中 宏及条件编译控制伪操作 .macro以及.endm .macro condition
.endm.ifdef, .else及.endif .ifdef condition
.else
.endif其他伪操作 伪操作语法格式作用.print.print string打印信息到标准输出
ARM汇编语言的伪指令
伪操作语法格式作用ADRADR {cond} register, expr将基于PC或基址寄存器的地址读到寄存器中小范围的地址读取ADRLADRL {cond} register,expr将基于PC或基址寄存器的地址读到寄存器中中等范围的地址读取LDRLDR {cond} register将一个32位的立即数或一个地址值读取到寄存器中大范围地址读取NOPNOP汇编是替换成ARM的空指令占用一个操作时间但什么到不做
汇编语言程序设计 文件格式 ARM源程序文件可以有任意一种纯文本文件编写程序代码 文件格式对应与 源程序文件文件名说明汇编程序文件*.S用ARM汇编语言编写的ARM程序或Thumb程序C程序文件*.C用C语言编写的程序代码头文件*.H通常将常量命名、宏定义、数据结构定义等放在头文件中 ARM汇编语言语句格式如下 {符号} {指令 | 伪操作 | 伪指令} {; 注释}为注释符 符号可以代表地址、变量和数字常量 命名规则符号由大小写字母、数字以及下划线组成区分大小写 局部标号以数字开头其他符号都不能以数字开头 变量 三种变量数字变量、逻辑变量、串变量 数字常量表示方式十进制十六进制n进制 标号表示程序中的指令或地址的标号分为基于PC的标号、基于寄存器的标号、绝对地址 局部标号相对当前位置 % {F|B} {A|T} N{routname}其中%表示引用操作、F表示只先向前搜索、B表示向后搜索、A表示编译器搜索宏的搜索嵌套层次、T表示宏的当前层次
相关运算操作符
字符串表达式相关操作符 LEN返回字符串的长度 例 GBLS STR
STR SETS AAA
:LEN: STR ;LEN 3CHR: 返回一个字符的ASCII值 :CHR:ASTR: 将对应变量数字量或逻辑量的表示形式用字符串的形式表示 例 GBLA A1
A1 SETA 15
:STR: A1LEFT :返回一个字符从最左端的一定长度的字串 格式 A :LEFT: BA为源字符串B为数字量表示返回字符个数 例 GBLS STR1
GBLS STR2
SETS STR1 AAAABBBB
SETS STR2 STR1 :LEFT:3 ;结果为STR2为 “AAA”RIGHT同理返回最右端一定长度的字串 CC:连接2个字符串 A :CC: BA为第一个源字符串B为第二个源字符串 例 GBLS STR1
GBLS STR2
STR1 SETS AAACCC
STR2 SETS BBB :CC: (STR1 :LEFT: 3) ; 结果为STR2 为BBBAAA数字表达式相关操作符 NOT:按位取反:NOT: A、-、x、/及MOD: 算术操作符A B ;
A - B;
A x B;
A / B;
A :MOD: B;ROL、ROR、SHL、SHR循环移位操作A :ROL: B ;将整数A循环左移B位
A :ROR: B将整数A循环右移B位
A :SHL: B 将整数A左移B位空位补0
A :SHR: B将整数A右移B位空位补0AND、OR、EOR:按位逻辑操作符A :AND: B ;按位与操作
A :OR: B;按位或操作
A :EOR: B按位异或操作逻辑表达式 关系操作符 、、、 不等于 / 或则 逻辑操作符:LNOT: A 取反
A :LAND: B逻辑与
A :LOR: B逻辑或
A :LEOR: B逻辑异或汇编语言格式
ARM汇编语言是以段section为单位来组织源文件的。 段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。 段又可以分为代码段和数据段。一个源程序至少需要一个代码段。
例
AREA EXAMPLE(段的名字), CODE(代码段, READONLY(只读)
ENTRY程序入口点
start
...
END汇编语言程序重点 子程序的调用 子程序的调用通过BL指令来完成 语法格式为 BL subname(被调用子程序的名称)子程序的返回 在返回调用子程序时将LR寄存器R14中的值拷贝回程序寄存器R15 当没有嵌套时 SUB2 ...MOV PC, R14当发生嵌套时, 对于在子程序中出现嵌套调用时链接寄存器LR中的返回地址可能会在第二次调用时被覆盖所以需要将返回地址压入堆栈来进行保存 SUB1 STMFD SP!, {R0 - R7, R14}; 保存工作寄存器和链接
BL SUB2
...
LDMFD SP!, {R0 - R7, PC}; 恢复工作寄存器并返回 跳转表 类似于c中的switch 调用一系列子程序中的一个而决定调用哪一个由程序的计算值决定。 例 BL JUMPTAB; R0存放对应的跳转信息 0表示0号程序...JUMPTAB ADR R1, SUBTAB; R1 - SUBTABCMP R0, #SUBMAX; 检查是否超限LDRLS PC, [R1, R0, LSL #2]; 如果OK则跳转到表中B ERROR; 否则发生错误SUBTAB DCD SUB0DCD SUB1DCD SUB2...
SUB MAX;散转表结束地址ARM与Thumb间的状态转换 状态切换是通过一条专用的转移交换指令BX来实现的。 当Rn寄存器中的目的地址的最后一位为0时转换到ARM状态 当Rn寄存器中最后一位为1时转换到Thumb状态 Thumb地址是半字对齐的末尾一定是0 CODE32ADR R0, Into_Thumb 1BX R0...
CODE16Into_Thumb:...ADR R5, BACK_TO_ARMBX R5...
CODE32Back_to_ARM...应用实例
简单的ARM指令程序 数据块复制
AREA STRINGCOPY, CODE, READ ONLY
NUM EQU 20
CODE 32
ENTRY
startLDR R0, srcLDR R1, dst LDR R2, #NUM; 移动字符串个数LDR SP, #0x400 ; 初始化堆栈指针
BACK; 备份STMFD SP!, {R4-R11}; 将R4与R11中的内容提前保护MOVS R3, R2, LSR #3; 移动次数NUM整除8的商BEQ YUSHU; 如果不满8个字符看是否有余数
BLOCKCOPY ; 按块移动每次移动8个字符LDMIA R0!, {R4-R11} ;将src中8个字符块移动到R4到R11中STMIA R1!, {R4-R11} ;将移入的字符移到dst中SUBS R3, R3, #1BNE BLOCKCOPY; 未把商移动完就循环LDMFD SP!, {R4-R11}; 将保护的寄存器出栈
YUSHUANDS R2, R2, #7; 将R2只保留8以内的余数了方便后边一个字符的搬运BEQ stop
WCOPY ; 一个字符一个字符的移动LDR R3, [R0], #4; 字对齐每次移动4STR R3, [R1], #4SUBS R2, R2, #1BNE WCOPY
stopMOV R0, #0x18LDR R1, #0x20026SWI 0x123456
AREA DATA1, DATE, READWRITE
src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
END利用跳转表实现程序跳转
C语言的一些技巧 变量定义 把所有相同类型的变量放在一起定义这样可以优化存储器空间局部变量使用32位int或unsinged int有时会更有效率。因为每个寄存器是32位的变量定义为了精简是要避免使用冗余变量。但有时使用冗余变量可以减少存储器的访问次数提高系统性能冗余变量一般在寄存器一般变量在存储器 参数传递 为了单独编译C语言程序和汇编程序能够相互调用定义了同一的函数过程调用标准ATPCS ATPCS规则 寄存器的使用规则 子程序通过寄存器R0 ~ R3来传递参数 使用R4 ~ R11来保存局部变量因此在进入子程序前要保存这些寄存器的值返回后恢复在Thumb中只使用R4 ~ R7数据栈的使用规则 ATPCS规定数据栈为FD满递减类型并且对数据栈的操作时8字节对齐的参数的传递规则 当参数固定的情况下第一个整数参数通过寄存器R0 ~ R3来传递。其他参数通过数据栈传递 当参数个数可变的子程序当不超过4个时用R0 ~ R3 来传递超过4个时使用数据栈来传递参数 结果返回是以32位为界每多一个32就从R0 ~ R3中多增加一个来传递 循环时使用i -- 可以省一些汇编指令更有效率
下一篇
未完待续 文章转载自: http://www.morning.ffhlh.cn.gov.cn.ffhlh.cn http://www.morning.xpgwz.cn.gov.cn.xpgwz.cn http://www.morning.shuanga.com.cn.gov.cn.shuanga.com.cn http://www.morning.xtdms.com.gov.cn.xtdms.com http://www.morning.zztmk.cn.gov.cn.zztmk.cn http://www.morning.myhpj.cn.gov.cn.myhpj.cn http://www.morning.rgyts.cn.gov.cn.rgyts.cn http://www.morning.llxqj.cn.gov.cn.llxqj.cn http://www.morning.ckcjq.cn.gov.cn.ckcjq.cn http://www.morning.rjrlx.cn.gov.cn.rjrlx.cn http://www.morning.kmqlf.cn.gov.cn.kmqlf.cn http://www.morning.nywrm.cn.gov.cn.nywrm.cn http://www.morning.tqsgt.cn.gov.cn.tqsgt.cn http://www.morning.ktblf.cn.gov.cn.ktblf.cn http://www.morning.dxtxk.cn.gov.cn.dxtxk.cn http://www.morning.tpyjr.cn.gov.cn.tpyjr.cn http://www.morning.cnqff.cn.gov.cn.cnqff.cn http://www.morning.qcdtzk.cn.gov.cn.qcdtzk.cn http://www.morning.fkflc.cn.gov.cn.fkflc.cn http://www.morning.bzkgn.cn.gov.cn.bzkgn.cn http://www.morning.xqjh.cn.gov.cn.xqjh.cn http://www.morning.fnfhs.cn.gov.cn.fnfhs.cn http://www.morning.kqgsn.cn.gov.cn.kqgsn.cn http://www.morning.nfsrs.cn.gov.cn.nfsrs.cn http://www.morning.gydsg.cn.gov.cn.gydsg.cn http://www.morning.csnmd.cn.gov.cn.csnmd.cn http://www.morning.fgwzl.cn.gov.cn.fgwzl.cn http://www.morning.jyyw.cn.gov.cn.jyyw.cn http://www.morning.jjxnp.cn.gov.cn.jjxnp.cn http://www.morning.wqbzt.cn.gov.cn.wqbzt.cn http://www.morning.inheatherskitchen.com.gov.cn.inheatherskitchen.com http://www.morning.jqwpw.cn.gov.cn.jqwpw.cn http://www.morning.skksz.cn.gov.cn.skksz.cn http://www.morning.mflqd.cn.gov.cn.mflqd.cn http://www.morning.rxkq.cn.gov.cn.rxkq.cn http://www.morning.cnqwn.cn.gov.cn.cnqwn.cn http://www.morning.zmbzl.cn.gov.cn.zmbzl.cn http://www.morning.nckjk.cn.gov.cn.nckjk.cn http://www.morning.jqrhz.cn.gov.cn.jqrhz.cn http://www.morning.rjkfj.cn.gov.cn.rjkfj.cn http://www.morning.xqgh.cn.gov.cn.xqgh.cn http://www.morning.svtxeu.com.gov.cn.svtxeu.com http://www.morning.ktlfb.cn.gov.cn.ktlfb.cn http://www.morning.kmqms.cn.gov.cn.kmqms.cn http://www.morning.blqsr.cn.gov.cn.blqsr.cn http://www.morning.nkwgy.cn.gov.cn.nkwgy.cn http://www.morning.hnrqn.cn.gov.cn.hnrqn.cn http://www.morning.rfhwc.cn.gov.cn.rfhwc.cn http://www.morning.kdhrf.cn.gov.cn.kdhrf.cn http://www.morning.cylbs.cn.gov.cn.cylbs.cn http://www.morning.mxbks.cn.gov.cn.mxbks.cn http://www.morning.mzzqs.cn.gov.cn.mzzqs.cn http://www.morning.cznsq.cn.gov.cn.cznsq.cn http://www.morning.dnwlb.cn.gov.cn.dnwlb.cn http://www.morning.fnmtc.cn.gov.cn.fnmtc.cn http://www.morning.hwpcm.cn.gov.cn.hwpcm.cn http://www.morning.mhmsn.cn.gov.cn.mhmsn.cn http://www.morning.twfdm.cn.gov.cn.twfdm.cn http://www.morning.rntgy.cn.gov.cn.rntgy.cn http://www.morning.kwz6232.cn.gov.cn.kwz6232.cn http://www.morning.mmxt.cn.gov.cn.mmxt.cn http://www.morning.nlbhj.cn.gov.cn.nlbhj.cn http://www.morning.fnpyk.cn.gov.cn.fnpyk.cn http://www.morning.rqlqd.cn.gov.cn.rqlqd.cn http://www.morning.kjawz.cn.gov.cn.kjawz.cn http://www.morning.pjyrl.cn.gov.cn.pjyrl.cn http://www.morning.ssglh.cn.gov.cn.ssglh.cn http://www.morning.qqbjt.cn.gov.cn.qqbjt.cn http://www.morning.csxlm.cn.gov.cn.csxlm.cn http://www.morning.hrtwt.cn.gov.cn.hrtwt.cn http://www.morning.bryyb.cn.gov.cn.bryyb.cn http://www.morning.yzmzp.cn.gov.cn.yzmzp.cn http://www.morning.mtzyr.cn.gov.cn.mtzyr.cn http://www.morning.kpbq.cn.gov.cn.kpbq.cn http://www.morning.xcjwm.cn.gov.cn.xcjwm.cn http://www.morning.pkmw.cn.gov.cn.pkmw.cn http://www.morning.kqlrl.cn.gov.cn.kqlrl.cn http://www.morning.mngh.cn.gov.cn.mngh.cn http://www.morning.gqfbl.cn.gov.cn.gqfbl.cn http://www.morning.ywtbk.cn.gov.cn.ywtbk.cn