在本系列中的前一集中,我开始使用设置NZCV标志的指令来控制如何控制流,然后是标签的条件分支。给出的示例是最简单的,如果是......否则,如果...语句或小型交换机语句。可以在图中概括:
本文介绍了查看其他主要的控制类型,条件循环。
虽然条件循环可以使用像SWIFT这样的高级语言以几种不同的方式编写,但是有两个基本模式,具体取决于测试是否在循环的头部或尾部进行。
在SWIFT中,最广泛使用的循环形式,测试是否在尾部满足条件是for语句:用于索引在1 ... 100 {}中
ARM64汇编语言中的典型实现可能首先设置包含开始索引值和结束索引的寄存器,然后在循环中执行代码,递增索引值,并测试它是否仍然小于或等于最终索引。如果它确实,然后分支回循环再次执行它;如果没有,则继续使用以下操作。
以下是索引存储在寄存器x5中的示例,以及x4:mov x5,#1 // start index = 1 mov x4,#100 // endex = 100 for_loop://执行所需的索引在循环// ...添加x5,x5,#1 //递增1 cmp x5,x4 //检查是否已达到终端索引B.Le for_loop //,如果index< = end index,循环回/ /下一个循环后的代码
修改为计算下降的变体,这很简单,例如,通过将索引从上限递减直到达到下限。
在Swift中,一种常见的循环形式,其在头部使用的是:而x< 100 {}
ARM64汇编语言中的典型实现可能首先设置包含X和最终限制的初始值的寄存器,然后检查x是否已达到该终端值。如果它有,则在循环后分支到下一个代码。否则执行循环代码并在执行无条件循环回到起始测试并再次通过循环之前递增X值。
这是一个例子,其中x值存储在寄存器x5中,x4:mov x5,#1 // start值= 1 mov x4,#100 // end值= 100 wher_loop:cmp x5,x4 / /检查是否已达到终端值B.gehing and_done //如果值>终端值,结束循环//执行循环中所需的内容// ...添加x5,x5,#1 //增量值(或在终止中所需的任何东西)b with_loop //无条件循环返回white_done:// next循环后的代码
经典示例的迭代通过返回空终止的ASCII字符串中的每个字节字符迭代。
在SWIFT中,这可能被称为:VAR输出:[CCHAR] =阵列(重复:0,count:255)让S:String ="样本字符串" ascii_copy(s,&输出)调用:extern int ascii_copy的c头(const char *,char *);
注册用法遵循:// x1 - 输出字符串的地址// x0 - 输入字符串的地址/// x4 - 长度计算的原始输出字符串。 // W5 - 正在处理的当前字符和汇编代码是:_ascii_copy:mov x4,x1 //循环,直到x1指向的字节是非零环:ldrb w5,[x0],#1 //加载ASCII字符和递增指针//使用W5 STRB W5,[x1],#1 //存储字符到输出str cmp w5,#0 //停止击中空字符B.NE循环//循环如果字符ISN' t null sub x0,x1,x4 //通过减去read //返回呼叫者来获得长度
可以使用设置NZCV标志的指令来实现控制传输语句,如继续,中断,返回和抛出,然后是一个条件分支,例如循环:// do cmp x5,x4 //比较两个寄存器b.gt break_loop //突破循环// do其他内容b循环//重复循环break_loop://断开循环并继续下一个代码
这些成语中的所有四个都在当今的撕裂PDF中收集:ARMControlflow1
在下一篇文章中,我将开始查看一些常见的通用注册说明。
上面的示例ASCII字符串代码是基于以下修改代码的Alexander VON,以伴随斯蒂芬史密斯的书。
1:构建一个应用程序以开发装配例程,包括解释从SWIFT调用汇编语言,完整的Xcode项目2:寄存器解释3:使用指针4:控制流程
手术呼叫标准用于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。书签永久链接。