ARM汇编指令集学习笔记

合集下载

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汇编语⾔指令总结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指令集及汇编

常用ARM指令集及汇编

常⽤ARM指令集及汇编ARM7TDMI(-S)指令集及汇编ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单,ARM7TDMI(-S)具有 32 位 ARM 指令集和16 位 Thumb 指令集,ARM 指令集效率⾼,但是代码密度低,⽽ Thumb 指令集具有更好的代码密度,却仍然保持 ARM 的⼤多数性能上的优势,它是 ARM 指令集的⼦集。

所有 ARM 指令都是可以有条件执⾏的,⽽ Thumb 指令仅有⼀条指令具备条件执⾏功能。

ARM 程序和Thumb 程序可相互调⽤,相互之间的状态切换开销⼏乎为零。

ARM 处理器寻址⽅式寻址⽅式是根据指令中给出的地址码字段来实现寻找真实操作数地址的⽅式,ARM 处理器有 9 种基本寻址⽅式。

寄存器寻址操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执⾏时直接取出寄存器值操作。

寄存器寻址指令举例如下:MOV R1,R2;R2 -> R1SUB R0,R1,R2;R1 - R2 -> R0⽴即寻址⽴即寻址指令中的操作码字段后⾯的地址码部分就是操作数本⾝,也就是说,数据就包含在指令当中,取出指令也就取出了可以⽴即使⽤的操作数(⽴即数)。

⽴即寻址指令举例如下:SUBS R0,R0,#1 ;R0 – 1 -> R0MOV R0,#0xff00 ;0xff00 -> R0 ⽴即数要以“#”为前缀,表⽰ 16 进制数值时以“0x”表⽰。

寄存器偏移寻址寄存器偏移寻址是ARM指令集特有的寻址⽅式,当第2操作数是寄存器偏移⽅式时,第 2 个寄存器操作数在与第 1 个操作数结合之前,选择进⾏移位操作。

寄存器偏移寻址⽅式指令举例如下:MOV R0,R2,LSL #3 ;R2 的值左移 3 位,结果放⼊ R0,即 R0 = R2 * 8ANDS R1,R1,R2,LSL R3 ;R2 的值左移 R3 位,然后和 R1 相与操作,结果放⼊ R1 可采⽤的移位操作如下:LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补 0LSR:逻辑右移(Logical Shift Right),寄存器中字的⾼端空出的位补 0ASR:算术右移(Arithmetic Shift Right),移位过程中保持符号位不变,即如果源操作数为正数,则字的⾼端空出的位补 0,否则补 1 ROR:循环右移(Rotate Right),由字的低端移出的位填⼊字的⾼端空出的位 RRX:带扩展的循环右移(Rotate Right eXtended by1place),操作数右移⼀位,⾼端空出的位⽤原 C 标志值填充。

ARM笔记

ARM笔记

ARM处理器结构ARM处理器模式处理器模式用户user FIQ fiq IRQ irq 管理svc 终止abt 未定义und 系统sys寄存器组织ARM处理器共有37个寄存器31个通用寄存器,包括程序计数6个状态寄存器,都是32位,但寄存器R13通常用作指针堆栈,寄存器R14用作子程序链接寄存CPSR在所有处理器模式下都可以访问当前程序状态寄存器CPSR。

CPSR包含条件码标志、中断禁止位31302928765NZ C VDNM(RAZ)I F T条件码标志N 本位设置成当前指令运算结果的bit[31]的值。

当两个表示的有符号整数运算时,n=1表示运算Z z=1表示运算的结果为零;z=0表示运算的结果不为零。

对于CMP 指令,Z=1表示进行比较的两C在加法指令中(包括比较指令CMN ),当结果产生了进位,则C=1,表示无符号运算发生溢出(ov 在减法指令中(包括比较指令CMP ),当运算中发生借位,则C=0,表示无符号运算数发生进对于包含移位操作的非加减运算指令,C中包含最后一次溢出的位的数值对于其他非加减运算指令,C 位的值通常不受影响V 对于加减运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢控制位I置1则禁止IRQ中断F 置1则禁止FIQ中断模式位CPSR(当前程序状态寄存器)在任何处理器模式下被访问。

它包含了条件标志位、中断禁止位、当前处理器一个专用的物理状态寄存器,称为SPSR (备份程序状态寄存器)。

当特定的异常中断发生时,这个寄存器SPSR 来恢复CPSR 。

由于用户模式和系统模式不是异常中断模式,所以他没有SPSR 。

当用户在用户模式T T=0表示执行ARM 指令T=1表示执行Thumb 指令R10 ------ R10 ------ R10 R10_fiq sl R11 ------ R11 ------ R11 R11_fiq fp R12 ------ R12 ------ R12 R12_fiq ip R13 R13_svc R13_irq R13_fiq sp R14 R14_svc R14_irq R14_fiq lr .-------------R15/PC-------------PC R4 ------- R4 ------- R4 ------- R4 v1R5 ------- R5 ------- R5 ------- R5 v2R6 ------- R6 ------- R6 ------- R6 v3R7 ------- R7 ------- R7 ------- R7 v4R8 ------- R8 ------- R8 R8_fiq v5R9 ------- R9 ------- R9 R9_fiq v6User 模式 SVC 模式 IRQ 模式 FIQ 模式 APCS R0 ------- R0 ------- R0 ------- R0 a1R1 ------- R1 ------- R1 ------- R1 a2R2 ------- R2 ------- R2 ------- R2 a3R3 ------- R3 ------- R3 ------- R3 a432位ALU(是算术逻辑单元,是能实现多组算术运算和逻辑运算的组合逻辑电路)31个32位通用寄存器6位状态寄存器32*8位乘法器32*32位桶形移位寄存器指令译码及控制逻辑,指令流水线和数据/地址寄存器组成M[4:0]模式可访问的寄存器ob10000 user 0b10001 FIQ 0b10010 IRQ 0B10011 管理0b10111中止0b11011未定义0b11111系统Thumb状态的寄存器集Thumb状态寄存器与A系统和用户FIQ 管理中止IRQ 未定义R0R0R0R0R0R0R0R1R1R1R1R1R1R1R2R2R2R2R2R2R2R3R3R3R3R3R3R3R4R4R4R4R4R4R4R5R5R5R5R5R5R5R6R6R6R6R6R6R6R7R7R7R7R7R7R7SP SP_fiq*SP_svc*SP_abt*SP_irq*SP_und*LR LR_fiq*LR_svc*LR_abt*LR_irq*LR_und*PCPC PC PC PC PCSP LR PC CPSR SPSRARM异常异常向量表异常类型模式复位管理0x0000 00000xFFFF 0000未定义指令未定义0x0000 00040xFFFF 0004软件中断(SWI)管理0x0000 00080xFFFF 0008预取中止(取指令存储器中止)中止0x0000 000C 0xFFFF 000C 数据中止(数据访问存储器中止)中止0x0000 00100xFFFF 0010IRQ(中断)IRQ 0x0000 00180xFFFF 0018FIQ(快速中断)FIQ 0x0000 001C 0xFFFF 001C 当异常出现时,异常模式分组的R14和SPSR用于保存状态。

arm汇编指令笔记.

arm汇编指令笔记.

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指令是一样的符号在汇编程序中代表一个地址,可以用在指令中,汇编程序经过汇编器的处理之后,所有的符号都被替换成它所代表的地址值。

3.ARM汇编指令集

3.ARM汇编指令集
3--寄存器移位
(2)算术指令: ADD ADC SUB SBC RSB RSC
逻辑指令: AND ORR EOR BIC
比较指令: CMP CMN TST TEQ
数据搬移: MOV MVN
(3)加法指令 ADD R1,R2,R3 @ R1=R2+R3
64位乘法: MULL R0, R1, R2, R3 @{R1:R0}=R2*R3
【6】分支指令(偏移,跳转)
(1)指令格式
B{<cond>} label
BL{<cond>} subroutine_label
(2) b -- 无返回的跳转 -- c语言的goto
【1】测试一:
(1)mov r0,#16
mov r0,r1,ASR #4
MUL r1,r2,#3
mvn r0,r0 @r0=~r0
add r0,r0,#1
RSB R0,R0,#0 @R0 = 0-R0
比如:(1)0x1122
(2)0x8000007F
01 0001 0010 0010
0000 0000 0000 0000 0000 | 0111 1111 10| 00
用伪指令:
ldr r1,#0x1122
数据传输指令 MOV R1,R2 @ R1=R2
取反传送指令 MVN R1,R2 @ R1= ~R2
【2】乘法指令
32位乘法: MUL R1,R2,R3 @R1=R2*R3
mov r3,r1,LSL #2 @r3=r1*4=4
【8】立即数
(1)立即数:就是满足一定规则的数。
这个数可以用一个8位的数循环右移0--30之间的偶数位形成。

ARM指令集学习总结(转载)

ARM指令集学习总结(转载)

ARM指令集学习总结(转载)2008-11-24 01:12:37ARM指令集比较简单,本文介绍ARM指令集中需要注意和不易理解的地方。

一、ARM指令集是32位的,程序的启动都是从ARM指令集开始,包括所有异常中断都是自动转化为ARM状态,并且所有的指令都可以是有条件执行的。

二、ARM指令集是Load/Store型的,只能通过Load/Store指令实现对系统存储器的访问,而其他的指令都是基于处理器内部的寄存器操作完成的,这和INTEL汇编是不同的,初学者很不易理解。

三、指令的后缀:"S" 可选后缀,若指定S,则根据指令执行的结果更新CPSR中的条件码。

很多初学着不知道怎么更新,若这条指令执行完以后,对AR M程序状态寄存器的条件码标志(N,Z,C,V)的影响。

"! " 表示在完成数据操作以后,将更新基址寄存器,并且不消耗额外的时间。

如:LDR R0, [R1, #4] 他相当于R0 <- mem32[R1+4]R1 = R1+4;"^" LDMFD R13!, (R0-R3, PC)^ //"^"表示一条特殊形式的指令。

(在从存储器中装入PC的同时,CPSR也得到恢复)。

四、#号后面加0x或&表示十六进制:#0xFF, #&FF#号后面加0b表示二进制。

#号后面加0d表示十进制。

*******************************************************************************五、立即数寻址每个立即数都是采用一个8位的常数循环右移偶数位间接得到。

初学者不易理解:一个32位的指令不可能全部用来保存32位的立即数,所以从指令的编码格式上分析,在指令编码中只分配了12位来存储立即数,其中4位用来保存右循环值,8位用来保存一个常数,所以并不是每一个32位的立即数都是合法的。

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基础课堂笔记

《这一段时间学习汇编》2012-9-18ARM7 100M-200M mp3ARM9 200M-400M 诺基亚,车载电视,点菜机,楼宇,工控ARM11 500M-600M 平板CORTEX:M系列: M3 60-100M 工控,单片机A系列: A8 500-1GHZ 娱乐,消费类电子R 军工,市场比较少。

寄存器组织:共37个寄存器,7种模式。

R0-R12:通用寄存器;R13(SP)栈指针寄存器,记录栈地址;R14:链接返回寄存器,保存程序的返回地址,如函数调用返回。

R15(pc):程序计数器,PC指向哪,CPU就到哪去执行,PC每次自动加4,指令集定长。

CPSR:状态寄存器 current process state riskM[0-4]:工作模式T:在ARM模式(32位)或者s(16位)模式,默认在ARM模式下。

F和I位:中断开关位。

:高4位:N,Z,C,V:N:体现输出正负;Z:输出为0则置位;C:进位/借位标志位;V:移位标志位cxsf 4个域,主要为c,f两个域。

C控制域,x扩展域,s状态域,f标志域两种模式切换数据保存在PCB中。

R13和R141.2.3大小端存储:1.2.4:处理器组成原理:又称为3级流水线1.预取: PC中的值保存预取中的值 pc的值应为加上3,无论是8级还是多少 pc中的值都是加上3即为预取中的值。

2.译码:3.执行:每个程序都要经过三级流水线开发环境ADS1.2:Codewarraoior 编辑环境(vim)Debug:调试版本Release:发布版本最后可执行文件在 DebugRel中的.axf格式与linux下的elf格式一样。

Elf:代码段,数据段,只读段。

(io段,bss段,data段)AXD中开始时file中load imame不能点,解决:打开Options中的第三项-选择ARMUL最后点OK_start:初始化内存,加载库,R:寄存器调试串口Window下的memory地址栏查看内存中的地址看反汇编右键第5项04 08 c 10汇编指令中加S即影响f标志位置位汇编执行完后影响cpsr中flag中相关标志位。

ARM学习笔记

ARM学习笔记

ARM学习笔记1、ARM的MOV指令与LDR/STR指令比较CISC处理器支持“存储器-寄存器”的操作,即允许将存储器的值加到寄存器或寄存器中的值加到存储器。

但是,由于ARM处理器采用load/store体系结构,所以只能由数据处理指令来处理寄存器中的值,而面向存储器的操作只是将存储器的值复制到寄存器或者将寄存器中的值复制到存储器。

ARM的MOV指令和LDR/STR指令都能完成数据传送操作,但是在实际应用中区别还是很大的。

ARM的MOV指令属于数据处理指令,只能完成寄存器间的数据传送或将立即数加载到寄存器的操作(注意,加载立即数受指令长度的限制),例如:MOV R0,R1MOV R0,#0X3F而LDR/STR属于数据传送指令,完成的是从存储器到寄存器的数据加载或从寄存器到存储器的数据存储的操作,即可以完成存储器到寄存器间的数据转移。

例如:LDR R0,[R1]STR R0,[R1]2、MRS、MSR指令(1)状态寄存器传送至通用寄存器类指令功能:将状态寄存器的内容传送至通用寄存器。

格式: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中的内容传送至R3(2)通用寄存器传送至状态寄存器传送指令功能:将通用寄存器的内容传送至状态寄存器。

格式:MSR{<条件码>CPSR_f|SPSR_f,<#ommed_8r>MSR{<条件码>CPSR_<field>|SPSR_<field>,Rm其中:<field>字段可以是以下之一或多种:C:控制域屏蔽字段(PSR中的第0位到第7位);X:扩展域屏蔽字段(PSR中的第8位到第15位);S:状态域屏蔽字段(PSR中的第16位到第32位);F:标志域屏蔽字段(PSR中的第24位到第31位)。

ARM指令集详解--汇编

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课程汇编笔记
C运行时库
1.初始化堆、栈
2.运行时库里的入口点(entry)是_start,执行libc_start_main()
3.在libc_start_main()里调用我们的main函数
4. i = main();
exit(i);
没有main函数的C程序:
优点,去掉了多余的C运行时库的代码,只保留了我们自己的代码,所以非常小。
__asm__
(
"loop: \n"
" mov r0, #1 \n"
" ... \n"
" BNE loop \n"
);
7.linux汇编中标号要有冒号,ADS汇编标号则不能有冒号
硬件自动加载程序的头16K,自动执行它。
这头16K的程序只要能把:1.内存SDRAM初始化好 2.把nandflash或sd卡上的全部程序(大于16k)拷贝到内存上。(自拷贝:把自身拷贝到内存上)
需要有一个自定义的链接脚本(link.lds)来编译。
反汇编命令:
arm-linux-objdump -dDSx app > app.lst
ADS汇编和linux中的汇编的区别:
1.汇编程序的开头不需要AREA定义代码段和数据段
2.不需要ENTRY,入口地址是在链接脚本link.lds中定义的
3.C语言中的函数名不需要IMPORT导入,linux汇编可以直接调用C中的函数名
跳转到内存去执行。

4.ADS汇编中导出一个标号给C代码去调用(例如EXPORT strcopy),现在要换成.global strcopy
5.汇编指令的格式是一样的,但是注释不再是";",要换成"@"

读书笔记----ARM汇编编程

读书笔记----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处理器模式(7种)ARM寄存器介绍(37个,31个通用寄存器,6个状态寄存器)任意的处理器模式下,可见的寄存器包括15个通用寄存器(R0到R14)、一个或两个状态寄存器和程序计数器(pc)。

通用寄存器分为3类:1、未备份寄存器:the unbanked registers,R0~R7;2、备份寄存器:the banked registers,R8~R14;对于R8~R12:每个寄存器对应两个不同的物理寄存器;对于R13~R14:每个寄存器对应六个不同的物理寄存器。

每一种异常模式都拥有自己的物理R13,应用程序初始化该R13,使其指向该异常模式专用的栈地址。

R14又被称为连接寄存器(Link Register,LR),有两种特殊作用:每一种处理器模式自己的物理R14存放着当前子程序的返回地址;当异常中断发生时,该异常模式特定的物理R14被设置成该异常模式将要返回的地址。

3、程序计数器PC,R15流水线机制,PC的值为当前指令地址值加8个字节。

PC指向当前指令的下两条指令的地址。

(注意:尽量避免使用STR/STM指令来保存R15的值,原因。

)程序状态寄存器:CPSR,当前程序状态寄存器。

每一种处理器异常中断模式下都有一个SPSR(备份程序状态寄存器),用于异常中断发生时存放当前状态寄存器的值。

CPSR的格式。

ARM体系的异常中断ARM体系中通常有三种方式控制程序的执行流程(1、PC 2、跳转3、中断)。

ARM异常中断种类。

(复位、未定义的指令、软件中断、指令预取中止(refresh abort)、数据访问中止(data abort)、外部中断请求(IRQ)、快速中断请求(FIQ))ARM对异常中断的响应过程。

(1、2、3、4)ARM对异常中断返回的过程。

(1、2)ARM存储系统该地址空间大小。

ARM存储器格式。

(两种)Big-endianLittle-endian非对齐的存储访问操作。

(1、非对齐的指令预取操作;2、非对齐的数据访问操作)指令预取和自修改代码。

arm汇编指令集汇编入门第一篇小白也能看懂

arm汇编指令集汇编入门第一篇小白也能看懂

arm汇编指令集汇编入门第一篇小白也能看懂如今,计算机科学与技术领域发展迅猛,其中包括一门被广泛应用的指令集架构—— ARM(Advanced RISC Machines)汇编指令集。

本文将从小白角度出发,向读者介绍ARM汇编指令集的基本概念和入门知识。

1. ARM汇编简介ARM汇编指令集是一种低级程序设计语言,用于在ARM微处理器上进行编程。

它不同于高级语言如C++或Java,具有较为底层的特性。

掌握ARM汇编指令集可以让开发者更深入地理解计算机内部运行原理,并能进行更加灵活和高效的编程。

2. ARM寄存器ARM汇编指令集使用一组寄存器来存储和处理数据。

其中,常用的寄存器有13个通用寄存器(R0-R12)、程序计数器(PC)、堆栈指针(SP)和链接寄存器(LR),另外还有一些特殊用途的寄存器。

这些寄存器提供了一种基于寄存器的计算模型,使得ARM汇编具有高效处理数据的能力。

3. 指令格式ARM汇编指令集的指令格式一般包括操作码和操作数。

操作码表示具体的操作,如加法、乘法等,而操作数则指定操作所需的寄存器和立即数等。

4. 数据处理指令ARM汇编指令集提供了一系列的数据处理指令,用于对寄存器中的数据进行处理。

这些指令包括基本的算术运算、逻辑运算以及移位操作等,可以实现各种数据处理需求。

5. 分支指令分支指令是ARM汇编指令集中常用的一类指令,用于根据条件进行跳转。

跳转指令可以在程序执行过程中改变程序执行的顺序,实现条件判断和循环等功能。

6. 存储器访问指令存储器访问指令用于在ARM汇编中对内存进行读写操作。

通过这些指令,可以将数据从寄存器中存储到内存中,或者将内存中的数据加载到寄存器中进行处理。

7. 输入输出指令输入输出指令用于实现与外部设备的交互。

例如,通过输入指令可以从键盘或其他输入设备中获取用户输入的数据,而通过输出指令可以将数据输出到显示器或其他输出设备中。

8. 常用例程ARM汇编指令集中有一些常用的例程,可以用于处理常见的编程任务。

ARM-汇编指令集(总结)

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汇编学习笔记

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
伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源
文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中。

即后面的标号来自外部文件。

ARM9学习笔记之——汇编

ARM9学习笔记之——汇编

ARM9学习笔记之——汇编
ARM 系列芯片与PC 系列(可能我说法不太准确)芯片在指令设计上就有本质的区别。

ARM 中每条指令是精简指令集要么是32 位,要么是16 位。

而PC 的指令是复杂指令集,一条指令可以由多个字节组成。

在写ARM 汇编程序时,发现ARM 的指令非常的灵活,同样一个功能可以使用多种方式实现。

给开发者更多DIY 的地方。

以下是一些小总结,如有不正确的地方欢迎指正。

1. 关于函数调用方法
在ARM 汇编中,函数调用非常灵活。

(1)BL 指令
blinitmem;调用mem....movpc,lr;返回BL 指令在编译时,是以当前指令地址为基准相对跳转。

由于指令中地址区域为16 位,其中1 位作前后标志,剩下
15 位作为跳转范围。

所以跳转地址范围为当前地址前后32MB 地址。

(2)LDR PC, = xmain
ldrlr,=endmain;保存绝对返回地址ldrpc,=xmain;绝对地址跳转endmainbendmain 当编译器在对LDR 宏进行编译时,xmain 作为绝对地址赋给PC。

(3)BX
ldrr0,=xmainbxr0 也是绝对地址跳转。

在跳转中,可以进行ARM 与thumb 指令集转换。

2.关于LDR 与ADR 宏
在做2.6.8 内存驱动实验时,我关注了initmemloop 前一个指令”adr r2, memdata”。

尝试着将它换成ldr 进行实验。

经过反汇编与寄存器跟踪,我看到它们的区别:
ldrr2,=memdata;r2=运行地址adrr2,memdata;r2=加载地址。

arm汇编指令学习

arm汇编指令学习

arm汇编指令学习str r1, [r0] ;将r1寄存器的值,传送到地址值为r0的(存储器)内mrs r0, cpsr ;读cpsr寄存器到r0bic r0, r0, #0x1 ;位清除 clear bit 1orr r0, r0, #0xd3 ;逻辑或msr cpsr,r0 ;写cpsr寄存器mrc p15, 0, r0, c1, c0, 4 ;可参见《ARM体系结构与编程》第五章 /*<4>提供附加信息,⽤于区别同⼀个编号的不同物理寄存器。

MRC指令将协处理器的寄存器中数值传送到ARM处理器的寄存器中。

MCR指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。

*/LDR R1,=COUNT ;是将COUNT这个变量的地址,也就是0x40003100放到R1中。

MOV PC, LR ;如果在⼦程序中LR没有改变,则等同于 RET ;程序在调⽤⼦程序时,会把 BL SUB_XXXXX 处的 ;下⼀条指令送⼊LR, 这样,当所调⽤的⼦程序没有改变LR的值时(注意这⾥我说说的是在整个⼦程序中LR没有被改变),返回⽗程序时,你就可以使⽤bne label ;不等跳转strb r0, [r1] ;从源寄存器中将⼀个8位的字节数据存储到存储器中,该字节数据为源寄存器的低8位adr r0, _start ;指令将基于PC相对偏移的地址值读取到寄存器中。

ldmia r0!, {r9-r10} /* copy from source address [r0] */stmia r1!, {r9-r10} /* copy to target address [r1] */ADD R0,R1,R2 ; R0=R1+R2ADD R0,R1,#3 ;R0=R1+3DSB,ISB,DMB指令DBG:调试提⽰可向调试系统及其相关系统发送提⽰。

有关这些系统如何使⽤此指令的信息,请参这些系统的⽂档。

DMB: 数据内存屏障可作为内存屏障使⽤。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ARM汇编指令集:
指令:汇编指令是CPU机器指令的助记符,经过编译后会得到一串1、0组成的机器码,可以由CPU读取执行
伪指令:在编译过程中间起作用,用来指导编译过程,经过编译后不会生成机器码
***ARM汇编特点1:LDR/STR架构:在RISC架构中,cpu读写内存需要通过CPU内部的寄存器(CISC的CPU可以直接和内存通信)
***ARM汇编特点2:8中寻址方式
#寄存器寻址mov r1,r2 把r2里面的内容送到r1里面去(寄存器靠名字找的)
#立即寻址(立即数)mov r0,#0xFF00 加#表示数字
#寄存器移位寻址mov r0, r1, lsl #3 lsl左移指令,把r1的值左移三位,然后把左移后生成的那个数赋值给r0
#寄存器间接寻址ldr r1, [r2] [r2]表明内存地址存在r2中,然后把内存地址里面存储的那个值赋给r1
基址变址寻址ldr r1, [r2, #4]
[r2,#4]中存储的地址为r2中的地址+4构成的地址,r2里面存储的地址称为基地址,后面的数字就是需要的变址数这条指令的意思:把r2存储的内存地址加4的地址的值赋值给r1 #多寄存器寻址ldmia r1!, {r2-r7, r12}
一次访问多个寄存器//////r1放的内存地址,把r1理解为数组,r2-r7,r12表示7个寄存器,这句指令的意思就是:r1当中存储的内存地址为基地址,然后把从这个地址开始的连续七个地址当中存储的值,依次放在后面对应的寄存器中
#堆栈寻址stmfd sp!, {r2-r7, lr}
#相对寻址beq flag
flag:标号
***ARM汇编特点3:指令后缀
同一指令经常附带不同后缀,变成不同的指令。

经常使用的后缀有:
B(byte)功能不变,操作长度变为8位
H(half word)功能不变,长度变为16位
S(signed)功能不变,操作数变为有符号
如ldr ldrb ldrh ldrsb ldrsh
S(S标志)功能不变,影响CPSR标志位一般用在数据传输指令
如mov和movs movs r0, #0
***ARM汇编特点4:条件执行后缀
mov r0,r1 @相当于C语言的r0 = r1
moveq r0,r1 @如果eq后缀成立,则执行本句指令,反之,则不执行
条件后缀执行注意两点:
1.条件后缀是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果
2.条件后缀决定了本句代码是否会执行,而不会影响上一句或下一句代码是否会执行
***ARM汇编特点5:多级指令流水线
pc指向正在被取指的指令,而非正在执行的指令
******数据传输指令
mov r1,r0 @两个寄存器之间传递数据
mov r1,#12fff @把立即数赋值给目标寄存器
mvn 和mov 用法一样区别是mov原封不动传递,mvn是按位取反传递
******逻辑指令
and 逻辑与
orr 逻辑或
eor 逻辑异或
bic 位清除指令bic r0,r1,#0x1f 将r1中的数的bit0到bit4 (#0x1f为1的位清零)清零后赋值给r0
******比较指令
cmp
cmn 看两个值是否互补
tst test r0,#0xf @测试r0的0~3位是不是为0
teq 测试等价
比较指令用来比较两个寄存器中的数
比较指令不用后加S后缀就可以影响cpsr中的标志位
******常用ARM指令
cpsr访问指令:mrs & msr
mrs用来读psr ,msr 用来写psr
cpsr寄存器比较特殊,需要专门的指令访问,这就是mrs和msr
******跳转指令
b & bl & bx
b: 直接跳转
bl(branch and link):跳转前把返回地址放入lr中,以便返回,用于函数调用
*******访存指令
ldr /str / ldm / stm / swp
单个字/半字/字节访问:ldr/str
多字批量访问:ldm/stm
swp:内存和寄存器互换指令
swp r1,r2,[r0] 把r0存的地址的内容放到r1里面去,然后把r2的内容放到r0存的地址的内存中去
swp r1,r1,[r0]
******************************
合法立即数与非法立即数
ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少位数的立即数。

因此立即数有合法和非法之分。

合法立即数:经过任意位数的移位后非零部分可以用8位表示的即为合法立即数
**************
协处理器cp15的操作指令
mcr& mrc
mrc用于读取cp15中的寄存器
mcr用于写入cp15中的寄存器
*******************
由于ldr/str每周期只能访问4字节内存,如果需要批量读取,写入内存时太慢,解决的方案就是ldm/stm
ldm/stm与栈的处理
ldm (load register mutiple)
stm (store register mutiple)
****************************************************************
!的作用:r0值在ldm过程中发生的增加或减少写回到r0去,也就是ldm在运算过程中会改变r0中的地址值,如果没有!,则r0中的地址值不发生变化,如果有!,则r0中的值,会发生相应的改变
ldmia r0,{r2,r3}
ldmia r0!,{r2,r3}
^的作用:在目标寄存器中有PC时,会同时将spsr写入到cpsr(异常返回的时候)
ldmfd sp!,{r0-r6,pc}
ldmfd sp!,{r0-r6,pc}^
四种栈
空栈:空栈就是当需要往栈中加入内容的时候,直接将内容存入栈指针所指向的地址空间,然后在将栈指针指向下一个空的地址空间,而要取出内容时则需要先移动指针才能去除
满栈:满栈就是栈指针始终指向栈的最后一格,每次需要存储内容时,都需要先移动栈指针,然后把你内容存入栈指针所指向的地址空间,当要取出内容的时候不用移动指针直接可以取出
增栈栈指针移动的时候,往地址值增加的方向移动
减栈栈指针移动的时候,往地址值减小的方向移动
**********************************************************
伪指令
@用来做注释
#做注释一般用来放做行首,表示这一行都是注释而不是代码
:以冒号结尾的是标号
.点号在gnu汇编中表示当前指令的地址
立即数前面要加#或者$,表示这个数是立即数。

相关文档
最新文档