ARM组件中的代码:使用指针

2021-06-23 22:56:05

在上一篇文章中,我解释了ARM64处理器的寄存器的基本架构,并说明了如何通过汇编语言例程来访问和返回值的方式。我与一个悬崖师结束,希望解释如何从传递给例程的指针访问参数。

有两个基本说明,用于在内存和寄存器之间传输数据,LDR加载到寄存器中,并将其存储到内存中。他们最简单的用途是:

LDR X0,[REG]加载REG中的地址,例如寄存器X1,进入寄存器X0

str x0,[reg]将寄存器x0中的内容存储到reg中的地址中,例如寄存器x1

请注意,两者的移动方向如何不同:LDR将第一个操作数加载为目的地,而str存储在第一个操作数中的源。说明更常用使用第一个操作数指定结果的目的地; str是一个重要的例外。

这些指令中的reg项目可以使用五种不同的寻址模式中的任何一种:[x1] - 基本寄存器,它可以包括使用堆栈指针[x1,偏移] - 归档寄存器,其中有效地址是基本寄存器中的地址和偏移[x1,偏移]的总和! - 预索引,它类似于偏移量,但在使用寄存器中的地址之前,请在寄存器中添加偏移量;这通常用于在阵列[x1]中加载或存储值,偏移 - 索引后,它类似于偏移量,但由于该指令,通过在末尾添加偏移量来更新寄存器中的地址执行;这通常用于从堆栈标签 - PC相对弹出值,它用于通过标签访问代码中定义的值。

要了解这些,通过一些例子很有用。在这些开始的开始时,寄存器X1包含地址00000100。

LDR X0,[x1,8]将地址00000108(00000100 + 8)的64位整数加载到寄存器x0中 ldr x0,[x1,8]! 将地址00000108(00000100 + 8)的64位整数加载到寄存器x0中,并在寄存器x1中离开地址00000108 LDR X0,[X1],8将地址00000100的64位整数加载到寄存器X0中,并在寄存器X1中离开地址00000108(00000100 + 8)。 指定地址的最终复杂性是指定偏移量的变化,这里显示为寄存器X1的偏移量: [x1,x2,lsl 2] - 偏移量是寄存器x2中包含的整数,左移2个位置 [X1,W2,UXTW 2] - 偏移量是寄存器W2(32位)中包含的整数,左移2个位置。 这些图中概述了该图,其中还涵盖了我已经检查过的其他操作数类型和返回值。

现在尝试其中一些负载并使用不同的寻址模式存储说明。这是简单的,使用ASMattic:首先,您需要更改ASMMATH.h头文件以提供新的呼叫,请在我的壳体外部TATEADD(双,双*,双*);它将一个双倍作为值和两个视为指针,并返回双重值。要在SWIFT中调用,请使用类似于Let MyA = Thea.DoubleValue var myb = thetemp = thec.doublevalue var myc = [thetemp + 1.0),(thetemp + 2.0)]让myd = testadd( Mya,& myb,& myc)这首先设置三个参数来包含一个不可变双值,指向一个双重的指针,指向三个元素的双打数组,在调用该函数返回双重之前结果。然后,您使用self.outputtext.string =&#34显示结果。结果= \(Myd)a = \(mya)b = \(myb)c = \(myc)\ n"

_testadd:str lr,[sp,#-16]! LDR D5,Multi_two // - 使用PC-Inflication Access FMUL D6,D0,D5 // - DOUNDE的标记值是从D0寄存器LDR D7,[x0] // - 使用基地的第一个参数注册访问。请注意,双倍的地址不在浮点寄存器中传递,而是在通用寄存器中传递。 FMUL D7,D7,D5 STR D7,[X0] LDR D5,MULTER_THREE LDR D4,[X1] FMUL D7,D4,D5 STR D7,[X1] LDR D4,[X1,8]! // - 使用预索引递增x1递增8的索引,因此访问阵列中的下一个双倍。 FMUL D7,D4,D5 STR D7,[X1] LDR D4,[X1,8]! FMUL D7,D4,D5 STR D7,[X1] FMOV D0,D6 // - 结果返回为D0寄存器中的双值。 LDR LR,[SP],#16 RET

现在我们处于访问传递给装配例程的参数的位置,返回结果为值以及通过引用传递的这些参数。下一步是控制程序流,我将在本系列中的下一步开始。

1:构建应用程序以开发装配例程,包括将汇集语言从SWIFT调用汇编语言的解释,其中包含一个完整的Xcode项目2:寄存器解释,图表显示了ARM64处理器的寄存器,并按值传递参数

手术呼叫标准用于ARM 64位架构(ARM)从GitHub写作ARM64代码用于Apple平台(Apple)Stephen Smith(2020)用64位ARM汇编语言编程,APRess,ISBN 978 1 4842 5880 4. Daniel Kusswurm( 2020)现代ARM汇编语言编程,APRess,ISBN 978 1 4842 6266 5. ARM64指令集参考(ARM)。

发布在Mac,技术和标记的Apple硅,臂,汇编器,汇编语言,M1,Xcode。书签永久链接。