arm汇编指令笔记.
arm汇编指令积累
arm汇编指令积累arm 汇编指令积累2011-03-26 14:40 1115人阅读评论(0) 收藏举报一、ldr的确是个复杂的指令,现总结一下:首先要判断我们用的是ldr arm指令还是伪指令。
当我们用的是arm指令时,它的作用不是向寄存器里加载立即数,而是将某个地址里的内容加载到寄存器。
而伪指令ldr的作用就是向寄存器里加载立即数。
(1) ldr伪指令ldr伪指令的格式是 ldr Rn, =expr其中,expr是要加载到Rn中的内容,一般可以是立即数或者label。
如果expr可以用8bit数据向右移偶数位得到,那么这条伪指令就被编译器翻译成mov指令。
具体的移位情况可以去查阅资料。
反之如果立即数很大,超过了12bit的表示范畴,那么就不能用一条mov指令了,毕竟arm指令最大只有32bit的空间可用(RISC的arm所有的指令长度是一致的,效率较高,当然我们并不关心16bit的thumb 指令)。
如果不能用一条32bit的指令乘下来,那么就只能另辟蹊径了,新开一段缓冲,将立即数expr放到里面,然后将其地址(暂时标记为addr)拿来使用:ldr Rn, addrxxx (xxx就是expr)xxx由于编译器一般来说新安排的存储这个立即数expr的缓冲的位置是在相应代码的附近(这个应该可以控制,好像是使用.ltorg伪指令)。
我们从addr地址加载数据到Rn不就可以了。
(2)ldr arm 指令就是将一个地址的内容加载到寄存器。
不能用mov,因为arm里的mov只是在寄存器之间传输数据,不支持在寄出器和memory之间传递数据。
因此就出现了ldr/str指令。
如ldr Rn, addr,注意这里的addr的值也是有限制的。
这个label应该距离当前指令的距离不超过4k。
因为我们知道label在具体使用的时候应该是被翻译成了相对偏移,如果这个label长度不超过12bit,那么就不应超过4k,我们可以这样做:ldr pc, _start_armboot_start_armboot: .word arm_startboot这样label _start_armboot就在指令下方,因此肯定是合法的。
ARM汇编语言指令总结
ARM汇编语⾔指令总结ARM处理器有9种寻址⽅式:1、寄存器寻址,2、⽴即寻址,3、寄存器器移位寻址,4、寄存器间接寻址,5、基址寻址,6、多寄存器寻址,7、堆栈寻址,8、块拷贝寻址,9、相对寻址。
ARM指令集:ARM指令基本格式如下:{}{S} ,{,}其中<>的内容是必须的,{}的内容是可选的。
OPCODE指令助记符,COND执⾏条件,S是否影响CPSR中的值,Rd⽬标寄存器,Rn 第⼀个操作数的寄存器,OPERAND2第⼆个操作数。
灵活的使⽤第2个操作数“operand2”能够提⾼代码效率。
它有如下的形式:1)#immed_8r ——常数表达式;2)Rm——寄存器⽅式;3)Rm,shift——寄存器移位⽅式(ASR算术右移,LSL逻辑左移,LSR 逻辑右移,ROR循环右移,RRX带扩展的右移1位)。
COND执⾏条件:下⾯介绍ARM指令:1、存储器访问指令。
存储器访问指令分为单寄存器操作指令和多寄存器操作指令。
单寄存器操作指令LDR/STR指令⽤于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等。
LDR:从内存到寄存器,加载数据。
STR:将寄存器的数据存储到内存。
LDRB操作字节,LDRH操作半字,LDRSH操作有符号半字。
多寄存器操作指令LDM为加载多个寄存器;STM为存储多个寄存器。
允许⼀条指令传送16个寄存器的任何⼦集或所有寄存器。
它们主要⽤于现场保护、数据复制、常数传递等。
进⾏数据复制时,先设置好源数据指针和⽬标指针,然后使⽤块拷贝寻址指令LDMIA/STMIA(传送后地址加4)、LDMIB/STMIB(传送前地址加4)、LDMDA/STMDA(传送后地址减4)、LDMDB/STMDB(传送前地址减4)进⾏读取和存储。
进⾏堆栈操作操作时,要先设置堆栈指针(SP),然后使⽤堆栈寻址指令STMFD/LDMFD(满递减堆栈)、STMED/LDMED(空递减堆栈)、STMFA/LDMFA(满递增堆栈)和STMEA/LDMEA(空递增堆栈)实现堆栈操作。
ARM的汇编指令讲解
汇编知识点的要求:1、能看的懂2、可以做修改3、不需要用汇编直接编写程序汇编代码的应用场合:1、ARM的启动代码必须要汇编,如:uboot最开始初始化硬件的代码2、内核在最开始初始化的位置。
一、ARM汇编指令的编码格式1、编码格式ARM汇编指令编译成机器码以后,机器码的长度是32bits,这32bits的编码有一个固定的格式。
不同ARM 汇编指令,编码格式不同。
2、举例C:if(a==10)a++;elsea--;汇编1:CMP R0, #10;ADDEQ R0,R0,#1SUBNE R0,R0,#1汇编2SUBS R1, R0, #10; //S ---运算的结果会影响条件码标志位:CPSR:NZCVADDEQ R0,R0,#1SUBNE R0,R0,#1提示:空指令NOP,实际上是占用CPU的时间,但是执行后,没有什么意义。
NOP ---- MOV R0,R03、条件码标识10 -10Z = 1C = 0N = 0V = 0=================================================================================二、ARM的寻址方式1、立即数寻址操作数,有立即数。
ADD R0,R0,#1MOV R1,#10ORR R1,R1,#0xf @ R1=R1 | 0xfBIC 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 合法0xfff0xff000x120000x4500000xab原因:在数据处理指令编码的时候,立即数用12bits来表示:高4bits:循环左移左移偶数位除以2低8bits:循环左移后的结果。
ARM中常用的汇编指令
ARM 中常⽤的汇编指令1 处理器内部数据传输指令MSR & MRS⽤于在状态寄存器和通⽤寄存器之间传送数据MRS: 状态寄存器到通⽤寄存器的传送指令。
({R0-R12} <== CPSR,SPSR)MSR: 通⽤寄存器到状态寄存器的传送指令。
MRS:(CPSR,SPSR==>{R0-R12})MOVMOV 指令⽤于将数据从⼀个寄存器拷贝到另外⼀个寄存器,或者将⼀个⽴即数传递到寄存器⾥⾯,使⽤⽰例如下:2 存储器访问指令ARM 不能直接访问存储器,⽐如 RAM 中的数据,⼀般先将要配置的值写⼊到 Rx(x=0~12)寄存器中,然后借助存储器访问指令将 Rx 中的数据写⼊到寄存器中。
指令描述LDR Rd, [Rn , #offset]从存储器 Rn+offset 的位置读取数据存放到 Rd 中STR Rd, [Rn, #offset]将 Rd 中的数据写⼊到存储器中的 Rn+offset 位置LDR 指令LDR 主要⽤于从存储加载数据到寄存器 Rx 中, LDR 也可以将⼀个⽴即数加载到寄存器 Rx中, LDR 加载⽴即数的时候要使⽤“=”,⽽不是“#”。
在嵌⼊式开发中, LDR 最常⽤的就是读取 CPU 的寄存器值。
上述代码就是读取寄存器中的值,读取到的寄存器值保存在 R1 寄存器中,上⾯代码中 offset 是 0,也就是没有⽤到 offset。
STR 指令LDR 是从存储器读取数据, STR 就是将数据写⼊到存储器中LDR 和 STR 都是按照字进⾏读取和写⼊的,也就是操作的 32 位数据,如果要按照字节、半字进⾏操作的话可以在指令“LDR”后⾯加上B 或 H,⽐如按字节操作的指令就是 LDRB 和STRB,按半字操作的指令就是 LDRH 和 STRH。
MRS R0, CPSR @ 将特殊寄存器 CPSR ⾥⾯的数据传递给 R0,即R0=CPSR1MSR CPSR , R0 @ 将 R0 中的数据复制到 CPSR 中,即 CPSR =R01MOV R0, R1 @ 将寄存器 R1 中的数据传递给 R0,即 R0=R1MOV R0, #0X12 @ 将⽴即数 0X12 传递给 R0 寄存器,即 R0=0X1212LDR R0, =0X0209C004 @ 将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004LDR R1, [R0] @ 读取地址 0X0209C004 中的数据到 R1 寄存器中12LDR R0, =0X0209C004 @ 将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004LDR R1, =0X20000002 @ R1 保存要写⼊到寄存器的值,即R1=0X20000002STR R1, [R0] @ 将 R1 中的值写⼊到 R0 中所保存的地址中1233 压栈和出栈指令我们通常会在 A 函数中调⽤ B 函数,当 B 函数执⾏完以后再回到 A 函数继续执⾏。
ARM常用汇编语句
ARM常用汇编语句一 bne 和beq 跳转指令bne里的1b是向后跳转到局部标签1处执行,b表示backward,例如:对应的还有bne 1f(向前跳到局部标签1处执行)1: ;Acmp r0, #0beq 1f ; r0==0那么向前跳转到B处执行bne 1b ; 否则向后跳转到A处执行1: ;B1b,1f里的b和f表示backward和forward,1表示局部标签1TST指令是数据处理指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。
例如:TST R1,#%1用于测试在寄存器R1中是否设置了最低位。
BEQ指定是跳转指令,但是跳转要满足一定的条件,例:CMP R1,#0 BEQ Label 即当R1和0相等的时候程序跳到标号Label处执行二 bl跳转指令B或BL指令引起处理器转移到“子程序名”处开始执行。
两者的不同之处在于BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链接寄存器)。
由于BL指令保存了下条指令的地址,因此使用指令“MOV PC ,LR”即可实现子程序的返回。
而B指令则无法实现子程序的返回,只能实现单纯的跳转。
用户在编程的时候,可根据具体应用选用合适的子程序调用语句。
BL非常常用。
它在跳转之前会在寄存器LR(R14)中保存PC的当前内容。
BL的经典用法如下:bl NEXT ; 跳转到NEXT三 MCR MRC指令MCR指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。
如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。
指令的语法格式:MCR{<cond>} p15, 0, <Rd>, <CRn>, <CRm>{,<opcode_2>} MCR2 p15, 0, <Rd>, <CRn>, <CRm>{,<opcode_2>}其中,<cond>为指令执行的条件码。
android 逆向中常用的arm汇编指令基础知识
android 逆向中常用的arm汇编指令基础知识在Android 逆向工程中,了解ARM 汇编指令的基础知识对于理解和分析应用程序的底层行为至关重要。
以下是一些常用的ARM 汇编指令及其简要说明:数据移动指令:MOV:将源操作数的值复制到目标寄存器。
STR:将寄存器的值存储到内存中。
LDR:从内存中加载值到寄存器。
算术指令:ADD:加法。
SUB:减法。
MUL:乘法。
DIV:除法。
AND:位与。
ORR:位或。
XOR:位异或。
NOT:位非。
比较指令:CMP:比较两个值,并根据结果设置条件标志。
TST:测试寄存器的位,并根据结果设置条件标志。
条件分支指令:B:无条件分支。
BEQ:当相等时分支。
BNE:当不相等时分支。
BGT:当大于时分支。
BLT:当小于时分支。
BGE:当大于或等于时分支。
BLE:当小于或等于时分支。
堆栈操作指令:PUSH:将寄存器值压入堆栈。
POP:从堆栈中弹出值到寄存器。
加载/存储指令:LDM:从内存加载多个寄存器。
STM:将多个寄存器存储到内存。
交换指令:SWP:交换寄存器的值与内存中的值。
程序控制指令:BL:带返回的分支。
BX:跳转到寄存器指定的地址。
了解这些指令可以帮助你在逆向工程中识别和分析关键代码段,例如函数入口、出口、条件跳转等。
此外,对于某些特定的逆向工程技术,如hooking、代码注入等,对ARM 汇编的深入理解也是必不可少的。
请注意,ARM 架构有多个版本(如ARMv7、ARMv8 等),不同版本可能具有不同的指令集和特性。
因此,在具体的应用中,你可能需要参考特定版本的ARM 架构文档来获取更详细和准确的信息。
arm 汇编 指令
arm 汇编指令ARM汇编指令是一种用于编写ARM处理器程序的语言。
ARM处理器广泛应用于嵌入式系统和移动设备等领域。
ARM汇编指令与x86汇编指令有所不同,它基于RISC(精简指令集计算机)架构。
下面是一些基本的ARM汇编指令:1. 数据传输指令:用于在寄存器之间传输数据。
例如:- mov:将数据从一个寄存器传输到另一个寄存器。
- ldr:将数据从内存传输到寄存器。
2. 算术指令:用于执行加法、减法、乘法和除法等操作。
例如:- add:加法操作。
- sub:减法操作。
- mull:乘法操作。
- div:除法操作。
3. 逻辑指令:用于执行逻辑操作,如与、或、非等。
例如:- and:与操作。
- or:或操作。
- xor:异或操作。
4. 移位指令:用于对数据进行左移、右移或无符号右移。
例如:- lsr:无符号右移。
- asr:带符号右移。
- ror:循环右移。
5. 比较指令:用于比较两个寄存器的值。
例如:- cmp:比较两个寄存器的值,若相等则返回0,否则返回1。
6. 跳转指令:用于改变程序的执行流程。
例如:- b:条件跳转。
- bl:无条件跳转。
- bx:带状态跳转。
7. 循环指令:用于实现循环操作。
例如:- loop:内部循环。
- ldp:外部循环。
8. 调用指令:用于实现函数调用。
例如:- blx:带状态调用。
- bx:不带状态调用。
9. 系统调用指令:用于实现与操作系统交互的功能。
例如:- swi:执行系统调用。
10. 存储器访问指令:用于访问内存数据。
例如:- str:将数据存储到内存。
- ldr:从内存中加载数据。
以上仅为ARM汇编指令的一部分,实际上,ARM汇编指令还有很多其他功能。
为了更好地理解和使用ARM汇编指令,可以参考相关的教程和手册,并进行实际操作。
ARM汇编学习笔记
这两天参加了一个编写操作系统的项目,因为要做很多底层的东西,而且这个操作系统是嵌入式的,所以开始学习ARM汇编,发现ARM汇编和一般PC平台上的汇编有很多不同,但主要还是关键字和伪码上的,其编程思想还是相同的。
现将一些学习感悟部分列出来,希望能给有问题的人一点帮助。
1、ARM汇编的格式:在ARM汇编里,有些字符是用来标记行号的,这些字符要求顶格写;有些伪码是需要成对出现的,例如ENTRY和END,就需要对齐出现,也就是说他们要么都顶格,要么都空相等的空,否则编译器将报错。
常量定义需要顶格书写,不然,编译器同样会报错。
2、字符串变量的值是一系列的字符,并且使用双引号作为分界符,如果要在字符串中使用双引号,则必须连续使用两个双引号。
3、在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同样的,当src变量代表一个数组时,需要将r0寄存器指向src 则需要这样赋值:LDR r0,=src 当格式是LDR r0,[r2],则第二个参数表示寄存器,我的理解是[]符号表示取内容,r2本身表示一个寄存器地址,取内容候将其存取r0这个寄存器中。
4、在语句:CMP r0,#numBHS stop书上意思是:如果r0寄存器中的值比num大的话,程序就跳转到stop标记的行。
但是,实际测试的时候,我发现如果r0和num相等也能跳转到stop 标记的行,也就是说只要r0小于num才不会跳转。
下面就两个具体的例子谈谈ARM汇编(这是我昨天好不容易看懂的,呵呵)。
第一个是使用跳转表解决分支转移问题的例程,源代码如下(保存的时候请将文件后缀名改为s):AREA JumpTest,CODE,READONLYCODE32num EQU 4ENTRYstartMOV r0, #4MOV r1, #3MOV r2, #2MOV r3, #0CMP r0, #numBHS stopADR r4, JumpTableCMP r0, #2MOVEQ r3, #0LDREQ pc, [r4,r3,LSL #2]CMP r0, #3MOVEQ r3, #1LDREQ pc, [r4,r3,LSL #2]CMP r0, #4MOVEQ r3, #2LDREQ pc, [r4,r3,LSL #2]CMP r0, #1MOVEQ r3, #3LDREQ pc, [r4,r3,LSL #2]DEFAULTMOVEQ r0, #0SWITCHENDstopMOV r0, #0x18LDR r1, =0x20026SWI 0x123456JumpTableDCD CASE1DCD CASE2DCD CASE3DCD CASE4DCD DEFAULTCASE1ADD r0, r1, r2B SWITCHENDCASE2SUB r0, r1, r2B SWITCHENDCASE3ORR r0, r1, r2B SWITCHENDCASE4AND r0, r1, r2B SWITCHENDEND程序其实很简单,可见我有多愚笨!还是简要介绍一下这段代码吧。
ARM中的汇编指令
ARM中的汇编指令BIC:ARM 指令,对某些位,清零。
先取反再相与。
asm(“BIC r2, r2,#0x1f”); ##对R2 的低5 位清零。
ORR:ARM 指令,逻辑或asm(“ORR r2, r2, #0x10”); ##R2 逻辑与0x10。
MRS:asm(“MRS r2, CPSR”); ##将CPSR 的值加载到R2 中。
MSR:asm(“MSR CPSR, r2”); ##将R2 的值加载到CPSR 中。
asm(“ SWI 0x0”); ##跳转到软件中断函数,并转换为SVC 模式。
LDR:{条件}目的寄存器存储器寄存器。
将存储地址所指的4 个字节数据传送到寄存器,其中寻址方式会有很多种。
asm(“ldr r0,=0xddeeaabb”); ##在这里ldr 是一个伪指令,相当于move 指令。
asm(“ldr r0, [r1]”);##将存储器地址为r1 的一个字的数据加载到r0 中。
MRC 与MCR:在处理器寄存器与协处理器寄存器之间交换数据。
MRC {cond} coproc, opcode1, Rd, CRn, CRm {,opcode2}asm(“mrc p15,0,r0,c1,c1,0”); ##在CRn, CRm 均为c1, opcode 均为0 时,表示SCR(Secure Configuration Register),表示将c1 的值赋值给r0.asm(“mcr p15,0,r0,c1,c1,0”); ##将r0 的值赋值给c1.asm(“mcr p15,0,r0,c12,c0,0”);##将r0 的值赋值给c12,此时c12 表示VBAR,Vector Base Address Register,存放异常时的入口地址。
SMC:(Secure Monitor Call). asm(“SMC 0x0”);##将ARM core 切换到Trust Zone 模式。
ARM指令集详解--汇编
ARM指令集详解--汇编1. 汇编1.1. 通⽤通⽤寄存器37个寄存器,31个通⽤寄存器,6个状态寄存器,R13指针sp,R14返回指针,R15为PC指针, cpsr_c代表的是这32位中的低8位,也就是控制位CPSR有4个8位区域:标志域(F)、状态域(S)、扩展域(X)、控制域(C)MSR - Load specified fields of the CPSR or SPSR with an immediate constant, orfrom the contents of a general-purpose register. Syntax: MSR{cond} _, #immed_8rMSR{cond} _, Rm where: cond is an optional condition code. is either CPSR orSPSR. specifies the field or fields to be moved. can be one or more of: ccontrol field mask byte (PSR[7:0]) x extension field mask byte (PSR[15:8]) sstatus field mask byte (PSR[23:16) f flags field mask byte (PSR[31:24]).immed_8r is an expression evaluating to a numeric constant. The constant mustcorrespond to an 8-bit pattern rotated by an even number of bits within a32-bit word. Rm is the source register.C 控制域屏蔽字节(psr[7:0])X 扩展域屏蔽字节(psr[15:8])S 状态域屏蔽字节(psr[23:16])F 标志域屏蔽字节(psr[31:24])CPSR寄存器FIQ和IRQ的区别?MODE(以下为⼆进制)10000⽤户模式PC,CPSR,R0~R1410001FIQ PC,CPSR,SPSR_fiq,R14_fiq~R8_fiq,R7~R010010IRQ PC,CPSR,SPSR_irq,R14_irq~R13_irq,R12~R010011管理模式(svc)PC,CPSR,SPSR_svc,R14_svc~R13_svc,R12~R010111终⽌模式PC,CPSR,SPSR_abt,R14_abt~R13_abt,R12~R011011未定义PC,CPSR,SPSR_und,R14_und~R13_und,R2~R011111系统模式(sys)PC,CPSR,R14 ~R01.2. 指令格式1) 基本格式<opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>}其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,⽽{<cond>}为指令执⾏条件,是可选的,如果不写则使⽤默认条件AL(⽆条件执⾏)。
读书笔记----ARM汇编编程
读书笔记----ARM汇编编程1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59/**************************************************************** ***************** ****************************************文件头************************************ ** 《ARM体系结构与编程》读书笔记** ** 成功的步伐在您不懈的努力中加快!** **源自: METAL MAX, CUIT **起始日期:01/25/08 **当前版本:Version0.08.0125 ** **备注: 1.这是2008春节回家期间阅读《ARM体系结构与编程》这部作品的时候记载下来的。
小小的东西凝聚了我不少的心血(汗...书又不是我写的,我只是负责抄写了一遍, 有些内容给省略了...),让我体会到要真真正正做个像样的东西很不容易,但是,相信点点滴滴的积累,正所谓是:不积跬步,无以至千里;不积小流,无以成江海!2.由于刚接触ARM处理器,并不熟悉其中的一些细节问题,所有在做笔记的时候对有西理解不是很透彻,甚至会又错误。
有些地方加入了自己的一些东西(主要是一些的理解和自己做的图表)。
3.由于本人水平太菜的缘故,排版不工整,存在错别字等问题,见谅!更希望有心人忙修改和完善,众志成城!4.本文档您可以任意的修改(严禁恶搞!^_^)和传播,引用文档的部分和全部内容请本文件的文件头,如果您是有心人修改或完善了其中的部分内容,请一定保留您的改记录(修改日期、版本、修改人以及修改点等),并将其归入文件头中。
ARM常用汇编指令
ARM常⽤汇编指令ARM 汇编程序的框架结构.section .data<初始化的数据>.section.bss<未初始化的数据>.section .text.global _start_start:<汇编代码>注意:⼀般是将上⾯结构进⾏简化.text.global _start_start:<汇编代码>寄存器操作指令:算术和逻辑指令:MOV :⽤于将⼀个寄存器或被移位寄存器或⼀个⽴即数移动到⽬的寄存器MOV r1 ,#8 (注意:#+数,表⽰⼀个⼗进制数,#+0b数,表⽰⼀个⼆进制数,#+0x数,表⽰⼀个⼗六进制数)MVN :对源操作数取反再赋值给⽬的寄存器MOV R1,#8SUB : 将⼀个数减去另外⼀个数再存放如寄存器SUB R1,#8,#6(8-6)ADD:将⼀个数加上另外⼀个数后将其存放如寄存器中ADD R1,R2,R3AND :逻辑与AND R1,R2,#0BIC:位清除BIC R1,R2,#0B1101将R2中所与#b1101中1所对应的位清零后的结果保存在R1中⽐较指令:CMP:顾名思义,⽤于⽐较两个数的⼤⼩,⽐较的结果不过会放在哪个通⽤寄存器中⽽是改在程序状态寄存器中的⼀个标志状态位CMP R1,#0B111010TST:测试位,将两个数按位与TST R1,R2分枝指令:B:条件跳转指令B [条件] 标号(注意:中括号在编写程序时不需要写出)BL :带连接的返回(类似于C语⾔中的⼦函数调⽤,调⽤⼦函数后返回主函数)移位指令:LSL:算术左移位MOV R1,R1,LSL#2(将R1中的数据左移两位存⼊R1)ROR:循环右移MOV R1,R1,#ROR 2(将R1中的数据循环右移后存⼊R1中)程序状态字访问指令:上⾯所学指令都不能对计算机中的程序状态字中的指令进⾏访问和读写,所以需要专⽤计算机指令来将程序状态字中的数据读写到通⽤寄存器中,在进⾏修改后写⼊MRS :将程序状态字中的数据搬出来MRS R0,CPRSMSR:将数据搬回程序状态字中MSR CPRS, R0存储器操作指令:LDR :将内存中的值导出到通⽤寄存器中LDR R0 ,#0XFF ‘STR:将同⽤寄存器中的数据写回到内存中STR R0 ,#0XFF伪指令:定义类伪指令:(1:编译时起作⽤2:起作⽤但是转化为其他机器指令).global 表明⼀个全局的符号 (注意GNU伪指令的特点在前⾯加上⼀个“.”).data 定义⼀个数据段.ascii 定义字符串的数据.byte 定义⼀个字节的数据.word 定义⼀个字的数据.data.equ (类似于C语⾔中定义宏).align ⽤于字节对齐操作类伪指令:nop:空操作指令 \具体实现:mov r0 ,r0ldr:⽤于将⼀个⼤于⼋位的数据装⼊寄存器注意:ldr r0 ,=0x1ff这⾥后⾯是⽤的等号这⾥和其他地⽅有些不⼀样协处理指令:(最重要是就是CP15)作⽤:系统控制mcr:mrc:mrc p15,0, r0 ,c0,c0,0注意:蓝⾊部分是由芯⽚⼿册的cp15寄存器访问列表给出的以访问不同寄存器。
ARM汇编指令对比记忆(整理)
ARM汇编指令对比记忆(整理)1.RichardBlum,ProfeionalAemblyLanguage一.Linu某汇编行结构Linu某ARM汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要在一行的开始。
【例1】定义一个\的函数,返回两个参数的和。
.ection.te某t,“某”1.LDRLDRR0,=0某3FF5000;伪指令,把0某3FF5000这个地址送给R0LDRR0,0某FF;把立即数0某ff送给R0LDRR0,=&FF;&相当于0某BICR0,R0,#11;.#表示立即数,%表示二进制LDRR1,=0某3ff5000;伪指令R1=0某3FF5000LDRR1,0某3ff5000;存储器访问指令R1=[0某3ff5000]2.adr与ldr比较adrr0,InitSytem;ldrr1,=InitSytem;伪指令adrr0,InitSytem编译时汇编成:ubr0,PC,#offettoInitSytemLDRr1,=InitSytem,这种方式读取的地址值在连接时已经被固定了,这种代码不是位置无关的。
遇到LDR伪指令时,汇编编译器将该地址值保存到一个缓冲区(literalpool)中,然后将该LDR伪指令处理成一条基于PC到该数据缓冲区单元的LDR指令,从而将该地址值读取到寄存器总,这时,要求该数据缓冲区到PC的距离小于4KB。
如果该目标地址值为一个外部地址值或者不在本数据段内,则汇编译器在目标文件中插入一个地址重定位伪操作,当连接器进行连接时生成该地址值。
LDRr1,=InitSytem汇编成:LDRR1,[PC,#offettoLitpool1]------------------------------------------------------adr用来加载地址,例如adrr0,var1ldr用来加载地址处的内容,例如ldrr0,var1上面的这种语法只能从.te某t段中加载但ldrr0,=var1可从任意段中加载地址ldr有伪指令和非伪指令,伪指令后面的立即数前加=ADR在编译时会被替换成一条add或者ub指令,如果替换不了则报错。
ARM-汇编指令集(总结)
ARM-汇编指令集(总结)ARM汇编指令集指令、伪指令(汇编)指令:是机器码的助记符,经过汇编器编译后,由CPU执⾏。
(汇编)伪指令:⽤来指导指令执⾏,是汇编器的产物,最终不会⽣成机器码。
有两种不同风格的ARM指令1).ARM官⽅的ARM汇编风格:指令⼀般⽤⼤写,Windows中的IDE开发环境。
2).GNU风格的ARM汇编:指令⼀般⽤⼩写。
ARM汇编的特点1. LDR/STR架构1).ARM采⽤RISC架构,CPU本⾝不能直接读取内存,⽽需要先将内存中内容加载⼊CPU中通⽤寄存器中才能被CPU处理。
2).ldr(load register)指令将内存内容加载⼊通⽤寄存器。
3).str(store register)指令将寄存器内容存⼊内存空间中。
4).ldr/str组合⽤来实现 ARM CPU和内存数据交换。
2. ⾄此8种寻址⽅式1).寄存器寻址mov r1, r2。
2).⽴即(⽴即数)寻址 mov r0, #0xFF00。
3).寄存器移位寻址 mov r0, r1, lsl #3。
4).寄存器间接寻址 ldr r1, [r2] 表⽰内存,内存地址存在r2这个寄存器中,把内存地址⾥的值给r1。
5).基址变址寻址ldr r1, [r2, #4]内存地址在r2+4⾥⾯。
6).多寄存器寻址 ldmia r1!, {r2-r7, r12}⼀次访问多个寄存器。
7).堆栈寻址 stmfd sp!, {r2-r7, lr}。
8).相对寻址 beq flag。
3. 指令后缀同⼀指令经常附带不同后缀,变成不同的指令。
经常使⽤的后缀有:B(byte)功能不变,操作长度变为8位H(half word)功能不变,长度变为16位S(signed)功能不变,操作数变为有符号如 ldr ldrb ldrh ldrsb ldrshS(S标志)功能不变,影响CPSR标志位如 mov和movs movs r0, #04. 条件执⾏后缀条件后缀是否成⽴取决于当前代码的前⾯的代码。
(转)ARM汇编学习笔记——MRS和MSR指令
(转)ARM汇编学习笔记——MRS和MSR指令MRS,状态寄存器传送⾄通⽤寄存器类指令功能:将状态寄存器的内容传送⾄通⽤寄存器。
格式:MRS{<条件码>}Rd,CPSR}SPSR其中:Rd ⽬标寄存器,Rd不允许R15。
R=0 将CPSR中的内容传送⽬的寄存器。
R=1 将SPSR中的内容传送⾄⽬的寄存器。
注释:MRS与MSR配合使⽤,作为更新PSR的读-修改-写序列的⼀部分。
例如:改变处理器或清除标志Q。
注意:当处理器在⽤户模式或系统模式下,⼀定不能试图访问SPSR这条指令不影响条件码标志。
例:MRS R0,CRSR ;将CPSR中的内容传送⾄R0MRS R3,SPSR ;将SPSR中的内容传送⾄R3MSR,通⽤寄存器传送⾄状态寄存器传送指令功能:将通⽤寄存器的内容传送⾄状态寄存器。
格式:MSR{<条件码>CPSR_f|SPSR_f,<#immed_8r>MSR{<条件码>CPSR_<field>|SPSR_<field>,Rm其中:<field>字段可以是以下之⼀或多种:(位从右到左)C:控制域屏蔽字段(PSR中的第0位到第7位);X:扩展域屏蔽字段(PSR中的第8位到第15位);S:状态域屏蔽字段(PSR中的第16位到第32位);F:标志域屏蔽字段(PSR中的第24位到第31位)。
immed_8r 值数字常量的表达式。
常量必须对应8位位图。
该位图在32位字中循环移位偶数数位。
Rm 源寄存器。
注释:同前⼀条指令(MRS)。
例1:设置N、Z、C、V标志。
MSR CPSR_f,#&f0000000 ;仅⾼位有效,其他必须为0例2:仅置位C标志,保留N、Z、V标志。
MRS R0,CPSR ;将CPSR中的内容传送⾄R0ORR R0,R0,#&1f ;置位R0的第29位MSR CPSR_c,R0 ;再将R0中的内容传送⾄CPSR例⼦:设置cpu⼯作在超级保护模式(SVC32)@set the cpu to SVC32 modemrs r0,cpsr@把CPSR内容存⼊r0.使⽤了mrs指令:专⽤寄存器到通过寄存器的存取.@CPSR当前程序状态寄存器格式如下:@ 31 30 29 28 27 26 25 24 ~ ~ ~ 8 7 6 5 4 3 2 1 0@ ___ ___ ___ ___ ___ ___ ___ ___ _ _ _ _ ___ ___ ___ ____ ____ ____ ____ ____@| N | Z | C | V | * | * | * | * | * * * | I | F | T | M4 | M3 | M2 | M1 | M0 |@bic r0,r0,#0x1f@bic指令(bit clear): r0:= r0 and (not op2).上边的指令⽬的是把bit0~bit4清零.orr r0,r0,#0xd3@r0:= r0 or 0xd3 . 以上三条指令执⾏后r0值为:**** **** **** **** **** ***** 11*1 0011msr cpsr,r0@把r0存于cpsr.注意:msr指令是专⽤的通⽤寄存器到特殊功能寄存器的指令与mrs对应说明:通过上边的指令可以看到,实现了两个功能.1,disable 外部中断(IRQ)与快速中断(FIR).2,把系统设为SVC32状态(超级保护)即M4~M1=10011。
常用ARM指令及汇编【一】
常用ARM指令及汇编【一】常用ARM指令及汇编包括1、ARM处理器寻址方式2、指令集介绍3、伪指令4、ARM汇编程序设计5、C与汇编混合编程ARM处理器寻址方式1、寄存器寻址:操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值操作MOV R1, R2 ;R2->R1SUB R0, R1,R2 ;R1-R2 -> R02、立即寻址:立即寻址指令中的操作码字段后面的地址码部分就是操作数本身,也就是说,数据就包含在指令当中,取出指令就取出了可以立即使用的操作数SUBS R0,R0,#1 ;R0-1 -> R0MOV R0,#0xff00 ;0xff00 -> R0注:立即数要以"#"为前缀,表示16进制数值时以"0x"表示3、寄存器偏移寻址:是ARM指令集特有的寻址方式,当第2操作数是寄存器偏移方式时,第2个寄存器操作数在与第1个操作数结合之前选择进行移位操作MOV R0,R2,LSL #3 ;R2的值左移3位,结果存入R0,即R0 = R2 * 8ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相与操作,结果放入R1寄存器偏移寻址可采用的移位操作如下(1)、LSL(Logical Shift Left)逻辑左移,寄存器中字的低端空出补0(2)、LSR(Logical Shift Right)逻辑右移,寄存器中字的高端空出补0(3)、ASR(Arthmetic Shift Right)算术右移,移位中保持符号位不变,即如果源操作数为正数,字高端空出补0,否则补1(4)、ROR(Rotate Right)循环右移,由字的低端移出的位填入高端空出的位(5)、RRX(Rotate Right eXtended by 1 place),操作数右移一位,左侧空位由CPSR的C填充4、寄存器间接寻址:寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针LDR R1,[R2] ;将R2中的数值作为地址,取出此地址中的数据保存在R1中SWP R1,R1,[R2] ;将R2中的数值作为地址,取出此地址中的数值与R1中的值交换5、基址寻址:将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器访问等。
常用ARM汇编指令
常⽤ARM汇编指令1、相对跳转指令:b, bl 区别在于bl指令除了跳转之外,还将返回地址(bl的下⼀条指令的地址)保存在lr寄存器中。
可跳转范围是当前指令的前后32MB。
2、数据发送指令mov,地址读取伪指令ldr mov指令: mov r1, r2 //r1=r2,把⼀个寄存器的值赋给另⼀个寄存器 mov r1,#358 //r1=4096, 把⼀个常数赋给寄存器 ldr伪指令:(第⼆个参数为“=”时表⽰伪指令,否则表⽰内存访问指令) ldr r1,=358 //把⼀个常数赋给寄存器3、内存访问指令:ldr、str、ldm、stm ldr指令从内存中读取数据到寄存器: ldr r1, [r2, #4] //将地址为r2+4的内存单元数据读取到r1中 ldr r1, [r2] //将地址r2内存中数据读取到r1中 ldr r1, [r2], #4 //将地址为r2的内存中的数据读取到r1中,然后r2=r2+4 str指令把寄存器的值存储到内存中: str r1, [r2, #4] //将r1的数据保存到地址为r2+4的内存单元中 str r1, [r2] //将r1的数据保存到地址r2的内存单元中 str r1, [r2], #4 //将r1的数据保存到r2的内存单元中,然后r2= r2+44、加减指令:add、sub add r1,r2,#1 //表⽰r1 = r2+1 sub r1,r2,#1 //表⽰r1 = r2-15、程序状态访问寄存器:msr、mrs ARM 有⼀个程序状态寄存器(cpsr),⽤来控制处理器的⼯作模式、设置中断的总开关 msr cpsr, r0 //复制r0到cpsr mrs r0,cpsr //复制cpsr到r06、其他汇编指令 .extern main .text .global _start _start: ".extern"定义⼀个外部符号(可以是变量也可以是函数) “.text”表⽰羡慕的语句都属于代码段 “.global”将本⽂件中的某个程序标号定义为全局的,如上表⽰将_start定义为全局函数。
arm汇编学习笔记
arm汇编学习笔记
1.LDR和MOV的不同
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S 指令来完成,也就是ldr/str指令。
比如想把数据从内存中某处读取到寄存器中,只能使用ldr
比如: ldr r0, 0x12345678
就是把0x12345678这个地址中的值存放到r0中。
而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。
x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。
2.汇编的位操作技巧
ldr r0,=rGPBCON;//设置GPB5~GPB8输出端口
ldr r1,=0x55<<10;
3.B与BL的不同
B或BL指令引起处理器转移到“子程序名”处开始执行。
两者的不同之处在于BL指令在转移到子
程序执行之前,将其下一条指令的地址拷贝到R14(LR,链接寄存器)。
由于BL指令保存了下条指令的地
址,因此使用指令“MOV PC ,LR”即可实现子程序的返回。
而B 指令则无法实现子程序的返回,只能实
现单纯的跳转。
4.IMPORT
伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源
文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中。
即后面的标号来自外部文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM assembler guide DUI0068是一个RISC指令结构,因为有一个加载存储结构。
只有load和store可以读取内存。
ARM的处理器模式可以全部大写或小写,不能混标志符表示一个地址常量的定义格式:1230x1C2_1001ARM编译、链接后最终生成一个ELF格式(Executable and Linking Format)的可执行文件(后缀.axf)ELF中是分section部分的,一个ELF section在汇编中定义一个section使用AREA指令。
ENTRY指令指示汇编代码第一条要执行的指令。
start是一个标识符,代表一个地址。
结束的方式是产生一个软件中断,把控制权交给调试器。
END指令指示汇编的结束使用cmd进行调试:Microsoft Windows XP [版本5.1.2600](C) 版权所有1985-2001 Microsoft Corp.C:\Documents and Settings\Administrator>cd D:\Program Files\ARM\ADSv1_2\BinC:\Documents and Settings\Administrator>D;'D' 不是内部或外部命令,也不是可运行的程序或批处理文件。
C:\Documents and Settings\Administrator>D:D:\Program Files\ARM\ADSv1_2\Bin>armsd E:\dsparm\pxa270\project\armex\__image.ax fARM Source-level Debugger, ADS1.2 [Build 805]Software supplied by: Team-EFASoftware supplied by: Team-EFAARM7TDMI, BIU, Little endian, Semihosting, Debug Comms Channel, 4GB, Mapfile, Timer, Profiler, Tube, Millisecond [20000 cycles_per_millisecond], Pagetables,IntCtrl, Tracer, RDI CodesequencesObject program file E:\dsparm\pxa270\project\armex\__image.axfarmsd: helphelp [<keyword>]Display help information on one of the following commands:Registers Fpregisters Coproc CRegisters CREGDefCWrite Step Istep Examine ListQuit Obey Go Break Unbreak Watch UNWatch Print CONtext OUtIN WHere BAcktrace Variable SYmbols LSym LEt Arguments LAnguage HelpType CAll WHIle ALias LOadLOG RELoad REAdsyms FInd PUtfile GEtfile LOCalvar COMment PAuse LOADConfig SElectconfig LISTConfig LOADAgent PROfon PROFOFf PROFClear PROFWrite CCin CCOut PROCessor SYS SETregister TRacetrigger TRACEExtent TRACEWrite TRACEStart TRACESTOp TRACEFlushHELP * gives helps on all available commands. To print the help use the LOGcommand to record the help output into a file & print the file.If the first character of a line is the '!' character the rest of the commandline is executed by a call to system(). If the first character of a line isthe '|' character the rest of the line is a treated as a comment.Note that this help is not intended to replace the printed manual whichexplains ARMSD in much greater detail.armsd: LOG** Error: No log filearmsd: stepStep completed at PC = 0x000080040x00008004: 0xe3a01003 .... : mov r1,#3armsd: Registerr0 = 0x0000000a r1 = 0x00000000 r2 = 0x00000000 r3 = 0x00000000r4 = 0x00000000 r5 = 0x00000000 r6 = 0x00000000 r7 = 0x00000000r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 r11 = 0x00000000r12 = 0x00000000 r13 = 0x00000000 r14 = 0x00000000pc = 0x00008004 cpsr = %nzcvqIFt_SVC spsr = %nzcvqift_Reserved_00armsd: stepStep completed at PC = 0x000080080x00008008: 0xe0800001 .... : add r0,r0,r1armsd: Registerr0 = 0x0000000a r1 = 0x00000003r2 = 0x00000000 r3 = 0x00000000r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 r11 = 0x00000000 r12 = 0x00000000 r13 = 0x00000000 r14 = 0x00000000pc = 0x00008008 cpsr = %nzcvqIFt_SVC spsr = %nzcvqift_Reserved_00 armsd: stepStep completed at PC = 0x0000800c0x0000800c: 0xe3a00018 .... : mov r0,#0x18armsd: LOG** Error: No log filearmsd: Registerr0 = 0x0000000d r1 = 0x00000003 r2 = 0x00000000 r3 = 0x00000000 r4 = 0x00000000 r5 = 0x00000000 r6 = 0x00000000 r7 = 0x00000000 r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 r11 = 0x00000000 r12 = 0x00000000 r13 = 0x00000000 r14 = 0x00000000pc = 0x0000800c cpsr = %nzcvqIFt_SVC spsr = %nzcvqift_Reserved_00 armsd: stepStep completed at PC = 0x000080100x00008010: 0xe59f1000 .... : ldr r1,0x00008018 ; = #0x00020026 armsd: Registerr0 = 0x00000018 r1 = 0x00000003 r2 = 0x00000000 r3 = 0x00000000 r4 = 0x00000000 r5 = 0x00000000 r6 = 0x00000000 r7 = 0x00000000 r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 r11 = 0x00000000 r12 = 0x00000000 r13 = 0x00000000 r14 = 0x00000000pc = 0x00008010 cpsr = %nzcvqIFt_SVC spsr = %nzcvqift_Reserved_00 armsd: stepStep completed at PC = 0x000080140x00008014: 0xef123456 V4.. : swi 0x123456armsd: Registerr0 = 0x00000018 r1 = 0x00020026 r2 = 0x00000000 r3 = 0x00000000 r4 = 0x00000000 r5 = 0x00000000 r6 = 0x00000000 r7 = 0x00000000 r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 r11 = 0x00000000 r12 = 0x00000000 r13 = 0x00000000 r14 = 0x00000000pc = 0x00008014 cpsr = %nzcvqIFt_SVC spsr = %nzcvqift_Reserved_00 armsd: stepProgram terminated normally at PC = 0x000080140x00008014: 0xef123456 V4.. : swi 0x123456armsd: Registerr0 = 0x00000018 r1 = 0x00020026 r2 = 0x00000000 r3 = 0x00000000 r4 = 0x00000000 r5 = 0x00000000 r6 = 0x00000000 r7 = 0x00000000 r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 r11 = 0x00000000 r12 = 0x00000000 r13 = 0x00000000 r14 = 0x00000000pc = 0x00008014 cpsr = %nzcvqIFt_SVC spsr = %nzcvqift_Reserved_00 armsd: quitQuittingD:\Program Files\ARM\ADSv1_2\Bin>使用armsd调试有点像微机原理上调试汇编,爽!MOV叫指令,常数范围是0-255LDR叫伪指令都是将常数放到Reg中#和FIELD指令是一样的符号在汇编程序中代表一个地址,可以用在指令中,汇编程序经过汇编器的处理之后,所有的符号都被替换成它所代表的地址值。