arm汇编指令流程图(arm 汇编指令)

本文目录
- arm 汇编指令
- ARM指令的一般编码格式如下
- ARM 汇编语言指令
- arm 汇编 指令看不太懂,高手解释下
- 有程序段如下,实现下面流程图,试补充编写ARM汇编代码(8分)
- 结合Bootloader的相关知识,并参考ARM的汇编指令,分析下面的Bootloader代码
arm 汇编指令
***隐藏网址***
替代方案是使用一组新的指令,包括CSEL(Conditional Select), CINC(Conditional Increase)和CSET(Conditional Set)等,以CSEL为例,它的用法是这样的:
CSEL 《Xd》, 《Xn》, 《Xm》, 《cond》
意思是如果条件(cond)满足,就选择(sel)Xn作为Xd,否则选择Xm作为Xd。比如下面这条语句:
CSEL X0, X0, X1, ge
表示的是如果X0》=X1(ge - greater or equal),那么X0=X0(保持不变),否则X0=X1。虽然比IT指令块的语法看起来要直观一些,但比起IT指令块能表达的层级关系,还是稍微弱了一点。
mov 寄存器、 立即数 mov r0,#0x1 r0 = 0x1
mov 寄存器、 寄存器 mov r2, r1 r2 = r1
***隐藏网址***
instruction value of x0
mov x0, #0x1f88 | 0x1f88
movk x0, #0xb7fb, lsl #16 | 0xb7fb1f88
movk x0, #0x7f, lsl #32 | 0x7fb7fb1f88
;ADD加法指令
mov r0, #1
mov r1, #1
add r2, r1, r0 ;r2 = r1 + r0
add r2, r1, #2 ;r2 = r1 + 2
;ADC带进位加法指令,即除了加两个数以外,还要把CPSR的C值也要带进来
ADDS R0,R1,R2; R0=R1+R2,ADDS中S表示把进位结果写入CPSR
ADC R5,R3,R4 ;R5=R3+R4+C
;SUB减法指令
mov r0, #5
mov r1, #3
sub r2, r0, r1 ;r2 = r0 - r1
sub r2, r1, #2 ;r2 = r1 - 2
;SBC带进位减法指令,即除了加两个数以外,还要把CPSR的C值也要带进来,类似ADC
SUBS R0,R1,R2; R0=R1-R2,SUBS中S表示把进位结果写入CPSR
SBC R5,R3,R4 ;R5=R3-R4-C
AND R0,R1,R2; R0=R1 & R2
AND R0,R1,#0xFF ;R0=R1 & 0xFF
ORR R0,R1,R2; R0=R1 | R2
ORR R0,R1,#0xFF ;R0=R1 | 0xFF
MADD Rd, Rn, Rm, Ra =》 Rd = Ra + Rn * Rm
MSUB Rd, Rn, Rm, Ra =》 Rd = Ra - Rn * Rm
***隐藏网址***
Signed Multiply-Add Long multiplies two 32-bit register values, adds a 64-bit register value, and writes the result to the 64-bit destination register.
SMADDL Xd, Wn, Wm, Xa
Xd = Xa + Wn * Wm.
LSR(Logical shift right),逻辑右移或者说是无符号的右移。LSR #n操作可以对寄存器的内容进行逻辑右移n位,左边被移走的n位全部被清零
MOV R1,#0X80000001
LSR R0,R1,#3; R0 = (unsigned)R1》》 3
ARM指令的一般编码格式如下
你这个是ARM7 CPU的指令码格式,早期的ARM架构,是ARMV4T,而且只是其数据处理类指令的指令编码格式(4位编码,配合这其余位,如I位,Rn,Rm,第二操作数等编码位,可以编码出很多条数据处理指令。)。所以说,并不是25-27位没有使用。在其它类型的指令中就有使用25-27,如图2.
图1 ARM7 CPU数据处理指令的编码格式。
图2 ARM7 CPU的单字节传输(LAD,STR)指令编码格式
具体请自己查找官方手册,在arm官网可以找到对应资料。
ARM 体系结构参考手册ARMv7-A和ARMv7-R版:DDI0406C_C_arm_architecture_reference_manual.pdf 的A5章节,193页起都是讲这个的。
ARM 汇编语言指令
当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。每一条ARM指令包含4位的条件码,位于指令的最高4位。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。在16种条件标志码中,只有15种可以使用,如表所示,第16种(1111)为系统保留,暂时不能使用。 指令的条件码条件码 助记符后缀 标 志 含 义0000 EQ Z置位 相等0001 NE Z清零 不相等0010 CS C置位 无符号数大于或等于0011 CC C清零 无符号数小于0100 MI N置位 负数0101 PL N清零 正数或零0110 VS V置位 溢出0111 VC V清零 未溢出1000 HI C置位Z清零 无符号数大于1001 LS C清零Z置位 无符号数小于或等于1010 GE N等于V 带符号数大于或等于1011 LT N不等于V 带符号数小于1100 GT Z清零且(N等于V) 带符号数大于1101 LE Z置位或(N不等于V) 带符号数小于或等于1110 AL 忽略 无条件执行
arm 汇编 指令看不太懂,高手解释下
的确,书本上都有!
BEQ
相等则跳转,B跳转,EQ相等(,前面有CMP)
LDRCC
小于则装载内存数据到寄存器,LDR装载,CC小于
STRCC
BCC类似
《助记符》{《执行条件》}{S}
《Rd》,《Rn》{,第2操作数}
有S则表示影响CPSR寄存器的值
条件码助记符:
EQ
相等
NE
不相等
CS/HS
无符号数大于或等于
CC/LO
无符号数小于
MI
负数
PL
正数或零
VS
溢出
VC
没有溢出
HI
无符号数大于
LS
无符号数小于或等于
GE
有符号数大于或等于
LT
有符号数小于
GT
有符号数大于
LE
有符号数小于或等于
AL
无条件执行,跟不写一样
|Image$$RO$$Limit|:表示RO区末地址后面的地址,即RW数据源的起始地址
|Image$$RW$$Base|:RW区在RAM里的执行区起始地址,也就是编译器选项RW_Base指定的地址。
|Image$$ZI$$Base|:ZI区在RAM里面的起始地址
|Image$$ZI$$Limit|:ZI区在RAM里面的结束地址后面的一个地址
有程序段如下,实现下面流程图,试补充编写ARM汇编代码(8分)
mov r0, # 15
mov r1, # 9
start:
dd1:
cmp r0, r1
beq stop
lttee hi
subhi r0, r0, r1
bhi dd1
subls r1, r1, r0
bls dd1
stop:
b stop
结合Bootloader的相关知识,并参考ARM的汇编指令,分析下面的Bootloader代码
我的水平也一般,注释仅供参考
.globl _start
_start: b reset
reset: //复位起始
ldr r0, IC_BASE //将芯片基址载入R0寄存器中
mov r1, #0x00
str r1, //初始化ICMR寄存器为0
ldr r0, PWR_BASE //将电源管理基址载入R0寄存器中
ldr r1, cpuspeed //设定CPU时钟
str r1, //将设定的时钟载入PPCR寄存器中(我猜测是使能该时钟)
bl ledinit //初始化LED
bl memsetup //初始化外部Memory设置
//该段应该是完成复位控制器的配置,由于没有具体的CPU手册,因此无法知道是完成了什么配置,建议你对照CPU手册查看一下,下面几段相同
ldr r0, RST_BASE //载入复位控制器基址
ldr r1, //读取RCSR寄存器的值到R1中
and r1, r1, #0x0f //保留R1的低四位
teq r1, #0x08 //若R1的第3位不为0,则跳转至normal_boot,否则继续执行
bne normal_boot /* no, continue booting */
mov r1, #0x08
str r1, ; //将RCSR寄存器设置为0x08
/* handle Power Manager Sleep Status Register (PSSR), see 9.5.7.5 from */
ldr r1, //载入PSSR寄存器的值到R1中
orr r1, r1, #0x08
orr r1, r1, #0x10 //将R1寄存器的值的第3、4位置1
str r1, //将该值写回PSSR寄存器
/* get the value from the PSPR and jump to it */
ldr r0, PWR_BASE //读取电源管理基址到R0中
ldr r1, //读取PSPR内的值(我估计是一个地址)
mov pc, r1 //跳转至读取的地址
normal_boot:
mov r7, #0x1000
mov r6, r7, lsl #8 /* 4k 《《 2^8 = 1MB */ //将0x1000左移8位放入R6中
ldr r5, BLOB_START //载入BLOB_START的内容到R5中
relocate: //重定位,为代码复制做准备
adr r0, _start //获取_start的地址
add r2, r0, #(64 * 1024) /* blob maximum size is 64kB */ //取R0地址后64KB的代码
add r0, r0, #0x400 /* skip first 1024 bytes */ //跳过起始的1K代码不复制
ldr r1, BLOB_START //设定目标地址到R1中
/* r0 = source address
* r1 = target address
* r2 = source end address
*/
copy_loop: //复制代码。每次复制8Byte
ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
cmp r0, r2
ble copy_loop
bl led_off //复制完成关闭LED指示
ldr r0, BLOB_START //获取程序入口
mov pc, r0 //跳转至程序入口,第一阶段初始化完成

更多文章:
display flex 自动换行(overflow-y:hidden;overflow-x:auto;无效解决方法)
2026年9月7日 11:00
timestamp without time zone(Postgresql中to_date()函数使用问题)
2026年9月7日 09:40
下载mysql的步骤(win10安装mysql的步骤和方法)
2026年9月7日 04:10
checked in(check in和check out的区别)
2026年9月7日 01:20
java经典上机编程题(java上机题 请问这道题应该怎么写)
2026年9月7日 01:10
影视剧中有哪些剧情颠覆了你的三观?金庸的武侠小说《白马啸西风》为什么没有被拍成电影或者电视剧
2026年9月7日 00:30





