ARM64 常见汇编指令学习
文章平均质量分 71
主要介绍ARMv8/ARMv7 中一些常用的汇编指令
主公CodingCos
竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生
展开
-
【ARM64 常见汇编指令学习 14.1 -- ARM 汇编 .align 和 .section】
段是目标文件中的一部分,它们用于组织程序的不同部分,比如代码、数据等。在编写底层嵌入式或系统级别程序时非常重要,它们控制着程序如何被组织和加载到内存中,以及如何与硬件交互。是两个常用的指令,它们在代码中扮演着重要的角色,尤其是在控制内存对齐和段(section)定义时。确保了中断向量表在128字节对齐的地址上开始,这有助于满足硬件对中断向量表地址对齐的要求。指令用于确保接下来的数据或指令在内存中的地址满足特定的对齐要求。则定义了包含这些向量的段,并设置了适当的属性以确保它们被正确地处理。原创 2024-05-09 20:10:40 · 149 阅读 · 0 评论 -
【ARMv8/v9 常见汇编指令学习 6.1 - armv8 右移指令 LSR 详细介绍】
(Logical Shift Right)指令是一种逻辑右移指令,用于将一个寄存器中的数值向右移动指定的位数。逻辑右移操作会从左侧填充0,这与算术右移(,Arithmetic Shift Right)不同,后者会根据符号位填充。指令在进行位操作、快速除法运算(对2的幂次进行除法)或处理位字段时非常有用。中的值向右移动2位,并将结果存储到寄存器。(十进制中的60),执行上述。在ARMv8架构中,假设我们希望将寄存器。(十进制中的15)。原创 2024-05-01 09:37:21 · 585 阅读 · 0 评论 -
【ARM 常见汇编指令学习 6.1 - armv8 乘加指令 madd详细介绍】
指令在多种程序设计场景中非常有用,例如在进行向量计算、矩阵乘法、多项式求值以及其他需要乘法和加法联合运算的地方。它可以帮助减少指令数量,优化程序性能,特别是在循环和迭代计算中。指令是一种乘加指令,用于执行两个数的乘法操作,并将结果与第三个数相加。中,而初始值分别存储在寄存器。,并将结果存储到寄存器。在ARMv8架构中,如果我们要计算表达式。中的值将是17,因为。原创 2024-05-01 09:33:36 · 463 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 24 -- ARM 带返回值的汇编函数】
是一个只有在特定执行级别(EL1 或更高)才能访问的寄存器。如果在不允许的执行环境中尝试读取它,将引起异常。,无论是内联汇编还是纯汇编函数,都需要在拥有适当权限的执行环境中运行,因为。在 ARMv8 架构中,系统寄存器的访问通常使用专有的指令。寄存器(ARMv8 架构的第一个通用寄存器),然后该函数通过。是一个输出操作数,它将被分配到一个寄存器中,并且在执行。在 ARMv8 架构中,函数的返回值通常通过。下面是一个以内联汇编写成的函数,用来读取。指令后它将包含该寄存器的值。在这个纯汇编函数中,原创 2024-03-25 21:43:25 · 333 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 23 -- ARMv8/v9 出入栈介绍】
实现一个 C函数调用汇编函数A,然后汇编函数A先进行入栈然后再去读取寄存器MPIDR_EL1的值到X0中最后再进行出栈操作再ret。此外,对于特定系统寄存器的访问可能需要特定的权限,因此这段代码应该在一个有权限的执行环境中运行。请注意,上面的汇编代码应该与 C 代码在同一个项目中编译,以确保链接时可以正确解析。为了实现这个需求,我们需要创建一个 C 函数,它将调用一个汇编函数。在 C 代码中,你可以这样调用。然后,我们编写对应的汇编函数。原创 2024-03-25 22:06:24 · 685 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 22 -- ARMv8/v9 入栈寄存器介绍】
在 ARMv8 架构中,函数调用遵循一组称为 AAPCS64 (ARMv8 64-bit Procedure Call Standard)的规则。这个调用约定定义了哪些寄存器是可用于传递函数参数的、哪些需要由调用者保存(caller-saved),以及哪些需要由被调用者保存(callee-saved)。原创 2024-03-25 21:54:46 · 495 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 21 -- ARM RET 与 ERET】
还原 Exception Level (EL) 发生变化前的程序状态,它通常在处理操作系统级别的代码中使用。指令用于从函数或者过程返回。它主要负责从当前过程跳转回调用者,并恢复调用者的程序计数器 (PC) 的值。指令用于从异常返回,特别是从中断或陷阱处理程序返回到之前的执行上下文。,链接寄存器),其中包含返回地址。如果没有指定寄存器,则默认为。是一个可选的寄存器,通常为。在 ARMv8 架构中,原创 2024-03-25 21:49:42 · 986 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 20 -- ARM 指令 .include与 .asciz 详细介绍】
在 ARM 汇编语言中,.include命令用于插入另一个源文件的内容。它的作用类似于 C 语言中的#include预处理命令。这个命令通常在源文件的顶部使用,但也可以在任何地方使用。这里的"filename"是你想要包含的文件名。这个文件名可以是绝对路径,也可以是相对于当前文件的路径。例如,如果你有两个文件,main.s和 helper.s,你想在main.s中使用helper.s中定义的函数,你可以在main.s的顶部添加一行。请注意,不是所有的汇编器都支持 .include 指令。例如,原创 2023-08-22 14:26:54 · 933 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 19 -- ARM64 BEQ与B.EQ的区别】
实际上是同一条指令的两种不同表示方式,它们都表示条件分支指令,当某个条件满足时,跳转到某个地址。它们表示的都是"Branch if Equal",也就是如果。在这两个例子中,如果Zero标志位被设置,CPU都会跳转到标签target指定的地址。如果你的汇编器支持,你可以选择使用这两种形式中的任何一种。则是在后来的ARM汇编版本中引入的,为了与其他指令保持一致,因为大多数其他指令都使用。被设置(表示上一条比较或算术指令的结果为0),就跳转到目标地址。是在早期ARM汇编中使用的指令形式,而。原创 2023-08-18 09:26:13 · 1604 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 18 -- ARM64 TST 指令与 条件标志位 Z】
(Zero)是条件码寄存器(Condition Code Register)中的一位,用来表示最近一次算术或逻辑操作的结果是否为零。指令执行按位与(AND)操作,但并不将结果保存,而是根据结果来设置条件代码寄存器(Condition Code Register)。指令在你需要根据两个值的按位与结果来改变程序流程时非常有用,如在条件分支或循环中。是ARM架构的一个汇编指令,用于测试(Test)两个寄存器中的值。进行按位与操作,并根据结果设置条件代码寄存器。否则,Z标志被清除。中的值进行按位与操作。原创 2023-08-18 09:23:22 · 1119 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 17 -- ARM64 BFI 指令】
ARM64架构的BFI(Bit Field Insert)指令用于将一个寄存器中的位字段插入到另一个寄存器中的指定位置。这个指令对于位操作很有用。BFI指令的格式如下BFI 目标寄存器,源寄存器,lsb,宽度目标寄存器:将被插入位字段的寄存器。源寄存器:包含要插入的位字段的寄存器。lsb:在目标寄存器中插入位字段的最低位的位置。宽度:要插入的位字段的宽度。这个指令将x1寄存器的最低8位插入到x0的第4位到第11位(包括第4位和第11位)。其他位置的位不改变。原创 2023-08-08 22:45:47 · 779 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】
例如,当试图读取或写入不可访问的内存位置时,或者执行的指令违反了内存保护策略时,就会触发这个异常。:这是一个特殊的安全调用,用于进行安全状态间的切换,例如:在ARM TrustZone技术中,从非安全世界切换到安全世界,比如从EL1 切换到哦 EL3。以上这些异常都是同步异常,也就是说,它们是由当前执行的指令直接触发的。例如,当处理器试图从一个不可访问的内存位置获取指令时,就会触发这个异常。:系统错误,是ARMv8架构中新引入的一种异常类型,用于报告系统范围内的错误,如 ECC 错误。这通常用于调试目的。原创 2023-08-08 22:19:01 · 977 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 14 -- ARM 汇编 .balign,.balignw,.balign 伪指令学习】
balignl是一个伪操作符,伪操作符的意思就是机器码里,并没有一个汇编指令与其对应,是编译器来实现其功能的。balignl是.balign的变体。.balignl, fill } {, max }第一个参数alignment为一个正整数,以alignment的值的整数倍为结束地址进行对齐,以当前地址为起始地址,进行字节填充,比如当前地址为20,而alignment的值我们设定为16,那么字节填充自20开始,结束于20后第一个16的倍数地址处,即32处。第二个参数fill即我们选定的,用来填充的数值。原创 2023-08-08 20:15:11 · 694 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 15 -- ARM 标志位的学习】
在ARM架构中,处理器的状态寄存器(例如CPSR)有一些标志位,用于表示特定的状态或结果。N(Negative):负标志位。如果操作的结果是负数,那么N位将被设置为1。Z(Zero):零标志位。如果操作的结果是零,那么Z位将被设置为1。C(Carry):进位标志位。如果操作导致了进位或借位,那么C位将被设置为1。V(Overflow):溢出标志位。如果操作的结果导致了算术溢出,那么V位将被设置为1。这些标志位主要用于条件指令,如CMP(比较)、ADD(加法)、SUB。原创 2023-08-08 19:48:53 · 1272 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 13 -- ARM 汇编 ORG 伪指令学习】
在ARM汇编中,"org"是一个汇编器伪指令,用于设置下一条指令的装入地址。org"后面跟着的是一个表达式,这个表达式的值就是下一条指令的装入地址。如果不用org规定则汇编得到的目标程序将从0x0000开始。两个org伪指令之间,除了指令代码,若有自由空间,则用0填充。org 指令本身并不能决定程序将要加载到内存的什么位置,它只是告诉编译器,我的程序在编译好后需要加载到 xxx 地址,所以请你在链接时调整好数据访问时的地址,就是为程序中所有的引用地址增加一个段内偏移值。上述代码中,“原创 2023-08-04 14:23:53 · 2167 阅读 · 0 评论 -
【ARM64 常见汇编指令学习 12 -- ARM 汇编函数 的学习】
ARM汇编中的函数定义并不像高级语言那样有特定的语法,但通常可以通过标签(label)和子程序调用指令 (如BL,BLX)来实现类似于函数的功能。例如,下面的代码定义了一个名为的 “函数”,它接受一个参数(通过寄存器r0传递),将其值增加1在这里,是一个标签,表示这个函数的入口点。是函数的主体,它将寄存器r0的值增加1。最后,bx lr是函数的退出语句,它将执行权返回给调用者。这个函数可以通过BL在这里,mov r0, #5将值5加载到寄存器r0中,然后跳转到。原创 2023-08-04 11:00:41 · 1622 阅读 · 0 评论 -
ARM64 常见汇编指令学习 11 -- ARM 汇编宏 .macro 的学习
在 ARM 汇编中,“.macro” 是用来定义一个宏的指令。宏可以看作是一个可以在汇编程序中重用的代码段。当调用宏时,汇编器会将宏的内容插入到调用位置。在这个例子中,我们定义了一个名为’dstsrc1和src2。宏的主体部分包含两条指令:‘add’和'mov使用的时候,只需要在程序中调用这个宏,传递相应的参数就可以了。这将在汇编代码中插入""和"mov x0, x1"两条指令。需要注意的是,“\dst”、“\src1"和”\src2。原创 2023-08-04 10:10:06 · 1714 阅读 · 0 评论 -
ARM64 常见汇编指令学习 10 -- 无符号位域提取指令 BFXIL
从Wn 寄存器的第 lsb 位开始,提取 width 位,替换 Wd 寄存器的最低 width位,剩余高位不改变。假设我们有一个 64 位的寄存器 X0,它的值为。执行完上述指令后,X1的值为。原创 2023-08-03 09:51:01 · 277 阅读 · 0 评论 -
【ARM 常见汇编指令学习 7 - LDR 指令与LDR伪指令及 mov指令】
而ldr伪指令没有这个限制,如果使用ldr伪指令后面的立即数没有超过8位,那么汇编将会使用mov指令去替换LDR伪指令。两者虽然名字相同但是作用却不相同,区分两者的方法就是看第二个参数,如果有等号,就是LDR伪指令。mov 后面的立即数可以进行位移操作,位移的位数范围是。,步长为2,所以实际上可以表示的立即数范围更大。mov 指令限制了立即数的长度为8位,立即数范围是。如上面arm汇编代码是将地址。(x9 32bit形式)中。上面语句的作用是将地址。指令来做这个事情,因为。原创 2023-07-31 13:20:29 · 2358 阅读 · 0 评论 -
ARM 常见汇编指令学习 9 - 缓存管理指令 DC 与 IC
缓存维护操作可以通过缓存组(set),路(way)或虚拟地址(VA)执行。在做高速缓存维护操作前,需要知道高速缓存的一些信息,比如系统中有多少级高速缓存,缓存行的大小,每一级缓存的组织结构等等。这些基本信息保存在系统寄存器中,在系统上电过程中,操作系统访问这些寄存器来获得缓存的信息。AArch64指令集中有两条关于缓存维护(cache maintenance)的指令,分别是IC和DC。还包括 AT,BRB,CFP,CPP,DVP和TLBI。其中,是可选的64-bit通用源寄存器。中指定的地址对应的缓存行。原创 2023-07-31 23:05:22 · 2070 阅读 · 0 评论 -
【ARM 常见汇编指令学习 8 - dsb sy 指令及 dsb 参数介绍】
一个常见的使用DSB指令的例子是在写入特殊的硬件寄存器之前和之后。在这种情况下,需要确保所有之前的内存操作都已完成,并且在写入操作完成之后,再执行后续的指令。只有当DSB指令执行完毕后,才会执行程序中位于此指令后的指令。这是因为在某些情况下,如访问特殊硬件寄存器时,执行顺序是很重要的。在上述例子中,DSB SY指令确保了第一个存储操作(数据同步屏障是一种特殊类型的内存屏障。)在第二个存储操作(原创 2023-07-31 22:27:49 · 2312 阅读 · 0 评论 -
【ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或)】
根据operand哪个位为1,将Rn对应的位设置为1,其余位不变,然后将结果存入Rd。第2条汇编代码表示将 r0 寄存器的bit0-bit2清0,气他bit不变。第1条汇编代码表示将 r0 寄存器的 bit13 清0,其它bit不变。表示将 r0 寄存器的 bit8 和bit16 置 1,其它bit不变。根据operand哪个位为1,清除Rn对应的位,然后将结果存入Rd。eor 指令将 Rn 的值与操作数 operand 按位逻辑 ”,结果存放到目的寄存器Rd 中。原创 2023-07-28 22:44:16 · 3324 阅读 · 0 评论 -
【ARM 常见汇编指令学习 5 -- arm64汇编指令 wzr 和 xzr】
(32-bits)。这就是在写汇编代码时需要注意的地方,如果某条指令使用SP寄存,那么这条指令就不能再使用xzr/wzr寄存器了。一般都是知道X31是栈指针寄存器,其实X31的另外一个作用就是zero 寄存器,我们知道ARMv8 通用寄存器是X0-X29一共30个,其中X30为链接寄存器,关于 bic(位清除)、orr(位或)、eor (异或)具体使用请见下篇文章。下面这段汇编代码使用了bic 位清除 指令。ARMv8 在硬件层名引入了一个新的。那么如何保证两者在使用时不冲突呢。原创 2023-07-28 22:25:57 · 2444 阅读 · 0 评论 -
【ARM 常见汇编指令学习 4 -- ARM64 比较指令 cbnz 与 b.ne 区别】
B.NE指令的含义是:如果上一个指令的结果不等于零(即条件标志位Z为0),那么跳转到指定的地址。如果结果等于零,则继续执行下一个指令。是通用寄存器,寄存器的号码可以是 0-31。当这个寄存器的值非零时,那么执行跳转到的地址为:当前PC+label 偏移地址。标识位(条件位),比较结果为 0 时,Z位置1,比较结果为非0时,Z位为0。减去1之后是否为0,如果不为0,那么继续跳转到。如上面汇编代码,判断。原创 2023-07-28 21:46:40 · 3671 阅读 · 0 评论 -
【ARM 常见汇编指令学习 3 -- ARM64 无符号位域提取指令 UBFX】
的32bit 寄存器,并判断该寄存器的bit0是否置位(0x1),如果没有置位则跳到标签。UBFX 有2种语法分别是对32bit 寄存器和64bit寄存器。ARM 提供了一个汇编指令:UBFX 就可以用于该功能。在代码中如何监控寄存器的某1bit, 或者某几bit。该段代码的意思是读取某个地址为。原创 2023-07-28 15:29:57 · 1799 阅读 · 1 评论 -
【ARM 常见汇编指令学习 2 -- 存储指令 STP 与 LDP】
的值存储到目标内存地址中,并且递增目标内存地址以便下一次存储。存储的数据可以是32位或64位,具体取决于使用的寄存器。LDP指令从目标内存地址中加载数据,并将其存储到和或和寄存器中。加载的数据可以是32位或64位,具体取决于使用的寄存器。在 ARMv8 架构中,STP指令用于将两个通用寄存器的值存储到内存中。请注意,STP指令在ARMv8架构中引入了64位寄存器,因此可以存储更大的数据量。请注意,LDP指令在ARMv8架构中引入了64位寄存器,因此可以加载更大的数据量。原创 2023-07-04 19:16:25 · 4937 阅读 · 0 评论 -
【ARM 常见汇编指令学习 1 -- 跳转指令 BL 与 BLR 区别】
ARM 中跳转指令主要分为无条件跳转和有条件跳转,有条件跳转是一种根据特定条件进行跳转的指令。它会根据条件码寄存器(Condition Code Register)中的状态,判断是否满足特定条件,然后根据条件的结果决定是否进行跳转。无条件跳转是一种无条件地改变程序执行流程的指令。它会直接跳转到指定的地址,而不需要任何条件判断。有条件跳转指令,有条件跳转指令的方式很固定。无条件跳转指令,有常见如下4种:直接跳链接跳间接跳返回跳,原创 2023-07-03 16:03:44 · 2988 阅读 · 0 评论