arm 汇编指令
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arm 汇编指令相关的知识,希望对你有一定的参考价值。
参考技术A 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 <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
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
c语言转化为arm汇编指令
If(a==0||b==1) c=d+e
(2) if ((a= = b)&&(c= = d))&&(e= =f) g++;
你可以用编译器编译一下,然后调试看下汇编代码的。。。追问
不是arm的
追答用ADS1.2,armgcc,不就得了
本回答被提问者和网友采纳 参考技术B 1.汇编程序访问C语言全局变量全局变量只能通过地址间接调用,为了访问C语言中全局变量,首先要通过extern伪指令引入全局变量,然后将其地址装入寄存器中。
对于unsigned char类型,使用LDRB/STRB访问;
对于unsigned short类型,使用LDRH/STRH访问;
对于unsigned int类型,使用LDR/STR访问;
对于char类型,使用LDRSB/STRSB访问;
对于short类型,使用LDRSH/STRSH访问;
例子:
.text
.global asmsubroutine
.extern globvar
asmsubroutine:
LDR R1,=globvar
LDR R0,[R1]
ADD R0,R0,#2
STR R0,[R1]
MOV PC,LR
.end
2.C程序调用汇编程序
C程序调用汇编程序首先通过extern声明要调用的汇编程序模块,声明中形参个数要与汇编程序模块中需要的变量个数一致,且参数传递要满足ATPCS规则,然后在C程序中调用。
例子:
#include<stdio.h>
extern void *strcopy(char*d,char*s);//模块声明
int main()
char*srcstr="first";
char*dststr="second";
strcopy(dststr,srcstr);//汇编模块调用;
.text
.global strcopy
Strcopy:
LDRB R2,[R1],#1
STRB R2,[R0],#1
CMP R2,#0
BNE Sstcopy
MOV PC,LR
.end
汇编程序调用C程序
在调用之前必须根据C语言模块中需要的参数个数,以及ATPCS参数规则,完成参数传递,即前四个参数通过R0-R3传递,后面的参数通过堆栈传递,然后再利用B、BL指令调用。
例子:
int g(int a,int b,int c,int d,int e)//C语言函数原型
return(a+b+c+d+e);
汇编语言完成是求i+2i+3i+4i+5i的结果;
.global _start
.text
_start:
.extern g ;引入c程序
STR LR,SP,-#4!;保存PC
ADD R1,R0,R0
ADD R2,R1,R0
ADD R3,R1,R2
STR R3,SP,#-4!
ADD R3,R1,R1
BL g ;调用C函数g
ADD SP,SP,#4
LDR PC,[SP],#4
.end
return(0);
以上是关于arm 汇编指令的主要内容,如果未能解决你的问题,请参考以下文章