百度
360搜索
搜狗搜索

arm汇编指令大全,arm常用几个汇编语言的程序详细介绍

本文目录一览: arm 汇编指令

https://8biiit.github.io/2019/09/04/Arm%E6%8C%87%E4%BB%A4/

替代方案是使用一组新的指令,包括CSEL(Conditional Select), CINC(Conditional Increase)和CSET(Conditional Set)等,以CSEL为例,它的用法是这样的:

CSEL

,

,

,

意思是如果条件(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

https://stackoverflow.com/questions/53268118/whats-the-difference-between-mov-movz-movn-and-movk-in-armv8-assembly

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

https://developer.arm.com/documentation/100076/0100/a64-instruction-set-reference/a64-general-instructions/smaddl?lang=en

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

主要的汇编指令有哪些?

LDR 和STR——用于字和无符号字节\x0d\x0a指令格式:\x0d\x0aLDR/STR{cond}{T} Rd,\x0d\x0aLDR/STR{cond}B{T} Rd, \x0d\x0a\x0d\x0aLDR{cond}{T} Rd, 加载指定地址的字数据到Rd中;\x0d\x0aSTR{cond}{T} Rd, 存储Rd中的字数据到指定的地址单元中;\x0d\x0aLDR{cond}B{T} Rd, 指令加载指定地址的字节数据到Rd的的最低字节中(Rd的高24位清零);\x0d\x0aSTR{cond}B{T} Rd, 指令存储Rd中的最低字节数据到指定的地址单元中。\x0d\x0a T为可选后缀,若有T,那么即使处理器是在特权模式下,存储系统也将访问看成处理器是在用户模式下,T 在用户模式下无效,不能与前索引偏移一起使用T。\x0d\x0a\x0d\x0a地址部分可用的形式有4种: \x0d\x0a\x0d\x0a零偏移(zero offset) [Rn] ,Rn的值作为传送数据的地址。如: \x0d\x0aLDR R0,[R1]; \x0d\x0a前索引偏移(pre-indexed offset) [Rn,Flexoffset]{!} 在数据传送之前,将偏移量Flexoffset加到Rn 中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn 中,且Rn 不允许是R15,如: \x0d\x0aLDRB R0,[R1,#8]\x0d\x0aLDR R0,[R1,#8]! \x0d\x0a程序相对偏移(program relative) label(label 必须是在当前指令的土4KB 范围内) 。 \x0d\x0a程序相对偏移是前索引形式的另一种版本。从PC 计算偏移量,并将PC 作为Rn 生成前索引指令,不能使用后缀“!”,如: \x0d\x0aLDR R0,place ;\x0d\x0aplace地址装入R0 \x0d\x0a后索引偏移(post-indexed offset) [Rn],Flexoffset。在数据传送后,将偏移量Flexoffset 加到Rn 中,结果写回到Rn,Rn 不允许是R15,如: \x0d\x0aLDR R0,[R1],R2,LSL#2 ;\x0d\x0a将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。\x0d\x0a偏移量Flexoffset可以是下两种形式之:\x0d\x0a1) 取值范围是-4095 到+4095 的整数的表达式,经常是数字常量,如:\x0d\x0aSTR R5,[R7],#--8 \x0d\x0a2) 一个寄存器再加上移位(移位由立即数指定),如:\x0d\x0a{-}Rm{,shift} \x0d\x0a其中: \x0d\x0a- :可选负号。若带符号“一”,则从Rn 中减去偏移量。否则,将偏移量加到Rn 中。\x0d\x0aRm :内含偏移量的寄存器。Rm 不允许是R15。 \x0d\x0aShift:Rm 的可选移位方法。可以是下列形式的任何一种: \x0d\x0aASR n :算术右移n 位(1<=n<=32) \x0d\x0aLSL n :逻辑左移n 位(1<=n<=31) \x0d\x0aLSR n :逻辑右移n 位(1<=n<=32) \x0d\x0aROR n :循环右移n 位(1<=n<=31) \x0d\x0aRRX :循环右移1 位,带扩展。\x0d\x0aAND—————逻辑”与”操作指令\x0d\x0a指令格式:\x0d\x0a\x0d\x0aAND{cond}{S} Rd,Rn,operand2 \x0d\x0aAND指令将操作数operand2 与Rn 的值按位逻辑”与”,结果存放到目的寄存器Rd 中。若设置S,则根据运算结果影响N、Z位,在计算第二操作数时,更新C位,不影响V位(指令ORR、EOR、BIC 对标志位的影响同AND 指令)。\x0d\x0a指令示例:\x0d\x0aANDS R1,R1,R2 ;R1=R1&R2,并根据运算的结果更新标志位\x0d\x0aAND R0,R0,#0x0F ;R0=R0&0x0F,取出R0最低4位数据。\x0d\x0a\x0d\x0aORR—————逻辑”或”操作指令\x0d\x0a指令格式:ORR{cond}{S} Rd,Rn,operand2 ORR指令将操作数operand2 与Rn 的值按位逻辑”或”,结果存放到目的寄存器Rd 中。指令示例: \x0d\x0aORRS R1,R1,R2 ;R1=R1|R2,并根据运算的结果更新标志位\x0d\x0aORR R0,R0,#0x0F ;R0=R0|0x0F,将R0最低4位置1,其余位不变。 \x0d\x0a\x0d\x0aBIC—————位清除指令\x0d\x0a指令格式:\x0d\x0aBIC{cond}{S} Rd,Rn,operand2 \x0d\x0aBIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。\x0d\x0a\x0d\x0aCMP—————比较指令 \x0d\x0a指令格式:\x0d\x0aCMP{cond} Rn,operand2 \x0d\x0aCMP指令用Rn的值减去操作数operand2 ,并将结果的状态(Rn 与operand2比较是大、小、相等)反映在CPSR中,以便后面的指令根据条件标志决定程序的走向。CMP指令与SUBS指令完成的操作一样,只是CMP指令只减,不存结果。 \x0d\x0a指令示例: \x0d\x0acmp R0,R1 ;比较R0,R1 \x0d\x0abeq stop ;R0=R1跳到stop\x0d\x0ablt less ;R0
<r1跳到less \x0d\x0a\x0d\x0a. \x0d\x0a. \x0d\x0a\x0d\x0aless:\x0d\x0a. \x0d\x0astop: \x0d\x0a.\x0d\x0a.\x0d\x0a.\x0d\x0asub—————减法运算指令\x0d\x0a指令格式:\x0d\x0asub{cond}{s} rd,rn,operand2 sub指令用rn 的值减去操作数operand2 ,并将结果存放到目的寄存器rd 中。 指令示例: \x0d\x0asubs r1,r1,r2 ;r1="R1-R2,并并根据运算的结果更新标志位\x0d\x0aSUBGT" r3,3,#1 ;大于则 r3="R3-1" \x0d\x0asub r0,r2,r3,lsl#2; r0="R2-(R3<<2)\x0d\x0a\x0d\x0aARM分支指令\x0d\x0a助记符\x0d\x0a\x0d\x0a" 说明\x0d\x0a\x0d\x0a 操作\x0d\x0a\x0d\x0ab{cond} lable \x0d\x0a 分支指令\x0d\x0a\x0d\x0a pc← \x0d\x0abl{cond} 带链接的分支指令\x0d\x0a\x0d\x0a lr← pc-4 ,pc←lable \x0d\x0abx{cond} rm 带状态切换的分支指令\x0d\x0a\x0d\x0a rm,切换处理器状态\x0d\x0a\x0d\x0a指令的条件码\x0d\x0a条件码 助记符后缀 标志 含义 \x0d\x0a0000 eq z置位(z="1)" 相等 \x0d\x0a0001 ne z清零(z="0)" 不相等 \x0d\x0a0010 cs c置位 无符号数大于等于 \x0d\x0a0011 cc c清零 无符号数小于 \x0d\x0a0100 mi n置位 负数 \x0d\x0a0101 pl n清零 整数或0 \x0d\x0a0110 vs v置位 溢出 \x0d\x0a0111 vc v清零 未溢出 \x0d\x0a1000 hi c置位且z清零 无符号数大于 \x0d\x0a1001 ls z置位且c清零 无符号数小于等于 \x0d\x0a1010 ge n等于v(n="V=1或N=V=0)" 带符号数大于或等于 \x0d\x0a1011 lt n不等于v 带符号数小于 \x0d\x0a1100 gt z清零且n等于v 带符号数大于 \x0d\x0a1101 le z置位或n不等于v 带符号数小于或等于 \x0d\x0a1110 al 忽略 无条件执行 \x0d\x0a\x0d\x0a;gpio寄存器宏定义\x0d\x0agpfcon equ 0x56000050 \x0d\x0agpfdat 0x56000054\x0d\x0agpfup 0x56000058 \x0d\x0a\x0d\x0aexport ledtest\x0d\x0aarea ledtestasm,code,readonly ;该伪指令定义了一个代码段,段名为ledtestasm,属性只读\x0d\x0a\x0d\x0aledtest\x0d\x0a;设置gpf4-gpf7为output\x0d\x0aldr r0,="0x2fffff\x0d\x0abl" \x0d\x0aldr r1,[r0]\x0d\x0abic r1,r1,#0xff00\x0d\x0aorr r1,r1,#0x5500\x0d\x0astr r1,[r0]\x0d\x0a\x0d\x0a;禁止gpf4-gpf7端口的上拉电阻\x0d\x0aldr r1,[r0]\x0d\x0aorr r1,r1,#0xf0\x0d\x0astr r1,[r0]\x0d\x0a\x0d\x0alooptest\x0d\x0a;将数据端口f的数据寄存器的地址附给寄存器r2\x0d\x0aldr r2,="GPFDAT\x0d\x0a\x0d\x0aldr" r3,[r2]\x0d\x0abic r3,r3,#0xf0\x0d\x0aorr r3,r3,#0xb0\x0d\x0astr r3,[r2] ;gpf6 output 0\x0d\x0aldr delay ;调用延迟子程序\x0d\x0a\x0d\x0aldr r3,r3,#0x70\x0d\x0astr ;gpf7 ;初始计数值\x0d\x0abl ;调用延迟子程序 \x0d\x0a\x0d\x0aldr r3,r3,#0xd0\x0d\x0astr ;gpf5 r3,r3,#0xe0\x0d\x0astr ;gpf4 ;调用延迟子程序\x0d\x0a\x0d\x0ab looptest\x0d\x0adelay\x0d\x0asub r0,r0,#1 ;r0="r0-1" \x0d\x0acmp r0,#0x0 ;将r0的值与0相比较\x0d\x0abne ;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句\x0d\x0amov pc,lr ;返回\x0d\x0a\x0d\x0aend ;程序结束符

阅读更多 >>>  荣耀x20时间怎么设置

ARM汇编:多寄存器指令LOADSTORE指令(LDMSTM )

LDM/STM分为两组:

看一下助记符的具体含义:
LDM/STM :
M 应该是多(Multi)的意思, LD / ST 分别对应load和store,那么 LDM/STM 应该可以理解为多寄存器的load/store操作指令。

IA 、 IB 、 DA 、 DB 、 FA 、 FD 、 EA 、 ED 的含义可以参考下面的说明:

作用:
将[R4]和[R4+4]分别存入R0和R1寄存器。

A / D 是标识堆栈增长的方向。
A 表示正增长(低地址往高地址增长)。
D 表示负增长(高地址往低地址增长)。

F / E 是标识是指向栈顶还是栈底。

在ARM中, STMFD SP! 就等同于 PUSH , LDMFD SP! 就等同于 POP 。
例如,

作用:
将lr,r3,r2,r1,r0按顺序入栈,SP = SP - 4*5;

arm汇编 ldr r0 =0x00000000 这个=号代表什么啊

arm汇编 ldr r0 =0x00000000 这个=号代表什么啊 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中。 而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。 x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。 另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如: ldr r0, =0x12345678 这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。
ARM汇编指令请教 ldr r1,=0x00555555中等号到底怎么用? LDR r0,=label 如果label是立即数,就把数值赋给r0, 如果lable是标识符,就把label地址的值赋给r0
下面ARM汇编指令( )完成R1=R0×8操作。 [D]MOV R1,R0,LSL #3 这个左移位操作是做乘法运算的。2的3次方,就是8
ARM 中LDR R0, TABLE 和 ADR R0, TABLE 和LDR R0, =TABLE 有什么差别 先解释下这个LDR,ADR命令的具体含义。 1、LDR 使用格式 :LDR

LDR用于从内存中将一个32位的字读取到指令的目标寄存器中,如果PC作为指令中的目标寄存器,指令就可以实现程序的跳转功能。 其实ARM的LDR指令有两种,一种就是LDR指令,另一个是LDR伪指令,它们的写法一样,但是含义不一样,伪指令的LDR有“=”,所以你所给的三个指令中,第一个LDR是ARM的LDR指令,第三个是ARM的伪指令LDR,伪指令LDR=后面的数是一个32位的立即数(可以立即为常量),在汇编编译源程序时,LDR 伪指令被编译器替换成一条合适的指令。若加载的常数未超出 MOV 或 MVN 的范围,则使用 MOV 或 MVN 指令代替该 LDR 伪指令;否则汇编器将常量放入文字池,并使用一条程序相对偏移的 LDR 指令从文字池读出常量。LDR 用于加载芯片外围功能部件的寄存器地址(32 位立即数),以实现各种控制操作。从 PC到文字池的偏移量必须小于 4 KB。 2、ADR伪指令 使用格式:ADR

,

ADR将一个基于PC或者寄存器的相对地址装载到寄存器R0中,主要限制是对expr这个地址的寻址范围,如果expr是字对齐的,那么它的寻址范围是(+-)1024字节,如果是非对齐的地址那么寻址范围只有(+-)255字节。它主要用于在一个小范围内读取数据。

也就是说到底用那个,取决于后面的TABLE的类型和大小的。如果是从内存中读取一个数据到寄存器就用第一个,小范围读就用第二个,读取一个32位常量类型的地址用第三个。

希望对你有用。

蓝屏代码0x0000010e(0x0000001e ,0x00000000 ,0x00000000,0x00000000 )表示什么啊 你好,电脑蓝屏,主要是:“内存有错误”或“软件不兼容”引起! 这是解决方法:(作者:力王历史) 1。试试开机,出完电脑品牌后,按F8,安全模式,光标选定:最后一次正确配置, 回车,回车,按下去!【关键一步】 2。再不行,进安全模式,回车,到桌面后,杀毒软件,全盘杀毒! “隔离区”的东西,彻底删除! 3。再使用:360安全卫士,“功能大全”里的:“360系统急救箱”, 点:开始急救!重启后,点开“文件恢复区”,全选,彻底删除文件! 系统修复,全选,立即修复!【关键一步】 网络修复,开始修复,重启电脑! 360安全卫士,扫描插件,立即清理!360安全卫士,系统修复,一键修复! 【金山急救箱】,勾选:【扩展扫描】,立即扫描,立即处理,重启电脑! 4。再不行,拔下显卡和内存条,橡皮擦擦,再用毛刷,清理插槽灰尘和风扇, 更换内存插槽等!【台式机】 5。检查是否有同类功能的,多余类似软件,如:多款播放器,多款杀毒软件 等,卸载多余的,只留一款,因为同类软件,互不兼容!【关键一步】 6。再不行,下载“驱动人生”,升级:显卡驱动! 7。如果还是不行,需要“一键还原”或“重装系统”了! 8。硬件有问题,送修!

在汇编中(如arm),R0的地址值bit[1:0],这个bit[1:0]是什么意思啊 你好 这是我帮你找的 希望对你有帮助 单寄存器传输 先看第一个,很简单:把单一的数据传入(LDR) 或传出(STR)寄存器,对内存的访问可以是DWORD(32-bit), WORD(16-bit)和BYTE(8-bit)。指令的格式如下: DWORD:

Rd, addressing1 WORD:

H Rd, addressing2 无符号版

SH Rd, addressing2 有符号版 BYTE:

B Rd, addressing1 无符号版

SB Rd, addressing2 有符号版 addressing1 和addressing2 的分类下面再说,现在理解成某种寻址方式就可以了。 在单寄存器传输方面,还有以下三种变址模式,他们是: ◆ preindex 这种变址方式和x86的寻址机制是很类似的,先对寄存器进行运算,然后寻址,但是在寻之后,基址寄存器的内容并不发生改变,例如: ldr r0, [r1, #4] 的含义就是把r1+4 这个地址处的DOWRD 加载到r0,而寻址后,r1 的内容并不改变。 ◆ preindex with writeback 这种变址方式有点类似于++i的含义,寻址前先对基地址寄存器进行运算,然后寻址. 其基本的语法是在寻址符[]后面加上一个"!" 来表示.例如: ldr r0, [r1, #4]! 就可以分解成: add r1, r1, #4 ldr r0, [r1, #0] ◆ postindex 自然这种变址方式和i++的方式就很类似了,先利用基址寄存器进行寻址,然后对基址寄存器进行运算,其基本语法是把offset 部分放到[]外面,例如: ldr r0, [r1], #4 就可以分解成: ldr r0, [r1, #0] add r1, r1, #4 如果你还记得x86 的SIB 操作的话,那么你一定想ARM是否也有,答案是有也没有。在ss上面提到的addressing1 和addressing2的区别就是比例寄存器的使用,addressing1可以使用[base, scale, 桶形移位器]来实现SB 的效果,或者通过[base,offset](这里的offset 可以是立即数或者寄存器)来实现SI 的效果,而addressing2则只能用后者了。于是每一种变址方式最多可以有3 种寻址方式,这样一来,最多可以有9种用来寻址的指令形式。例如: ldr r0, [r1, r2, LSR #0x04]! ldr r0, [r1, -#0x04] ldr r0, [r1], LSR #0x04 每样找了一种,大概就是这个意思。到此,单寄存器传输就结束了,掌握这些足够应付差事了。下面来看看多寄存器传输吧。 多寄存器传输 说得很明白,意思就是通过一条指令同时把多个寄存器的内容写到内存或者从内存把数据写到寄存器中,效率高的代价是会增加系统的延迟,所以arm 提供了一个编译器选项来控制寄存器的个数。指令的格式有些复杂:

阅读更多 >>>  arm芯片是哪个国家的

Rn{!},

{r^} 我们先来搞明白寻址模式,多寄存器传输模式有4 种: 也就是说以A开头的都是在Rn的原地开始操作,而B开头的都是以Rn的下一个位置开始操作。如果你仍然感到困惑,我们不妨看个例子。 所有的示例指令执行前: mem32[0x1000C] = 0x04 mem32[0x10008] = 0x03 mem32[0x10004] = 0x02 mem32[0x10000] = 0x01 r0 = 0x00010010 r1 = 0x00000000 r3 = 0x00000000 r4 = 0x00000000 1) ldmia r0!, {r1-r3} 2) ldmib r0!, {r1-r3} 执行后: 执行后: r0 = 0x0010001C r0 = 0x0010001C r1 = 0x01 r1 = 0x02 r2 = 0x02 r2 = 0x03 r3 = 0x03 r3 = 0x04 至于DA 和DB 的模式,和IA / IB 是类似的,不多说了。 最后要说的是,使用ldm 和stm指令对进行寄存器组的保护是很常见和有效的功能。配对方案: stmia / ldmdb stmib / ldmda stmda / ldmib stmdb / ldmia 继续来看两个例子: 执行前: r0 = 0x00001000 r1 = 0x00000003 r2 = 0x00000002 r3 = 0x00000001 执行的指令: stmib r0!, {r1-r3} mov r1, #1 ; These regs have been modified mov r2, #2 mov r3, #3 当前寄存器状态: r0 = 0x0000100C r1 = 0x00000001 r2 = 0x00000002 r3 = 0x00000003 ldmia r0!, {r1-r3} 最后的结果: r0 = 0x00001000 r1 = 0x00000003 r2 = 0x00000002 r3 = 0x00000001 另外,我们还可以利用这个指令对完成内存块的高效copy: loop ldmia r9!, {r0-r7} stmia r10!, {r0-r7} cmp r9, r11 bne loop 说到这里,读者应该对RISC的Load-Store体系结构有一个大概的了解了,能够正确配对使用指令,是很重要的。

如何用ARM汇编实现r0=r1/16,急需请编程高手 ldr r0, r1, LSR #4 即将r1的内容逻辑右移4位后放入r0,这里的逻辑右移4位,即可以看做是除以2的4次方即16。

(简单的ARM汇编题目)已知C=1,R1=100,R2=90,执行指令ADDC R0,R1,R2后,R0=? 因为要加上进位位CF,而C=1,所以191

初学者求教一个关于arm汇编的简单概念 MVN R1,#0 ; MVN R0, #4; 为什么0按 补码, 0在32位的储存空间取反后是0xffffffff,有符号显示就是-1了

汇编arm LDR我知道 那么LDRD是什么啊 LDR指令的格式为: LDR{条件} 目的寄存器,

LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用亍从存储器 中读取32位的字数据到通用寄存器,然后对数据迕行处理。当程序计数器PC作为目的寄存器时, 指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设 计中比较常用,丏寻址方式灵活多样,请读者认真掌握。


ARM汇编指令NOP指令问题有哪些?

1、在打开的ie浏览器窗口右上方点击齿轮图标,选择“Internet选项”,如下图所示:
2、在打开的Internet选项窗口中,切换到安全栏,在安全选卡中点击“自定义级别”,如下图所示:
3、在“安全设置-Internet 区域”界面找到“Java 小程序脚本”、“活动脚本”,并将这两个选项都选择为“禁用”,然后点击确定,如下图所示:

arm汇编loop指令

int GetSum(int val) //使用汇编求1+2+3+...+val的值 { int sum = 0; __asm__ __volatile__( "MOV R5 , %1\n"//val放入寄存器r5 "MOV R1 , #0\n" //sum = 0 "MOV R2 , #1\n"//i = 1 "LOOP:\n" " ADD R1 , R1 ,R2\n" //sum = sum + i " ADD R2 , R2 ,#1\n" //i++ " CMP R5 , R2\n" //判断 i 是否等于val if(i==val) " BEQ END\n" //若相等 跳转至END处 break " B LOOP\n" //若不相等 跳转至LOOP处进入下次循环 else continue "END:\n" "MOV %0 , R1\n" //sum = R1 :"=r"(sum)//输出 :"r"(val)//输入 :"memory" ); return sum; } 随便写了个求和的例子 其余的循环大同小异 不懂可以继续探讨 运行之前请交叉编译然后在ARM平台上运行

arm?汇编?指令看不太懂,高手解释下

的确,书本上都有!
BEQ
相等则跳转,B跳转,EQ相等(,前面有CMP)
LDRCC
小于则装载内存数据到寄存器,LDR装载,CC小于
STRCC
BCC类似

{

}{S}

,

{,第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里面的结束地址后面的一个地址

阅读更多 >>>  vivox9说明书在哪里


arm常用几个汇编语言的程序

一。从一数到十
COUNT EQU 0x30003100 ;定义变量COUNT的基地址 AREA Example1,CODE,READONLY;声明代码段Example1为只读 ENTRY ;标识程序入口
CODE32 ;声明32位ARM指令 START LDR R1,=COUNT ;将0X30003100赋给R1 MOV R0,#0 ;执行R0=0
STR R0,[R1] ;存储R0寄存器的数据到R1指向的存储单元 LOOP LDR R1,=COUNT ;将0X30003100赋给R1
LDR R0,[R1] ;将R1中的数值作为地址,取出此地址中的数据保存到R0中 ADD R0,R0,#1 ;执行R0=R0+1
CMP R0,#10 ;将R0与10进行比较
MOVHS R0,#0 ;若R0大于等于10,则R0=0
STR R0,[R1] ;存储R0寄存器的数据到R1指向的地址单元 B LOOP ;跳转到LOOP
END ;汇编文件结束
二,9的8次幂
X EQU 9 ;初始化X为9 n EQU 8 ;初始化N为8
AREA Example3,CODE,READONLY ;生明代码段Example3为只读 ENTRY ;标识程序入口路
CODE32 ;声明32位ARM指令
START LDR SP,=0x30003F00 ;把0x30003F00 赋给SP(R13) LDR R0,=X ;把9赋给R0 LDR R1,=n ;把8赋给R1
BL POW ;跳转到POW,并把下一条指令地址存入到R14中 HALT B HALT ;等待跳转
POW STMFD SP!,{R1-R12,LR} ;将R1-R12入栈,满递减堆栈 MOVS R2,R1 ;将R1赋给R2,并影响标志位 MOVEQ R0,#1 ;若Z=1,则R0=1
BEQ POW_END ;若Z=1,跳转到POW_END MOV R1,R0 ;将R0中值赋给R1 SUB R2,R2,#1 ;将R2-1的只赋给R2 POW_L1 BL DO_MUL ;跳转到DO-MUL,并把下一条指令地址存入R14中 SUBS R2,R2,#1 ;将R2-1的值赋给R2,并影响标志位 BNE POW_L1 ;若Z=0,跳转到POW_L1
POW_END LDMFD SP!,{R1-R12,PC} ;数据出栈,存入到R1-R12,PC中 DO_MUL MUL R0,R1,R0 ;把R1*R0的值赋给R0 MOV PC,LR ;LR中的值赋给PC END ;汇编结束
三:从一一直加到一百
程序清单(一) C 语言实验参考程序
#define uint8 unsigned char ;定义一个无符号字符常量uint8 #define uint32 unsigned int ;定义一个无符号整型常量unint32
#define N 100 ;定义一个常量N=100(宏定义,100用N代替) uint32 sum; ;定义sum为无符号整型常量(声明一个unsigned int型的变量sum) void Main(void) ;主函数
{uint32 i; ;定义无符号整型常量i(声明一个unsigned int型的变量i) sum=0; ;sum初始值为0
for(i=0;i<=N;i++) ;i在N内自增加1(i从0开始,i<=N时循环成立) {sum+=i;} ;把sum+i赋给sum while(1); ;为真循环 }
程序清单(二) 简单的启动代码
IMPORT |Image$$RO$$Limit | ;R0输出段存储区域界线 IMPORT |Image$$RW$$Base | ;RW输出段运行时起始地址 IMPORT |Image$$ZI$$Base | ;ZI输出段运行时起始地址 IMPORT |Image$$ZI$$Limit | ;ZI输出段存储区域界线 IMPORT Main ;主函数
AREA Start,CODE,READONLY ;声明代码段start,为只读 ENTRY ;程序入口
CODE32 ;声明32位ARM指令 Reset LDR SP,=0x40003f00 ;将0x40003f00赋给SP
LDR R0,=|Image$$RO$$Limit| ;将R0输出段存储区域界线赋给R0 LDR R1,=|Image$$RW$$Base | ;将RW输出段运行时起始地址赋给R1 LDR R3,=|Image$$ZI$$Base | ;将ZI输出段运行时起始地址赋给R3 CMP R0,R1 ;比较R0和R1,相等Z=1,反之Z=0 BEQ LOOP1 ;若Z=1,则跳到LOOP1
LOOP0 CMP R1,R3 ;比较R1和R3,若R1
<r3,c=0
LDRCC R2,[R0],#4 ;若C=0,读取R0地址单元内容并且存入R2,且R0=R0+4 STRCC R2,[R1],#4 ;若C=0,读取R2中的数据存入R1,且R1=R1+4 BCC LOOP0 ;若C=0,跳转到LOOP0

LOOP1 LDR R1,=|Image$$ZI$$Limit| ;将ZI输出段存储区域赋给R1 MOV R2,#0 ;把0赋给R2

LOOP2 CMP R3,R1 ;比较R1和R3,若R1
<r3,c=0 strcc="" r2,[r3],#4="" ;若c="0,将R2中数据保存到内存单元R3中,且R3=R3+4" bcc="" loop2="" b="" main="" ;跳转到主程序="" end="" ;汇编结束=""
四、程序清单(一) C 语言调用汇编的参考程序

#define uint8 unsigned char ;定义一个无符号字符常量uint8 #define uint32 unsigned int ;定义一个无符号整型常量.uint32

extern uint32 Add(uint32 x,uint32 y); //声明子程序Add为一个无符号整型常量,它为2个无符号整型常量x,y的和

uint32 sum; ;定义sum为无符号整型常量 void Main(void) ;无返回主程序

{sum=Add(555,168); ;sum等于555+168 while(1); ;为真循环 }

程序清单(二) 汇编加法函数程序

EXPORT Add ;声明子程序Add方便调用 AREA Start,CODE,READONLY ;声明代码段start,为只读 ENTRY ;程序入口

CODE32 ;声明32位ARM指令

Add ADD R0,R0,R1 ;将R0+R1值赋给R0 MOV PC,LR ;将LR值赋给PC

</r3,c=0

ARM中的汇编指令ASR指令MOV R0, R1, ASR#2

因为首先ASR是“算术”右移指令,因此用它来操作数据时,指令会认为被操作的数是有符号数,而二进制中有符号数的最高位即为符号位。因此为了保留数据符号,用符号位来填充因移位而导致的空缺位。举例是这样的:
MOV R1, 0x90000000;
MOV R0, R1, ASR #2;
//因为R1里面的最高字节是0x90,也就是二进制10010000,又是算数右移,所以会用最高位这个'1'填充空出来的位,移位完也就成了11100100_00,所以放到R0里面成了0xE4000000。

网站数据信息

"arm汇编指令大全,arm常用几个汇编语言的程序"浏览人数已经达到20次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:arm汇编指令大全,arm常用几个汇编语言的程序的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!