arm64指令小记(代码片段)

FarmGuo FarmGuo     2023-03-18     263

关键词:

1 状态寄存器CPSR

ARM64下,该寄存器为32位,高4位N、Z、C、V均为条件码标志位。
SUBS和ADDS影响CPSR,而SUB和ADD则不影响

2 TEST

属于逻辑运算指令,做与操作,结果影响CPSR
如果与运算结果为0那么Z标志位为1,反之为0
Test用来测试一个位,例如寄存器
test eax, 100b; b后缀意为二进制
jnz **; 如果eax右数第三个位为1,jnz将会跳转

3 CMP

属于算术运算指令,做减法,但与SUB指令不同的是SUB指令执行过以后,原来寄存器中的被减数丢了,被换成了减法的结果,CMP指令执行过以后,被减数、减数都保持原样不变。
CMP指令影响CPSR
当比较结果为0时,即相等,Z位置1。
arm下的条件跳转
表达式 英文 中文
bl.eq equal 等于
bl.ne not equal 不等于
bl.gt greater than 大于
bl.ge greater equal 大于等于
bl.lt less than 小于
bl.le less equal 小于等于

x86下的跳转
je equal 等于
jne not equal 不等于
jg greater 大于
jge greater equal 大于等于
jl less 小于
jle less equal 小于等于

call 为x86的跳转指令
bl 为arm的跳转指令

其他

adrp 指令,将pc低12位清零,然后将立即数左移12位进行相加
adrp x8, 10,此时pc 0x00000001026c4478
x8 = 0x00000001026c4000 + 0xa000 = 0x00000001026ce000

在第一次由adrp取得页的基址(也就是lable,此例中10),然后再加上在页内的偏移,获取最终值。

br Xm:跳转到由Xm目标寄存器指定的地址处。
blr Xm:跳转到由Xm目标寄存器指定的地址处,同时将下一条指令存放到X30(lr)寄存器中。例如:blr x20,跳转后,即lr存放着blr x20的下一条指令。
b label,跳转到标签(内部或外部,外部指的是C函数)。
bl label,跳转到标签(内部或外部,外部指的是C函数),同时将下一条指令存放到X30(lr)寄存器中。

__asm volatile ("br x8\\n");

void mytest(int a, int b) 
    

__asm volatile ("bl _mytest\\n");


stp x8, x9, [sp, #-32]!       //把x8,x9 的值存到sp-32的地址后,sp=sp-32
stp x8, x9, [sp], #-0x10      //把x8,x9 的值存到sp的地址后,sp=sp+16
stp x8, x9, [sp, #16]         //把x8,x9 的值存到sp+16的地址中


ldp x0, x1, [sp], #0x10      // 把sp的地址里面的内容读到x0,x1后,sp=sp+16
ldp x0, x1, [sp, #0x10]!     // 把sp+16的里面的内容读到x0,x1后,sp=sp+16
ldp x19, x20, [sp, #16]      // sp+16 地址的值分别放回x19 x20

sp和偏移在一个括号内的,地址是sp+偏移,后面跟!则操作完成后sp自动变化,否则不变。
sp单独一个括号的,地址是sp,操作完成后sp会自动变化。

        asm volatile (
            "adrp x0, _func@PAGE\\n"
            "add  x0,x0,_func@PAGEOFF\\n"
        );
        将func的地址加载到x0寄存器中

	cbz	x0, LGetImpMiss // x0为 0则跳转到LGetImpMiss。只能内部跳转,不能跳到外部的C函数。

cbz: xt寄存器是否为0,为0则跳转到label处,跳转范围+/1 1MB
cbnz: xt寄存器是否为0,不为0则跳转到label处,跳转范围+/1 1MB
tbz: 测试寄存器中某位是否为0,为0则跳转到label处,跳转范围+/1 32KB
tbnz: 测试寄存器中某位是否为0,为0则跳转到label处,跳转范围+/1 32KB

ubfx	x11, x0, #60, #4    //取x0的高4位到x11
ldr	x13, [x0]						// 加载x0里面的内容到x13寄存器
lip 用来加载内容到2个64位寄存器
	
汇编调用c时,函数前面加下划线_
汇编前面加下划线_,c调用汇编时不加下划线_

flutter小记10apk提交各大应用市场,出现armeabi与arm64版本标识/版本号不一致无法上传审核的解决方案(代码片段)

   部分应用市场支持分别上传armeabi和arm64的apk,但是有时会被告知32位和64位的版本号或版本标识不一致导致如无法上传审核。出现的原因是当使用带有--split-per-abi进行打包时:flutterbuildapk--split-per-abi 命令会将每个架... 查看详情

flutter小记10apk提交各大应用市场,出现armeabi与arm64版本标识/版本号不一致无法上传审核的解决方案(代码片段)

   部分应用市场支持分别上传armeabi和arm64的apk,但是有时会被告知32位和64位的版本号或版本标识不一致导致如无法上传审核。出现的原因是当使用带有--split-per-abi进行打包时:flutterbuildapk--split-per-abi 命令会将每个架... 查看详情

arm64体系结构编程与实践:算术与移位指令(代码片段)

本章思考题1.请简述N、Z、C、V这4个条件标志位的作用。2.下面两条ADD指令能否编译成功?addx0,x1,#4096addx0,x1,#1,LSL13.下面的示例代码中,X0寄存器的值是多少?movx1,0xffffffffffffffffmovx2,#2adcx0,x1,x24. 查看详情

基于arm64的cpu架构下的docker-compose安装(代码片段)

...ocker-compose的时候,我们在后台使用的是x86_64CPU处理器指令集。如果我们尝试按照默认的安装说明在运行在arm64上的系统上安装dockercompose,就会出现错误。这是因为没有可用于arm64指令集的dockercompose二进制文件。安装docke 查看详情

androidndk:如何编译jni为指定的指令集(armeabi/arm64)(代码片段)

具体错误D:\\Nanjing-SVN\\USBCamera2\\libusb4javajni\\src\\main\\jni>D:\\SOFTWARES\\DEVELOP\\android-ndk-r16b/ndk-build.cmdAndroidNDK:WARNING:APP_PLATFORMandroid-14ishigherthanandroid:minSdkVersion1inD:/Nanjing-SVN/USBCamera2/libusb4javajni/src/main/AndroidManifest.xml.NDKbinarieswill*not*beco... 查看详情

java查看运行代码的汇编指令(含hsdis-arm64.dll文件)(代码片段)

...取码:fvzm  普通的Java代码执行,无法看到汇编指令,若要查看,需要下载hsdis动态链接库。一般网上介绍的都是mac下的hsdis.dylib,这里介绍是win10下的dll。   这个工具需要放在jdk安装目录下的jre/bin目录下。... 查看详情

arm伪指令(代码片段)

1、伪指令是什么ARM伪指令不是ARM指令集中的指令,只是为了编程方便人们定义了伪指令。在汇编时这些指令将会被等效的ARM指令或arm指令的组合代替。编程时可以像其他ARM指令一样使用伪指令,区别是伪指令不像指令一样有对... 查看详情

vulhub搭建小记(代码片段)

建议您通读全文后,在了解大体思路的前提下搞。0x00VMware安装ubuntu18.04dektop64bit http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-amd64.iso安装步骤:参考https://www.cnblogs.com/Alier/p/6337151.html0x01ubuntu配置docker及doc 查看详情

arm指令(代码片段)

文章目录寄存器ARM指令MOVMVNSUBADDANDORRBICCMPTST条件BLADRLLSLRORMRSMSR寄存器装载和存储伪指令数据伪指令操作类伪指令协处理器访问指令协处理器访问寄存器ARM总共有37个寄存器,31个通用寄存器,6个状态寄存器应用程序工作在... 查看详情

arm指令(代码片段)

文章目录寄存器ARM指令MOVMVNSUBADDANDORRBICCMPTST条件BLLSLRORMRSMSR寄存器装载和存储伪指令数据伪指令操作类伪指令协处理器访问指令协处理器访问寄存器ARM总共有37个寄存器,31个通用寄存器,6个状态寄存器应用程序工作在user... 查看详情

AArch64 - 并行运行 ARM 和 ASIMD 指令

】AArch64-并行运行ARM和ASIMD指令【英文标题】:AArch64-RunningARMandASIMDinstructionsinparallel【发布时间】:2016-03-0921:52:05【问题描述】:我想同时使用ARM汇编指令和ASIMD指令在汇编指令中实现代码。我的第一个问题是,这是否可以在ARMv8... 查看详情

go编译(代码片段)

...编译器,gc和gccgo,其中gccgo基于gcc后端。go编译器支持8种指令集,不同建构编译质量不同:amd64(alsoknownasx86-64)386(x86orx86-32)Comparabletotheamd64port.arm(ARM)SupportsLinux,FreeBSD,NetBSD,OpenBSDandDarwinbinaries.Lesswidelyusedthantheotherports.arm64(AArch64)Support... 查看详情

制作forarm64cpu架构的docker镜像(代码片段)

...6是CPU的两个不同体系。简而言之,x86是cisc,复杂指令集,尽量依靠硬件来实现计算机指令;而arm是risc,精简指令集,试图依靠简单指令的组合迭代完成复杂指令,详见拙作《x86、amd、arm和GPU》。因此... 查看详情

arm指令(代码片段)

ARM寻址方式所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。立即寻址:也叫立即数寻址,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数。ADDR0,R0,#0x3f;R0... 查看详情

arm汇编(代码片段)

汇编指令和伪指令的区别汇编指令是cpu机器指令的助记符,代表这个cpu的功能。伪指令本质不是指令,只是和汇编指令写在同一个代码中,它由编译器提供,用于指导编译过程,经过编译后伪指令最终不会生... 查看详情

ncnn模型推理详解及实战(代码片段)

...aarch64aarch64,也被称为ARM64,是一种基于ARMv8-A架构的64位指令集体系结构。它是ARM体系结构的最新版本,旨在提供更好的性能和能效比。与先前的32位ARM架构相比,aarch64具有更大的寻址空间、更多的寄存器和更好的浮点性能。在Li... 查看详情

arm汇编简单介绍(代码片段)

...*/  ;单行注释@ 2. 符号说明:  1)汇编指令,一条指令对应一个机器码,完成一定的功能  2)伪指令,一条指令对应多条机器码,完成一个稍微复杂的功能  3)伪操作,不会生成机器码,为了协助编译器... 查看详情

thumb和arm指令不能切换问题(error:unsupportedinterworkingcall(thumb->arm))(代码片段)

...败。首先要知道ARM架构的CPU分ARM态和Thumb态,执行ARM指令的时候是ARM态, 查看详情