ARM汇编手册.pdf

上传人:zf 文档编号:30838709 上传时间:2024-01-30 格式:PDF 页数:47 大小:869.26KB
下载 相关 举报
ARM汇编手册.pdf_第1页
第1页 / 共47页
ARM汇编手册.pdf_第2页
第2页 / 共47页
ARM汇编手册.pdf_第3页
第3页 / 共47页
ARM汇编手册.pdf_第4页
第4页 / 共47页
ARM汇编手册.pdf_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

ARM汇编手册.pdf

《ARM汇编手册.pdf》由会员分享,可在线阅读,更多相关《ARM汇编手册.pdf(47页珍藏版)》请在冰豆网上搜索。

ARM汇编手册.pdf

北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术ARMARM汇编手册汇编手册版权声明版权声明本手册为北京顶嵌开源科技有限公司内部培训资料,本手册为北京顶嵌开源科技有限公司内部培训资料,本手册为北京顶嵌开源科技有限公司内部培训资料,本手册为北京顶嵌开源科技有限公司内部培训资料,仅仅仅仅供本公司内部学习使用,在未经本公司授权的情况下,请供本公司内部学习使用,在未经本公司授权的情况下,请供本公司内部学习使用,在未经本公司授权的情况下,请供本公司内部学习使用,在未经本公司授权的情况下,请勿勿勿勿用作任何商业用途。

用作任何商业用途。

用作任何商业用途。

用作任何商业用途。

北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术目目录录寄存器装载和存储.5传送单一数据.5传送多个数据.7SWP:

单一数据交换.9算术和逻辑指令.10ADC:

带进位的加法.10ADD:

加法.11AND:

逻辑与.11BIC:

位清除.11EOR:

逻辑异或.12MOV:

传送.12MVN:

传送取反的值.13ORR:

逻辑或.13RSB:

反向减法.14RSC:

带借位的反向减法.14SBC:

带借位的减法.14SUB:

减法.15移位.16逻辑或算术左移.17逻辑右移.17算术右移.17循环右移.18带扩展的循环右移.18乘法指令.19MLA:

带累加的乘法.19MUL:

乘法.19程序状态寄存器访问指令.20MRS指令.20MSR指令.20异常产生指令.22SWI指令.22BKPT指令.22协处理器指令.23CDP指令.23LDC指令.23STC指令.24MCR指令.24MRC指令.24跳转指令.25B指令.25BL指令.25BLX指令.26北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术BX指令.26符号定义(SymbolDefinition)伪指令.271、GBLA、GBLL和GBLS.272、LCLA、LCLL和LCLS.273、SETA、SETL和SETS.284、RLIST.28数据定义(DataDefinition)伪指令.291、DCB.292、DCW(或DCWU).293、DCD(或DCDU).304、DCFD(或DCFDU).305、DCFS(或DCFSU).306、DCQ(或DCQU).307、SPACE.318、MAP.319、FILED.31汇编控制(AssemblyControl)伪指令.321、IF、ELSE、ENDIF.322、WHILE、WEND.323、MACRO、MEND.334、MEXIT.33其他常用的伪指令.341、AREA.342、ALIGN.353、CODE16、CODE32.354、ENTRY.355、END.366、EQU.367、EXPORT(或GLOBAL).368、IMPORT.379、EXTERN.3710、GET(或INCLUDE).3711、INCBIN.3812、RN.3813、ROUT.38APCS简介.39ARM过程调用标准.39介绍.39寄存器命名.40设计关键.41一致性.41栈.41回溯结构.42实际参数.46北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术函数退出.46建立栈回溯结构.46北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术LDMLDRSTMSTRSWP它们可能是能获得的最有用的指令。

其他指令都操纵寄存器,所以必须把数据从内存装载寄存器并把寄存器中的数据存储到内存中。

传送单一数据传送单一数据传送单一数据传送单一数据使用单一数据传送指令(STR和LDR)来装载和存储单一字节或字的数据从/到内存。

寻址是非常灵活的。

首先让我们查看指令格式:

LDR条件Rd,STR条件Rd,LDR条件BRd,STR条件BRd,指令格式这些指令装载和存储Rd的值从/到指定的地址。

如果象后面两个指令那样还指定了B,则只装载或存储一个单一的字节;对于装载,寄存器中高端的三个字节被置零(zeroed)。

地址可以是一个简单的值、或一个偏移量、或者是一个被移位的偏移量。

可以还可以把合成的有效地址写回到基址寄存器(去除了对加/减操作的需要)。

各种寻址方式的示例:

寄存器装载和存储寄存器装载和存储北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术注:

下文中的Rbase是表示基址寄存器,Rindex表示变址寄存器,index表示偏移量,偏移量为12位的无符号数。

用移位选项表示比例因子。

标准寻址方式-用AT&T语法表示为disp(base,index,scale),用Intel语法表示为base+index*scale+disp,中的变址(连带比例因子)与偏移量不可兼得。

STRRd,Rbase存储Rd到Rbase所包含的有效地址。

STRRd,Rbase,Rindex存储Rd到Rbase+Rindex所合成的有效地址。

STRRd,Rbase,#index存储Rd到Rbase+index所合成的有效地址。

index是一个立即值。

例如,STRRd,R1,#16将把Rd存储到R1+16。

STRRd,Rbase,Rindex!

存储Rd到Rbase+Rindex所合成的有效地址,并且把这个新地址写回到Rbase。

STRRd,Rbase,#index!

存储Rd到Rbase+index所合成的有效地址,并且并且把这个新地址写回到Rbase。

STRRd,Rbase,Rindex存储Rd到Rbase所包含的有效地址。

把Rbase+Rindex所合成的有效地址写回Rbase。

STRRd,Rbase,Rindex,LSL#2存储Rd到Rbase+(Rindex*4)所合成的有效地址。

北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术STRRd,place存储Rd到PC+place所合成的有效地址。

你当然可以在这些指令上使用条件执行。

但要注意条件标志要先于字节标志,所以如果你希望在结果是等于的时候装载一个字节,要用的指令是LDREQBRx,(不是LDRBEQ.)。

传送多个数据传送多个数据传送多个数据传送多个数据使用多数据传送指令(LDM和STM)来装载和存储多个字的数据从/到内存。

LDM/STM的主要用途是把需要保存的寄存器复制到栈上。

如我们以前见到过的STMFDR13!

R0-R12,R14。

指令格式是:

xxM条件类型Rn!

xx是LD表示装载,或ST表示存储。

再加4种类型就变成了8个指令:

栈其他LDMEDLDMIB预先增加装载LDMFDLDMIA过后增加装载LDMEALDMDB预先减少装载LDMFALDMDA过后减少装载STMFASTMIB预先增加存储STMEASTMIA过后增加存储STMFDSTMDB预先减少存储STMEDSTMDA过后减少存储北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术指令格式汇编器关照如何映射这些助记符。

注意ED不同于IB;只对于预先减少装载是相同的。

在存储的时候,ED是过后减少的。

FD、ED、FA、和EA指定是满栈还是空栈,是升序栈还是降序栈。

一个满栈的栈指针指向上次写的最后一个数据单元,而空栈的栈指针指向第一个空闲单元。

一个降序栈是在内存中反向增长(就是说,从应用程序空间结束处开始反向增长)而升序栈在内存中正向增长。

其他形式简单的描述指令的行为,意思分别是过后增加(IncrementAfter)、预先增加(IncrementBefore)、过后减少(DecrementAfter)、预先减少(DecrementBefore)。

RISCOS使用传统的满降序栈。

在使用符合APCS规定的编译器的时候,它通常把你的栈指针设置在应用程序空间的结束处并接着使用一个FD(满降序-FullDescending)栈。

如果你与一个高级语言(BASIC或C)一起工作,你将别无选择。

栈指针(传统上是R13)指向一个满降序栈。

你必须继续这个格式,或则建立并管理你自己的栈(如果你是死硬派人士那么你可能喜欢这样做!

)。

基址是包含开始地址的寄存器。

在传统的RISCOS下,它是栈指针R13,但你可以使用除了R15之外的任何可获得的寄存器。

如果你想把复制操作后栈顶的当前的内存地址保存到栈指针中,可以寄存器按从最低到最高的编号次序与到从低端到高端的内存之间传送数据。

并且因为用指令中的一个单一的位来表示是否保存一个寄存器,不可能指定某个寄存器两次。

它的副作用是不能用下面这样的代码:

STMFDR13!

R0,R1LDMFDR13!

R1,R0来交换两个寄存器的内容。

提供了一个有用的简写。

要包含一个范围的寄存器,可以简单的只写第一个和最后一个,并在其间加一个横杠。

例如R0-R3等同与R0,R1,R2,R3,只是更加整齐和理智而已.在把R15存储到内存中的时候,还保存了PSR位。

在重新装载R15的时候,除非你要求否则不恢复PSR位。

要求的方法是在寄存器列表后跟随一个。

STMFDR13!

R0-R12,R14.LDMFDR13!

R0-R12,PC这保存所有的寄存器,做一些事情,接着重新装载所有的寄存器。

从R14装载PC,它由一个BL或此类指令所设置。

不触及PSR标志。

北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术STMFDR13!

R0-R12,R14.LDMFDR13!

R0-R12,PC这保存所有的寄存器,做一些事情,接着重新装载所有的寄存器。

从R14装载PC,它由一个BL或此类指令所设置。

变更PSR标志。

注意在这两个例子中,R14被直接装载到PC中。

这节省了对MOV(S)R14到R15中的需要。

SWPSWPSWPSWP:

单一数据交换单一数据交换单一数据交换单一数据交换(Swap)SWP条件B,指令格式SWP将:

从操作数2所指向的内存装载一个字并把这个字放置到目的寄存器中。

把寄存器操作数1的内容存储到同一个地址中。

如果目的和操作数1是同一个寄存器,则把寄存器的内容和给定内存位置的内容进行交换。

如果提供了B后缀,则将传送一个字节,否则传送一个字。

北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术ADCADDANDBICEORMOVMVNORRRSBRSCSBCSUBADCADCADCADC:

带进位的加法带进位的加法带进位的加法带进位的加法(AdditionwithCarry)ADC条件S,dest=op_1+op_2+carryADC将把两个操作数加起来,并把结果放置到目的寄存器中。

它使用一个进位标志位,这样就可以做比32位大的加法。

下列例子将加两个128位的数。

128位结果:

寄存器0、1、2、和3第一个128位数:

寄存器4、5、6、和7第二个128位数:

寄存器8、9、10、和11。

ADDSR0,R4,R8;加低端的字ADCSR1,R5,R9;加下一个字,带进位ADCSR2,R6,R10;加第三个字,带进位ADCSR3,R7,R11;加高端的字,带进位如果如果要做这样的加法,不要忘记设置S后缀来更改进位标志。

算术和逻辑指令算术和逻辑指令北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术ADDADDADDADD:

加法加法加法加法(Addition)ADD条件S,dest=op_1+op_2ADD将把两个操作数加起来,把结果放置到目的寄存器中。

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:

ADDR0,R1,R2;R0=R1+R2ADDR0,R1,#256;R0=R1+256ADDR0,R2,R3,LSL#1;R0=R2+(R31)加法可以在有符号和无符号数上进行。

ANDANDANDAND:

逻辑与逻辑与逻辑与逻辑与(logicalAND)AND条件S,dest=op_1ANDop_2AND将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:

ANDR0,R0,#3;R0=保持R0的位和1,丢弃其余的位。

AND的真值表(二者都是1则结果为1):

Op_1Op_2结果000010100111BICBICBICBIC:

位清除位清除位清除位清除(BitClear)BIC条件S,北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术dest=op_1AND(!

op_2)BIC是在一个字中清除位的一种方法,与OR位设置是相反的操作。

操作数2是一个32位位掩码(mask)。

如果如果在掩码中设置了某一位,则清除这一位。

未设置的掩码位指示此位保持不变。

BICR0,R0,#%1011;清除R0中的位0、1、和3。

保持其余的不变。

BIC真值表:

Op_1Op_2结果000010101110注:

逻辑表达式为Op_1ANDNOTOp_2EOREOREOREOR:

逻辑异或逻辑异或逻辑异或逻辑异或(logicalExclusiveOR)EOR条件S,dest=op_1EORop_2EOR将在两个操作数上进行逻辑异或,把结果放置到目的寄存器中;对反转特定的位有用。

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:

EORR0,R0,#3;反转R0中的位0和1EOR真值表(二者不同则结果为1):

Op_1Op_2结果000011101110MOVMOVMOVMOV:

传送传送传送传送(Move)MOV条件S,北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术dest=op_1MOV从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。

你可以指定相同的寄存器来实现NOP指令的效果,你还可以专门移位一个寄存器:

MOVR0,R0;R0=R0.NOP指令MOVR0,R0,LSL#3;R0=R0*8如果R15是目的寄存器,将修改程序计数器或标志。

这用于返回到调用代码,方法是把连接寄存器的内容传送到R15:

MOVPC,R14;退出到调用者MOVSPC,R14;退出到调用者并恢复标志位(不遵从32-bit体系)MVNMVNMVNMVN:

传送取反的值传送取反的值传送取反的值传送取反的值(MoveNegative)MVN条件S,dest=!

op_1MVN从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。

不同之处是在传送之前位被反转了,所以把一个被取反的值传送到一个寄存器中。

这是逻辑非操作而不是算术操作,这个取反的值加1才是它的取负的值:

MVNR0,#4;R0=-5MVNR0,#0;R0=-1ORRORRORRORR:

逻辑或逻辑或逻辑或逻辑或(logicalOR)ORR条件S,dest=op_1ORop_2OR将在两个操作数上进行逻辑或,把结果放置到目的寄存器中;对设置特定的位有用。

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:

ORRR0,R0,#3;设置R0中位0和1OR真值表(二者中存在1则结果为1):

Op_1Op_2结果000北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术011101111RSBRSBRSBRSB:

反向减法反向减法反向减法反向减法(ReverseSubtraction)RSB条件S,dest=op_2-op_1SUB用操作数twotwotwotwo减去操作数oneoneoneone,把结果放置到目的寄存器中。

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:

RSBR0,R1,R2;R0=R2-R1RSBR0,R1,#256;R0=256-R1RSBR0,R2,R3,LSL#1;R0=(R31)-R2反向减法可以在有符号或无符号数上进行。

RSCRSCRSCRSC:

带借位的反向减法带借位的反向减法带借位的反向减法带借位的反向减法(ReverseSubtractionwithCarry)RSC条件S,dest=op_2-op_1-!

carry同于SBC,但倒换了两个操作数的前后位置。

SBCSBCSBCSBC:

带借位的减法带借位的减法带借位的减法带借位的减法(SubtractionwithCarry)SBC条件S,dest=op_1-op_2-!

carrySBC做两个操作数的减法,把结果放置到目的寄存器中。

它使用进位标志来表示借位,这样就可以做大于32位的减法。

SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除清除进位标志。

所以,指令要对进位标志进行一个非非操作-在指令执行期间自动的反北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术转此位。

SUBSUBSUBSUB:

减法减法减法减法(Subtraction)SUB条件S,dest=op_1-op_2SUB用操作数oneoneoneone减去操作数twotwotwotwo,把结果放置到目的寄存器中。

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:

SUBR0,R1,R2;R0=R1-R2SUBR0,R1,#256;R0=R1-256SUBR0,R2,R3,LSL#1;R0=R2-(R31)减法可以在有符号和无符号数上进行。

北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术LSLASLLSRASRRORRRXARM处理器组建了可以与数据处理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrelshifter)。

你还可以使用桶式移位器影响在LDR/STR操作中的变址值。

注:

移位操作在ARM指令集中不作为单独的指令使用,它是指令格式中是一个字段,在汇编语言中表示为指令中的选项。

如果数据处理指令的第二个操作数或者单一数据传送指令中的变址是寄存器,则可以对它进行各种移位操作。

如果数据处理指令的第二个操作数是立即值,在指令中用8位立即值和4位循环移位来表示它,所以对大于255的立即值,汇编器尝试通过在指令中设置循环移位数量来表示它,如果不能表示则生成一个错误。

在逻辑类指令中,逻辑运算指令由指令中S位的设置或清除来确定是否影响进位标志,而比较指令的S位总是设置的。

在单一数据传送指令中指定移位的数量只能用立即值而不能用寄存器。

下面是给不同的移位类型的六个助记符:

LSL逻辑左移ASL算术左移LSR逻辑右移ASR算术右移ROR循环右移RRX带扩展的循环右移ASL和LSL是等同的,可以自由互换。

你可以用一个立即值(从0到31)指定移位数量,或用包含在0和31之间的一个值的寄存器指定移位数量。

移位移位北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司北京顶嵌开源科技有限公司WWW.TOP-E.ORG400-661-5264400-661-5264400-661-5264400-661-5264专注嵌入式专注嵌入式LinuxLinuxLinuxLinux技术技术逻辑或算术左移逻辑或算术左移逻辑或算术左移逻辑或算术左移(LogicalorArithmeticShiftLeft)Rx,LSL#norRx,ASL#norR

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 自我管理与提升

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1