arm 32 常见汇编指令解释

这篇具有很好参考价值的文章主要介绍了arm 32 常见汇编指令解释。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

push: 将一个或多个寄存器的值压入栈中,更新栈指针寄存器。语法示例:push {r1, r2, r3}。

add: 执行加法并将结果存储到目标操作数中。语法示例:add r1, r2, #5,将寄存器r2的值加上5,结果存储到寄存器r1中。

push.w: 将指定的寄存器的值压入栈中,并将栈指针向下调整4个字节。语法示例:push.w {r4, r5, lr}。

sub: 执行减法并将结果存储到目标操作数中。语法示例:sub r1, r2, #5,将寄存器r2的值减去5,结果存储到寄存器r1中。

mov: 将源操作数的值移动到目标操作数中。语法示例:mov r1, r2,将寄存器r2的值移动到寄存器r1中。

ldr: 将内存中指定地址的数据加载到目标操作数中。语法示例:ldr r1, [r2],将地址为r2的内存中的数据加载到寄存器r1中。

str: 将源操作数的值存储到内存中指定地址。语法示例:str r1, [r2],将寄存器r1的值存储到地址为r2的内存中。

movs: 将源操作数的值移动到目标操作数中,并设置条件标志位。语法示例:movs r1, #1,将值1移动到寄存器r1中,并设置条件标志位。

adr: 将指定地址的偏移量加载到目标操作数中。语法示例:adr r1, label,将标签label的偏移量加载到寄存器r1中。

ldr.w: 将内存中指定地址的数据加载到目标操作数中,并零扩展为32位。语法示例:ldr.w r1, [r2],将地址为r2的内存中的数据加载到寄存器r1中,并零扩展为32位。


adds.w: 这是一个ARM指令,表示将两个操作数相加,并将结果存储到第一个操作数中。".w"表示使用16位的操作数大小。例如: adds.w r1, r2, #3 表示将寄存器r2中的值加上3,然后把结果存储到寄存器r1中。

bx: 这是一个ARM指令,表示将控制流程更改为另一个代码地址处。它通常用于实现跳转或返回子程序。例如:bx lr 表示从当前位置跳转到链接寄存器(LR)中保存的地址执行。

cmp: 这是一个ARM指令,表示比较两个操作数的值,并根据比较结果设置条件码寄存器。例如:cmp r2, #0 表示将寄存器r2的值与零进行比较。

bgt:  这是一个ARM指令,表示当最近一次比较的结果大于时,将控制流程更改为另一个代码地址处。例如:bgt loop 表示当条件码寄存器表明最近一次比较的结果大于时,跳转到标签loop所在的地址执行。

cmp.w: 这是一个ARM指令,与cmp类似,但".w"表示使用16位的操作数大小。例如:cmp.w r2, #255 表示将寄存器r2的值与255进行比较。

it: 这是一个ARM指令,表示条件代码融合。它允许在同一条指令中执行多个条件操作。例如:it gt 表示后续指令将只有在条件码寄存器表明最近一次比较的结果大于时才会执行。

mov.w: 这是一个ARM指令,表示将一个操作数的值复制到另一个操作数中。".w"表示使用16位的操作数大小。例如:mov.w r0, #10 表示将常量值10赋给寄存器r0。

lsl.w: 这是一个ARM指令,表示将一个操作数向左移动指定数量的位数。".w"表示使用16位的操作数大小。例如:lsl.w r1, r2, #3 表示将寄存器r2的值向左移动3个位,然后把结果存储到寄存器r1中。

b: 这是一个ARM指令,表示将控制流程更改为另一个代码地址处。它通常用于实现跳转或返回子程序。例如:b done 表示跳转到标签done所在的地址执行。

bne: 这是一个ARM指令,表示当最近一次比较的结果不相等时,将控制流程更改为另一个代码地址处。例如:bne error 表示当条件码寄存器表明最近一次比较的结果不相等时,跳转到标签error所在的地址执行。

beq.w: 这是一个ARM指令,表示在条件码寄存器表明最近一次比较的结果相等时,将控制流程更改为另一个代码地址处。".w"表示使用16位的操作数大小。例如:beq.w done 表示当条件码寄存器表明最近一次比较的结果相等时,跳转到标签done所在的地址执行。

bl: 这是一个ARM指令,表示将当前程序计数器(PC)中的地址压入链接寄存器(LR),然后将控制流程更改为另一个代码地址处。这通常用于实现函数调用。例如:bl printf 表示调用C库函数printf()。

beq: 这是一个ARM指令,与beq.w类似,但没有指定操作数的大小。例如:beq error 表示在条件码寄存器表明最近一次比较的结果相等时,跳转到标签error所在的地址执行。

cbz: 这是一个ARM指令,表示测试一个寄存器的值是否为零,如果为零,则将控制流程更改为另一个代码地址处。例如:cbz r1, done 表示如果寄存器r1的值为零,则跳转到标签done所在的地址执行。

movt: 这是一个ARM指令,表示将一个16位的立即数移动到寄存器的高16位。例如:movt r1, #0x1234 表示将立即数0x1234移动到寄存器r1的高16位。

blx: 这是一个ARM指令,与bl类似,但可用于跳转到Thumb或ARM代码中的函数。例如:blx func 表示调用名为func的函数,该函数可以是Thumb或ARM代码实现。

cbnz: 这是一个ARM指令,与cbz类似,但在测试时会反转结果。例如:cbnz r3, loop 表示如果寄存器r3的值不为零,则跳转到标签loop所在的地址执行。

subs: 这是一个ARM指令,表示将两个操作数相减,并将结果存储到第一个操作数中。它还设置条件码寄存器以表明结果是否小于、等于或大于零。例如:subs r1, r2, #1 表示将寄存器r2中的值减去1,然后将结果存储到寄存器r1中,并设置条件码寄存器以表明结果是否小于、等于或大于零。

ittt: 这是一个ARM指令,表示条件并行执行(if-then)。它允许在同一条指令中根据条件执行多个操作。例如:ittt eq 表示后续指令只有在条件码寄存器表明最近一次比较的结果相等时才会执行。

pop: 这是一个ARM指令,表示从栈中弹出一个或多个寄存器的值。例如:pop {r0, r1, r2} 表示将栈顶的值依次弹出到寄存器r2、r1和r0中。

ldrb: 这是一个ARM指令,表示从内存中读取一个字节的数据,并将其存储到寄存器中。例如:ldrb r1, [r2, #3] 表示从以寄存器r2为基地址、偏移量为3的内存地址处读取一个字节的数据,并将该数据存储到寄存器r1中。

strd: 这是一个ARM指令,表示将两个寄存器的值存储到内存中。它可以一次性存储64位的数据。例如:strd r1, r2, [r0] 表示将寄存器r1和r2的值一起存储到以寄存器r0为基地址的内存位置中。

strb: 这是一个ARM指令,表示将一个字节的数据存储到内存中。例如:strb r1, [r2, #3] 表示将寄存器r1中的值存储到以寄存器r2为基地址、偏移量为3的内存地址处。

pop.w: 这是一个ARM指令,与pop类似,但".w"表示使用16位的操作数大小。例如:pop.w {r0, r1, r2} 表示从栈顶依次弹出3个16位的值分别存储到寄存器r2、r1和r0中。

str.w: 这是一个ARM指令,与str类似,但".w"表示使用16位的操作数大小。例如:str.w r3, [r4, #8] 表示将寄存器r3中的值存储到以寄存器r4为基地址、偏移量为8的内存位置中。

bne.w: 这是一个ARM指令,与bne类似,但".w"表示使用16位的操作数大小。例如:bne.w loop 表示在条件码寄存器表明最近一次比较的结果不相等时,跳转到标签loop所在的地址执行。

eor: 这是一个ARM指令,表示对两个操作数进行异或运算,并将结果存储到第一个操作数中。例如:eor r1, r2, #0xff 表示将寄存器r2中的值和0xff进行异或运算,然后将结果存储到寄存器r1中。

mla: 这是一个ARM指令,表示将三个操作数进行乘加运算,并将结果存储到第一个操作数中。例如:mla r1, r2, r3, r4 表示计算r2*r3+r4的结果,并将该结果存储到寄存器r1中。

lsls: 这是一个ARM指令,表示将一个操作数向左移动指定数量的位数。它还设置条件码寄存器以表明结果是否小于、等于或大于零。例如:lsls r1, r2, #3 表示将寄存器r2的值向左移动3个位,并将结果存储到寄存器r1中,并设置条件码寄存器以表明结果是否小于、等于或大于零。

adds: 这是一个ARM指令,表示将两个操作数相加,并将结果存储到第一个操作数中。它还设置条件码寄存器以表明结果是否小于、等于或大于零。例如:adds r1, r2, #3 表示将寄存器r2中的值加上3,并将结果存储到寄存器r1中,并设置条件码寄存器以表明结果是否小于、等于或大于零。

movs.w: 这是一个ARM指令,与mov类似,但它会设置条件码寄存器以指示结果是否小于、等于或大于零。".w"表示使用16位的操作数大小。例如:movs.w r1, #10 表示将常量值10传送到寄存器r1中,并设置条件码寄存器以表明结果是否小于、等于或大于零。

itttt: 这是一个ARM指令,与ittt类似,但可以在同一条指令中执行四个条件分支。例如:itttt gt 表示后续指令将只有在条件码寄存器表明最近一次比较的结果大于时才会执行。

bhi: 这是一个ARM指令,表示在无符号数比较中,如果最近一次比较的结果大于时,则将控制流程更改为另一个代码地址处。例如:bhi loop 表示在无符号数比较结果大于时,跳转到标签loop所在的地址执行。

add.w: 这是一个ARM指令,与add类似,但".w"表示使用16位的操作数大小。例如:add.w r1, r2, #3 表示将寄存器r2中的值加上3,然后将结果存储到寄存器r1中。

subs.w: 这是一个ARM指令,与subs类似,但".w"表示使用16位的操作数大小。例如:subs.w r1, r2, #1 表示将寄存器r2中的值减去1,然后将结果存储到寄存器r1中,并设置条件码寄存器以表明结果是否小于、等于或大于零。

b.w: 这是一个ARM指令,与b类似,但指令要求使用16位的操作数大小。例如:b.w loop 表示跳转到标签loop所在的地址执行。

blt: 这是一个ARM指令,表示在有符号数比较中,如果最近一次比较的结果小于时,则将控制流程更改为另一个代码地址处。例如:blt error 表示在有符号数比较结果小于时,跳转到标签error所在的地址执行。

stm.w: 这是一个ARM指令,与stm类似,但".w"表示使用16位的操作数大小。例如:stm.w r0!, {r1, r2, r3} 表示将寄存器r1、r2和r3的值存储到以寄存器r0为基地址的内存位置中,并将寄存器r0的值增加3。

itt: 这是一个ARM指令,与ittt类似,但只能在同一条指令中执行两个条件分支。例如:itt lt 表示后续指令将只有在条件码寄存器表明最近一次比较的结果小于时才会执行。

addw: 这是一个ARM指令,与add类似,但它允许同时对两个操作数进行加法运算,结果存储到第一个操作数中。例如:addw r1, r2, r3 表示将寄存器r2和r3的值相加,然后将结果存储到寄存器r1中。

eors.w: 这是一个ARM指令,与eor类似,但".w"表示使用16位的操作数大小。它对两个操作数进行异或运算,并将结果存储到第一个操作数中。例如:eors.w r1, r2, #0xff 表示将寄存器r2中的值和0xff进行异或运算,然后将结果存储到寄存器r1中。

lsls.w: 这是一个ARM指令,与lsls类似,但".w"表示使用16位的操作数大小。它将一个操作数向左移动指定数量的位数,并将结果存储到另一个操作数中。例如:lsls.w r1, r2, #3 表示将寄存器r2的值向左移动3个位,并将结果存储到寄存器r1中。

eors: 这是一个ARM指令,与eors.w类似,但没有指定操作数的大小。它对两个操作数进行异或运算,并将结果存储到第一个操作数中。例如:eors r1, r2, #0xff 表示将寄存器r2中的值和0xff进行异或运算,然后将结果存储到寄存器r1中。

ldrd: 这是一个ARM指令,与ldr类似,但可以一次性读取64位的数据。例如:ldrd r1, r2, [r3] 表示将以寄存器r3为基地址的内存位置处的64位数据加载到寄存器r1和r2中。

ble: 这是一个ARM指令,表示在有符号数比较中,如果最近一次比较的结果小于或等于时,则将控制流程更改为另一个代码地址处。例如:ble loop 表示在有符号数比较结果小于或等于时,跳转到标签loop所在的地址执行。

movw: 这是一个ARM指令,与mov类似,但可以将一个16位的立即数移动到寄存器中。例如:movw r1, #0x1234 表示将立即数0x1234移动到寄存器r1中。

mul: 这是一个ARM指令,表示将两个操作数进行乘法运算,并将结果存储到第一个操作数中。例如:mul r1, r2, r3 表示计算r2*r3的结果,并将该结果存储到寄存器r1中。

asrs: 这是一个ARM指令,与asr类似,但它会设置条件码寄存器以指示结果是否小于、等于或大于零。它可将一个操作数向右移动指定数量的位数,用符号位填充左侧空缺的位。例如:asrs r1, r2, #3 表示将寄存器r2的值向右移动3个位,并用符号位填充左侧空缺的位,并将结果存储到寄存器r1中,并设置条件码寄存器以表明结果是否小于、等于或大于零。

ands: 这是一个ARM指令,与and类似,但对两个操作数进行按位与运算,并将结果存储到第一个操作数中。例如:ands r1, r2, #0xff 表示将寄存器r2中的值和0xff进行按位与运算,然后将结果存储到寄存器r1中。

and.w: 这是一个ARM指令,与and类似,但".w"表示使用16位的操作数大小。例如:and.w r1, r2, #0xff 表示将寄存器r2中的值和0

blt.w: 如果上一次比较结果小于零,则无条件跳转到目标地址。例如:blt.w 0x8000
rsb: 将第二个操作数从第一个操作数中减去,并将结果存储在目标寄存器中。例如:rsb r0, r1, #2
orr.w: 对两个操作数执行按位逻辑或运算,并将结果存储在目标寄存器中。例如:orr.w r0, r1, #0xFF
bls: 如果上一次比较结果小于或等于零,则无条件跳转到目标地址。例如:bls 0x9000
smmul: 执行有符号的16位乘法,将结果存储在目标寄存器中。例如:smmul r0, r1, r2
mls: 执行有符号的32位乘法并减去第三个操作数,将结果存储在目标寄存器中。例如:mls r0, r1, r2, r3
asr.w: 对第一个操作数进行算术右移,位移数由第二个操作数指定,并将结果存储在目标寄存器中。例如:asr.w r0, r1, #4
bge: 如果上一次比较结果大于或等于零,则无条件跳转到目标地址。例如:bge 0xA000
bhs: 如果上一次比较结果大于或等于零,则无条件跳转到目标地址。例如:bhs 0xB000
orr: 对两个操作数执行按位逻辑或运算,并将结果存储在目标寄存器中。例如:orr r0, r1, #0xFF

eor.w:执行操作数之间的按位异或运算,并将结果存储在目标寄存器中。".w"表示使用16位操作数大小。例如:eor.w r0, r1, #0x12,将r1和0x12进行按位异或操作,结果存储在r0中。

orrs:执行两个操作数之间的按位逻辑或运算,并根据结果设置条件码。条件码用于后续分支指令的条件判断。例如:orrs r0, r1, #0x3F,将r1和0x3F进行按位或操作,根据结果设置条件码。

and:执行两个操作数之间的按位与运算,并将结果存储在目标寄存器中。例如:and r0, r1, #0xFF,将r1和0xFF进行按位与操作,结果存储在r0中。

bic:对第一个操作数执行与第二个操作数的按位补码运算,并将结果存储在目标寄存器中。例如:bic r0, r1, #0x8,将r1和0x8进行按位补码操作,结果取反后再存储在r0中。

sub.w:将第二个操作数从第一个操作数中减去,并将结果存储在目标寄存器中。".w"表示使用16位操作数大小。例如:sub.w r0, r1, #0x2,将r1减去0x2,结果存储在r0中。

blo:如果上一次比较结果小于零(表示目标地址在当前指令之前),则跳转到目标地址执行。例如:blo label,如果上一次比较结果小于零,则跳转到label处执行。

ldrb.w:从内存中读取单个字节(8位)的数据,并将其存储在目标寄存器中。".w"表示使用16位操作数大小。例如:ldrb.w r0, [r1, #4],将地址为r1+4处的单个字节读取并存储在r0中。

strb.w:将一个寄存器中的单个字节(8位)的数据写入内存。".w"表示使用16位操作数大小。例如:strb.w r0, [r1, #4],将r0中的单个字节写入地址为r1+4的内存位置。

uxtab:用于将两个无符号数相加,并将结果存储回一个寄存器中。这个指令的特点是它会将一个寄存器中的值和另一个寄存器中的值相加,其中第二个寄存器的值作为一个位偏移量来进行操作,从而得到一个地址,然后将这个地址中的两个字节无符号数相加,结果存储回第一个寄存器中。这个指令通常用于对像素数据等16位无符号数的操作。例如:uxtab r0, r1, r2,r0=r1+r2。 

uxtb:将一个操作数的低8位扩展为32位,并将结果存储在目标寄存器中。例如:uxtb r0, r1,将r1的低8位复制到r0的低8位,并将其扩展为32位。

orn:执行按位或运算并取反操作,将第二个操作数和第一个操作数中的位进行逐位运算,如果结果为0,则将目标寄存器设置为1,否则为0。例如:orn r0, r1, #0x3F,将r1和0x3F按位或运算,并对结果取反,然后将其存储在r0中。

umull:执行无符号的32位乘法,并将结果存储在两个目标寄存器中。例如:umull r0, r1, r2, r3,将r2和r3视为无符号数相乘,将结果存储在r1:r0中。

lsrs:将第一个操作数向右移动指定数量的位数,用零填充左侧空缺的位,并将结果存储在另一个操作数中。例如:lsrs r0, r1, #4,将r1的值向右移动四位,用零填充左侧空缺的位,并将结果存储在r0中。

ldm.w:从内存中读取一组寄存器的值,并将它们存储在连续的目标寄存器中。".w"表示使用16位操作数大小。例如:ldm.w r0, {r1-r4},将内存中r0寄存器的值读取出来,并存储在r1到r4中。

ite:条件代码块,根据条件码设置选择执行一组指令或另一组指令。例如:ite eq,如果前一个比较结果等于零,则会执行紧随其后的一组指令;否则,将跳过这些指令。

stm:将一组寄存器的值存储到内存中,并使用递增或递减的方式更新基地址寄存器。例如:stm r0!, {r1-r3},将r1到r3中的值存储到地址为r0的内存位置,并将r0递增以指向下一个内存位置。

rsbs.w:将第二个操作数从第一个操作数中减去,并将结果的负数存储在目标寄存器中。".w"表示使用16位操作数大小。例如:rsbs.w r0, r1, #5,将5从r1中减去的结果取反,并将其存储在r0中。

sbcs.w:执行第一个操作数和第二个操作数之间的按位逻辑加运算,并考虑上一次比较的结果。".w"表示使用16位操作数大小。例如:sbcs.w r0, r1, #0x3F,将r1和0x3F进行求和,再考虑上一次比较的结果。

ldrh:从内存中读取一个半字(16位)的数据,并将其存储在目标寄存器中。例如:ldrh r0, [r1, #4],将地址为r1+4处的一个半字读取出来,并存储在r0中。

ldrsh.w:从内存中读取有符号半字(16位)的数据并将其扩展为32位,并将结果存储在目标寄存器中。".w"表示使用16位操作数大小。例如:ldrsh.w r0, [r1, #2],将地址为r1+2处的有符号半字读取出来,并将其扩展为32位后存储在r0中。

uxth.w:将一个操作数的低16位扩展为32位,并将结果存储在目标寄存器中。".w"表示使用16位操作数大小。例如:uxth.w r0, r1,将r1的低16位复制到r0的低16位,并将其扩展为32位。

uxth:将一个操作数的低16位扩展为32位,并将结果存储在目标寄存器中。例如:uxth r0, r1,将r1的低16位复制到r0的低16位,并将其扩展为32位。

vpush:将一组向量寄存器的值从高地址向低地址压入堆栈。例如:vpush {d8-d15},将d8到d15的值从高地址向低地址压入堆栈。

vldr:从内存中读取向量寄存器的值,并将其加载到指定向量寄存器中。例如:vldr d0, [r1],将r1指向的内存地址中的值加载到向量寄存器d0中。

mvn:对一个操作数执行按位取反操作,并将结果存储在目标寄存器中。例如:mvn r0, r1,将r1的所有位取反后,将结果存储在r0中。

vmov:将一个向量寄存器中的值复制到另一个向量寄存器中。例如:vmov d0, d1,将d1的值复制到d0中。

muls:执行有符号16位乘法,并将结果存储在目标寄存器中。例如:muls r0, r1, r2,将r1和r2作为有符号数相乘,将结果存储在r0中。

vstr:将向量寄存器的值存储到内存中。例如:vstr d0, [r1],将向量寄存器d0中的值存储到r1指向的内存地址中。

vpop:从堆栈中弹出一组向量寄存器的值,并将它们加载到相应的向量寄存器中。例如:vpop {d8-d15},从堆栈中弹出d8到d15的值,并将它们加载到相应的向量寄存器中。

tbb:使用一个操作数中的索引值获取查找表中的一个字节,并跳转到该字节所对应的地址。例如:tbb [r0, r1],将r0和r1相加作为索引,在地址中查找对应的字节,并跳转到该字节所对应的地址。

strh:将一个半字(16位)的数据写入内存中。例如:strh r0, [r1, #4],将r0的值作为一个半字写入地址为r1+4的内存位置。

vmrs:将状态寄存器中的值加载到通用寄存器中。例如:vmrs r0, fpscr,将浮点状态寄存器fpscr中的值加载到通用寄存器r0中。

tst.w:执行两个操作数之间的按位与运算,并根据结果设置条件码。条件码用于后续分支指令的条件判断。".w"表示使用16位操作数大小。例如:tst.w r0, #0x3F,将r0和0x3F进行按位与操作,根据结果设置条件码。

bmi:如果前一次比较结果为负数,则跳转到目标地址执行。例如:bmi label,如果前一次比较结果为负数,则跳转到label处执行。

lsr.w:将第一个操作数向右移动指定数量的位数,并将结果存储在另一个操作数中。".w"表示使用16位操作数大小。例如:lsr.w r0, r1, #2,将r1的值向右移动两位,并将结果存储在r0中。

sbfx:选取一个操作数中的一段位,并将其存储在目标寄存器中。例如:sbfx r0, r1, #4, #6,从r1中选择位4到位9之间的部分,并将其存储在r0中。

ubfx:选取一个操作数中的一段位,并将其无符号地扩展为32位,并将结果存储在目标寄存器中。例如:ubfx r0, r1, #4, #6,从r1中选择位4到位9之间的部分,并将其扩展为32位后存储在r0中。

subw:将第二个操作数从第一个操作数中减去,并将结果存储在目标寄存器中。".w"表示使用16位操作数大小。例如:subw r0, r1, #2,将r1减去0x2,结果存储在r0中。

rsb.w:将第一个操作数从第二个操作数中减去,并将结果的负数存储在目标寄存器中。".w"表示使用16位操作数大小。例如:rsb.w r0, r1, #5,将r1减去5的结果取反,并将其存储在r0中。

sbc:执行第一个操作数减去第二个操作数再减去上一次比较结果中的进位值(carry),并将结果存储在目标寄存器中。例如:sbc r0, r1, r2,将r1和r2相减,再减去上一次比较结果中的进位值,结果存储在r0中。

dmb:确保在所有内存访问之前和之后对其进行屏障同步处理。例如:dmb,确保在这个指令之前和之后的所有内存访问都已经完成。

ldrex:加载一个单一数据元素,并设置一个锁定位以防止其他核心修改该数据元素。例如:ldrex r0, [r1],从内存地址r1中加载一个单一数据元素,并在读取时设置一个锁定位,以防止其他核心修改该数据元素。

strex:将一个单一数据元素写入内存地址,并清除标志位以表明数据元素不再被锁定。例如:strex r0, r1, [r2],将r1的值写入内存地址r2,并清除锁定标志位,表明该数据元素不再被锁定。

blo.w:如果前一个比较结果为负数或零,则跳转到目标地址执行。".w"表示使用16位操作数大小。例如:blo.w label,如果前一个比较结果为负数或零,则跳转到label处执行。

bhi.w:如果前一个比较结果为无符号高于,则跳转到目标地址执行。".w"表示使用16位操作数大小。例如:bhi.w label,如果前一个比较结果为无符号高于,则跳转到label处执行。

tbh:使用一个操作数中的索引值获取查找表中的一个半字,并跳转到该半字所对应的地址。例如:tbh [r0, r1, lsl #1],将r0和r1左移一位后相加作为索引,在查找表中查找对应的半字并跳转到其所在的地址。

bls.w:如果前一个比较结果为负数、零或者无符号低于,则跳转到目标地址执行。".w"表示使用16位操作数大小。例如:bls.w label,如果前一个比较结果为负数、零或者无符号低于,则跳转到label处执行。

bics:将第二个操作数按位取反,并与第一个操作数进行按位与运算,将结果存储在目标寄存器中。例如:bics r0, r1, #0x3F,将0x3F按位取反后,与r1进行按位与运算,结果存储在r0中。

sxth:将一个操作数的低16位扩展为有符号的32位,并将结果存储在目标寄存器中。例如:sxth r0, r1,将r1的低16位复制到r0的低16位,并将其扩展为有符号的32位。

bge.w:如果前一个比较结果大于等于零,则跳转到目标地址执行。".w"表示使用16位操作数大小。例如:bge.w label,如果前一个比较结果大于等于零,则跳转到label处执行。

bgt.w:如果前一个比较结果大于零,则跳转到目标地址执行。".w"表示使用16位操作数大小。例如:bgt.w label,如果前一个比较结果大于零,则跳转到label处执行。

ror.w:将第一个操作数向右旋转指定数量的位数,并将结果存储在另一个操作数中。".w"表示使用16位操作数大小。例如:ror.w r0, r1, #4,将r1的值向右旋转4位,并将结果存储在r0中。

adc.w:执行第一个操作数加上第二个操作数再加上上一次比较结果中的进位值(carry),并将结果存储在目标寄存器中。".w"表示使用16位操作数大小。例如:adc.w r0, r1, r2,将r1和r2相加,再加上上一次比较结果中的进位值,结果存储在r0中。

bhs.w:如果前一个比较结果无符号大于等于,则跳转到目标地址执行。".w"表示使用16位操作数大小。例如:bhs.w label,如果前一个比较结果无符号大于等于,则跳转到label处执行。

pkhbt:从两个操作数中选择一个指定数量的字节,并将它们交替存储在目标寄存器中。例如:pkhbt r0, r1, r2,从r1和r2中选择4个字节,并将这些字节交替存储在r0中。

adcs:执行第一个操作数加上第二个操作数再加上上一次比较结果中的进位值(carry),并将结果和进位值都存储在目标寄存器中。例如:adcs r0, r1, r2,将r1和r2相加,再加上上一次比较结果中的进位值,结果和新的进位值都存储在r0中。

sbcs:执行第一个操作数减去第二个操作数再减去上一次比较结果中的进位值(carry),并将结果和借位值都存储在目标寄存器中。例如:sbcs r0, r1, r2,将r1和r2相减,再减去上一次比较结果中的进位值,结果和新的借位值都存储在r0中。

adc:执行第一个操作数加上第二个操作数再加上上一次比较结果中的进位值(carry),并将结果存储在目标寄存器中。例如:adc r0, r1, r2,将r1和r2相加,再加上上一次比较结果中的进位值,结果存储在r0中。

ble.w:如果前一个比较结果小于等于零,则跳转到目标地址执行。".w"表示使用16位操作数大小。例如:ble.w label,如果前一个比较结果小于等于零,则跳转到label处执行。

bfi:将一个操作数的一段位插入到另一个操作数的指定位置,并将结果存储在目标寄存器中。例如:bfi r0, r1, #4, #6,将r1中位4到位9之间的部分插入到r0的位4到位9之间的位置。

cmn.w:执行第一个操作数加上第二个操作数,但不改变任何操作数的值,根据结果设置条件码。".w"表示使用16位操作数大小。例如:cmn.w r0, r1,执行r0和r1相加,但不改变它们的值,根据结果设置条件码。

lsr:将第一个操作数向右移动指定数量的位数,并将结果存储在另一个操作数中。例如:lsr r0, r1, #2,将r1的值向右移动两位,并将结果存储在r0中。

lsl:将第一个操作数向左移动指定数量的位数,并将结果存储在另一个操作数中。例如:lsl r0, r1, #4,将r1的值向左移动4位,并将结果存储在r0中。

movge:如果前一个比较结果大于等于零,则将第二个操作数的值复制到目标寄存器中。例如:movge r0, r1,如果前一个比较结果大于等于零,则将r1的值复制到r0中。

ldrh.w:从内存中加载一个半字(16位),并将其存储在目标寄存器中。".w"表示使用16位操作数大小。例如:ldrh.w r0, [r1, #4],从地址为r1+4的内存位置加载一个半字,并将其存储在r0中。

bic.w:对第一个操作数进行按位取反,并与第二个操作数进行按位与运算,将结果存储在目标寄存器中。".w"表示使用16位操作数大小。例如:bic.w r0, r1, #0x3F,将0x3F按位取反后,与r1进行按位与运算,结果存储在r0中。

sbc.w:执行第一个操作数减去第二个操作数再减去上一次比较结果中的进位值(carry),并将结果存储在目标寄存器中。".w"表示使用16位操作数大小。例如:sbc.w r0, r1, r2,将r1和r2相减,再减去上一次比较结果中的进位值,结果存储在r0中。

orrs.w:对两个操作数进行按位或运算,并根据结果设置条件码。".w"表示使用16位操作数大小。例如:orrs.w r0, r1, r2,对r1和r2进行按位或运算,并根据结果设置条件码。

rsbs:将第一个操作数设置为零,并减去第二个操作数的值,并将结果存储在目标寄存器中。例如:rsbs r0, r1, #10,将r1的值减去10,并将结果存储在r0中。

tst:对两个操作数进行按位与运算,并根据结果设置条件码。例如:tst r0, r1,对r0和r1进行按位与运算,并根据结果设置条件码。

ldm:从堆栈或内存中加载多个寄存器的值。例如:ldm r13!, {r0, r1, r2},从堆栈中加载r0、r1和r2的值,并将栈指针增加12个字节(3*4)。

sxtb:将一个操作数的低8位符号扩展为有符号的32位,并将结果存储在目标寄存器中。例如:sxtb r0, r1,将r1的低8位复制到r0的低8位,并将其扩展为有符号的32位。

rev:反转一个操作数的字节顺序,并将结果存储在目标寄存器中。例如:rev r0, r1,将r1中的字节顺序反转,并将结果存储在r0中。

uxtb.w:将一个操作数的低8位无符号扩展为32位,并将结果存储在目标寄存器中。".w"表示使用16位操作数大小。例如:uxtb.w r0, r1,将r1的低8位复制到r0的低8位,并将其无符号扩展为32位。

ldrsb:从内存中加载一个字节,并将其符号扩展为32位有符号整数形式,然后将结果存储在目标寄存器中。例如:ldrsb r0, [r1],从地址为r1的内存位置加载一个字节,并将其符号扩展为32位有符号整数形式,然后将结果存储在r0中。

sxtb.w:这是一个符号扩展指令,将一个八位寄存器中的值符号扩展为32位,并存储到目标寄存器中。
例子:sxtb.w r0, r1

这个例子将r1寄存器中的值符号扩展为32位,并将结果存储在r0寄存器中。

ldrsb.w:这是一个带符号扩展的字节加载指令,从指定地址中读取一个字节,并将其符号扩展为32位并存储到目标寄存器中。
例子:ldrsb.w r0, [r1, #2]

这个例子从r1 + 2所指向的地址中读取一个字节,并将其符号扩展为32位,并将结果存储在r0寄存器中。

itee:这是一个条件代码块指令,它用于执行多个操作,根据条件来选择哪个操作。这个指令可以对任意数量的操作进行嵌套。
例子:

itee ne
    add r0, r1, r2
    sub r1, r2, r3
这个例子如果条件码不等于,则会执行add指令;否则,将执行sub指令。

bxeq:这是一个分支和交换指令,它用于将当前处理器模式更改为跳转到的子程序所在的代码段,并返回一个结果寄存器值。
例子:bxeq lr

这个例子将使用链接寄存器lr中的地址跳转到子程序中,并返回结果寄存器值。

moveq:这是一个条件移动指令,如果条件码等于,则将源寄存器的值移动到目标寄存器中。
例子:moveq r0, r1

这个例子当条件码等于时,将r1寄存器中的值移动到r0寄存器中。

movne:这是一个条件移动指令,如果条件码不等于,则将源寄存器的值移动到目标寄存器中。
例子:movne r0, r1

这个例子当条件码不等于时,将r1寄存器中的值移动到r0寄存器中。

clz:这是一个计算前导零位数的指令,它可以用于计算一个32位整数的二进制表示中前导的零位数量。
例子:clz r0, r1

这个例子将在r1寄存器中的值中计算前导零位数,并将结果存储在r0寄存器中。

bfc:这是一个位字段清零指令,它用于清除指定范围内的位。
例子:bfc r0, #8, #16

这个例子将清除r0寄存器中从第8位到第23位的位。

subhs:这是一个带条件的减法指令,它会将寄存器中的值与另一个操作数进行减法运算,并根据条件码添加结果。
例子:subhs r0, r1, #64

这个例子将r1寄存器中的值减去64,并将结果添加到条件码中。只有当前状态为大于或等于时才执行。

orrhs:这是一个按位或运算,将寄存器中的值与另一个操作数进行按位或运算,并将结果存储在目标寄存器中。在条件码为HS(大于或等于)时执行。
例子:orrhs r0, r1, #0xff

这个例子将r1寄存器中的值和0xff进行按位或运算,并将结果存储在r0寄存器中。只有当前状态为大于或等于时才会执行。

lsrsne:这是一个逻辑右移运算,将寄存器中的值向右移动指定数量的位数,并将结果存储在目标寄存器中。在条件码为NE(不等于)时执行。
例子:lsrsne r0, r1, #3

这个例子将r1寄存器中的值向右移动3位,并将结果存储在r0寄存器中。只有当前状态不等于时才会执行。

lsrne:这是一个逻辑右移运算,将寄存器中的值向右移动指定数量的位数,并将结果存储在目标寄存器中。在条件码为NE(不等于)时执行。
例子:lsrne r0, r1, r2

这个例子将r1寄存器中的值向右移动r2寄存器中的值所指定的位数,并将结果存储在r0寄存器中。只有当前状态不等于时才会执行。

strh.w:这是一个半字(16位)存储指令,它将一个寄存器中的值存储到指定地址的内存中,并使用半字大小的数据进行存储。在执行后,存储地址会自动递增2个字节以指向下一个要写入的位置。
例子:strh.w r1, [sp, #4]

这个例子将r1寄存器中的值以半字大小写入sp寄存器中存储的地址+4的内存位置。

rev.w:这是一个反转字节顺序指令,它将一个寄存器中的值按字节反转并存储回目标寄存器中。
例子:rev.w r0, r1

这个例子将r1寄存器中的值按字节反转,并将结果存储到r0寄存器中。

asr:这是一个算术右移指令,将寄存器中的值向右移动指定数量的位数,并根据符号位进行填充。
例子:asr r0, r1, #4

这个例子将r1寄存器中的值向右移动4位,并根据符号位进行填充,然后将结果存储在r0寄存器中。

svc:这是一个指令,用于触发操作系统的服务调用。它会将当前CPU模式切换为特权模式,并执行特定的中断程序来处理服务请求。
例子:svc #0

这个例子将触发操作系统中断服务0来完成相应的操作。

cmn:这是一个比较并加法指令,将寄存器中的值与另一个操作数进行比较,并将结果添加到条件码中。
例子:cmn r1, #0xff

这个例子将r1寄存器中的值与0xff进行比较,并将结果添加到条件码中。

bxls:这是一个无条件分支指令,它用于从当前程序位置跳转到另一个指令地址。
例子:bxls lr

这个例子将跳转到链接寄存器lr所指向的

asrge:这是一个算术右移指令,它将寄存器中的值向右移动指定数量的位数,并根据符号位进行填充。在条件码为GE(大于等于)时执行。
例子:asrge r0, r1, #4

这个例子将r1寄存器中的值向右移动4位,并根据符号位进行填充,然后将结果存储在r0寄存器中。只有当前状态大于等于时才会执行。

ldrsh:这是一个带符号扩展的半字加载指令,从指定地址中读取一个半字,并将其符号扩展为32位并存储到目标寄存器中。
例子:ldrsh r0, [r1, #2]

这个例子从r1 + 2所指向的地址中读取一个半字,并将其符号扩展为32位,并将结果存储在r0寄存器中。

sxtah:这是一个有符号扩展的半字合并指令,它将两个半字值合并成一个32位有符号整数,并将结果存储在目标寄存器中。
例子:sxtah r0, r1, r2

这个例子将r1和r2寄存器中的半字值合并成一个32位有符号整数,并将结果存储在r0寄存器中。

itte:这是一个条件代码块指令,它用于执行多个操作,根据条件来选择哪个操作。这个指令可以对任意数量的操作进行嵌套。
例子:

itte eq
    add r0, r1, r2
    sub r1, r2, r3
这个例子如果条件码等于,则会执行add指令;否则,将执行sub指令。

mvns:这是一个按位取反并移位指令,它将寄存器中的值进行按位取反后再向左移动指定位数的位数,然后将结果存储到目标寄存器中。
例子:mvns r0, r1, lsl #8

这个例子将r1寄存器中的值进行按位取反后左移8位,然后将结果存储在r0寄存器中。

rsbmi:这是一个带条件的反向减法指令,它将另一个操作数减去寄存器中的值,并根据条件码添加结果。在条件码为MI(负数)时执行。
例子:rsbmi r0, r1, #64

这个例子将64减去r1寄存器中的值,并将结果添加到条件码中。只有当前状态为负数时才执行。

movlo:这是一个条件移动指令,如果条件码低于(无符号小于)则将源寄存器的值移动到目标寄存器中。
例子:movlo r0, r1

这个例子当条件码低于时,将r1寄存器中的值移动到r0寄存器中。

asreq:这是一个算术右移指令,它将寄存器中的值向右移动指定数量的位数,并根据符号位进行填充。在条件码为EQ(等于)时执行。
例子:asreq r0, r1, #4

这个例子将r1寄存器中的值向右移动4位,并根据符号位进行填充,然后将结果存储在r0寄存器中。只有当前状态为等于时才会执行。

orreq:这是一个按位或逻辑操作指令,它将两个寄存器中的值进行按位或操作,并将结果存储在目标寄存器中。该指令只在条件码为EQ(等于)时执行。

示例:

orreq r0, r1, r2
这个示例将r1和r2寄存器中的值进行按位或操作,并将结果存储在r0寄存器中。只有当前状态为等于时才会执行。例如,如果r1 = 0b11001100,r2 = 0b10101010,则r0将包含0b11101110。
 

ARM指令中的IT(If-Then)语句是一种条件执行指令,其中包含一个或多个条件码,指示根据条件执行下面的一项或多项指令。而GE表示"greater than or equal to",当标志位N为0(结果为正数或零)或者Z为1(结果为0)时被激活。

在IT GE语句中,如果满足条件,则执行下一个指令,否则跳过下一个指令。例如:

CMP R1, R2  ;比较R1和R2
IT GE      ;如果R1大于等于R2,则执行下一个指令
ADDGE R3, R4, #1  ;如果条件成立,则将R4和立即数#1相加并存储到R3中

这段代码首先使用CMP指令来比较寄存器R1和R2的值,然后使用IT GE指令检查是否满足“R1大于等于R2”的条件,如果成立,则执行下一个指令ADDGE;否则跳过该指令。ADDGE指令会将寄存器R4和立即数#1相加,并将结果存储到寄存器R3中。

因此,IT GE语句可以帮助程序员优化代码,减少分支指令的使用,在ARM处理器上提高程序的执行效率。

ARM指令集中的ITT(If-Then-Else)指令是一种条件执行指令,它允许程序员根据条件选择性地执行一组指令。ITT指令有多种形式,其中"ITT Hi"指令是其中之一。它的作用是在处理器中设置一个条件执行的块,该块包含在if-then-else语句中的then分支。

具体来说,"ITT Hi"指令根据寄存器中的条件码(CPSR标志寄存器)的状态来决定是否执行接下来的指令块。如果条件码满足条件,则执行块中的指令,否则跳过该块。

下面是一个简单的示例,展示了如何使用ITT Hi指令:

 
 CMP r0, #0         ;比较r0寄存器中的值是否为0
    ITT Hi             ;如果条件码指示r0大于0,则执行下面的指令块
    ADDGT r1, r2, #1   ;如果r0>0,则将r2的值加1,然后将结果存储到r1中
    SUBLE r1, r2, #1   ;否则将r2的值减1,然后将结果存储到r1中

在这个示例中,首先使用CMP指令比较r0的值是否为0。然后,使用ITT Hi指令设置了一个条件执行块,该块包含两个指令ADDGT和SUBLE。如果r0>0,则执行ADDGT指令,否则执行SUBLE指令。这个示例演示了如何使用ITT Hi指令来根据条件执行不同的指令块。文章来源地址https://www.toymoban.com/news/detail-462193.html

到了这里,关于arm 32 常见汇编指令解释的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ARM64 常见汇编指令学习 12 -- ARM 汇编函数 的学习】

    上篇文章:ARM64 常见汇编指令学习 11 – ARM 汇编宏 .macro 的学习 下篇文章:ARM64 常见汇编指令学习 13 – ARM 汇编 ORG 伪指令学习 ARM汇编中的函数定义并不像高级语言那样有特定的语法,但通常可以通过 标签(label) 和 子程序调用指令 (如BL,BLX) 来实现类似于函数的功能。 例如

    2024年02月14日
    浏览(49)
  • 【ARM64 常见汇编指令学习 14 -- ARM 汇编 .balign,.balignw,.balign 伪指令学习】

    上篇文章:ARM64 常见汇编指令学习 13 – ARM 汇编 ORG 伪指令学习 下篇文章:ARM64 常见汇编指令学习 15 – ARM 标志位的学习 .balignl 是一个伪操作符,伪操作符的意思就是机器码里,并没有一个汇编指令与其对应,是编译器来实现其功能的。. balignl 是 .balign 的变体。 .balignl 完整

    2024年02月14日
    浏览(47)
  • 【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】

    上篇文章:ARM64 常见汇编指令学习 15 – ARM64 标志位的学习 下篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令 在ARMv8架构中,同步异常主要包括以下几种: Undefined Instruction :未定义指令异常,当处理器尝试执行一条未定义的指令时会触发。 Supervisor Call (SVC) :这是一种特殊

    2024年02月13日
    浏览(49)
  • ARM64 常见汇编指令学习 11 -- ARM 汇编宏 .macro 的学习

    下篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 上篇文章:ARM64 常见汇编指令学习 10 – 无符号位域提取指令 BFXIL 在 ARM 汇编中,“ .macro ” 是用来定义一个宏的指令。宏可以看作是一个可以在汇编程序中重用的代码段。当调用宏时,汇编器会将宏的内容插入到调

    2024年02月14日
    浏览(47)
  • 【理解ARM架构】不同方式点灯 | ARM架构简介 | 常见汇编指令 | C与汇编

    🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言: 你只管努力,剩下的交给时间! 在学习C语言的时候,我们会写个 Hello World 程序来入门,当我们写ARM程序,也该有一个简单的程序引领我们入门,这个程序就是点亮LED。 查看原理图,确定控制LED的引脚: 如上图是

    2024年02月05日
    浏览(48)
  • 【ARM64 常见汇编指令学习 20 -- ARM 指令 .include与 .asciz 详细介绍】

    在 ARM 汇编语言中, .include 命令用于插入另一个源文件的内容。它的作用类似于 C 语言中的 #include 预处理命令。这个命令通常在源文件的顶部使用,但也可以在任何地方使用。 语法如下: 这里的 \\\"filename\\\" 是你想要包含的文件名。这个文件名可以是绝对路径,也可以是相对于

    2024年02月11日
    浏览(57)
  • 【ARM 常见汇编指令学习 2 -- 存储指令 STP 与 LDP】

    上篇文章:ARM 常见汇编指令学习 1 – 跳转指令 BL 与 BLR 区别 下篇文章:ARM 常见汇编指令学习 3 – ARM64 无符号位域提取指令 UBFX 在 ARMv8 架构中,STP指令用于将两个通用寄存器的值存储到内存中。STP指令的语法如下: 或 其中: Wt1 和 Wt2 表示两个要存储的32位通用寄存器, Xt

    2024年02月09日
    浏览(44)
  • 【ARM 常见汇编指令学习 3 -- ARM64 无符号位域提取指令 UBFX】

    上篇文章:ARM 常见汇编指令学习 2 – 存储指令 STP 与 LDP 下篇文章:ARM 常见汇编指令学习 4 – ARM64 比较指令 cbnz 与 b.ne 区别 在代码中如何监控寄存器的某1bit, 或者某几bit ? ARM 提供了一个汇编指令:UBFX 就可以用于该功能。 UBFX 有2种语法分别是对32bit 寄存器和64bit寄存器。

    2024年02月15日
    浏览(39)
  • ARM 常见汇编指令学习 9 - 缓存管理指令 DC 与 IC

    上篇文章:ARM 常见汇编指令学习 8 - dsb sy 指令及 dsb 参数介绍 AArch64指令集中有两条关于缓存维护(cache maintenance)的指令,分别是IC和DC。 IC 是用于 指令缓存 操作; DC 是用于 数据缓存 操作。 IC 和DC指令都属于系统指令(system instruction), 系统指令 还包括 AT,BRB,CFP,CP

    2024年02月14日
    浏览(51)
  • 【ARM64 常见汇编指令学习 21 -- ARM RET 与 ERET】

    请阅读 【嵌入式开发学习必备专栏 】 在 ARMv8 架构中, RET 指令用于从函数或者过程返回。它主要负责从当前过程跳转回调用者,并恢复调用者的程序计数器 (PC) 的值。 语法: Xn 是一个可选的寄存器,通常为 X30 (也称为 LR ,链接寄存器),其中包含返回地址。如果没有指

    2024年04月10日
    浏览(168)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包