汇编基础(二)arm(64)汇编基础

张开发
2026/4/14 11:19:37 15 分钟阅读

分享文章

汇编基础(二)arm(64)汇编基础
ARM汇编指令详解32位与64位对比一、ARM架构概述ARMAdvanced RISC Machine是一种精简指令集RISC处理器架构。在ARM架构的发展过程中主要有两个重要版本系列ARMv7-A支持32位指令集AArch32ARMv8-A引入64位指令集AArch64二、寄存器详解32位架构寄存器AArch32ARM 32位处理器有16个通用寄存器R0-R15R0-R12通用寄存器R13SP栈指针寄存器R14LR链接寄存器R15PC程序计数器状态寄存器CPSRCurrent Program Status Register当前程序状态寄存器SPSRSaved Program Status Register保存的程序状态寄存器64位架构寄存器AArch64ARM 64位处理器有32个通用寄存器W0-W30, X0-X30W0-W3032位寄存器X0-X3064位寄存器W寄存器是其低32位SP栈指针PC程序计数器不能直接访问LRX30链接寄存器NZCV条件标志寄存器DAIF中断屏蔽位三、标志位详解CPSR/NZCV32位架构中的CPSR寄存器在ARM 32位架构中当前程序状态寄存器CPSR - Current Program Status Register包含重要的标志位N (Negative) 负数标志 - bit 31当操作结果为负数时置1否则清0Z (Zero) 零标志 - bit 30当操作结果为零时置1否则清0C (Carry) 进位标志 - bit 29对于加法操作当发生进位时置1对于减法操作当无借位时置1V (Overflow) 溢出标志 - bit 28当有符号整数运算结果超出表示范围时置1Q (Saturation) 饱和标志 - bit 27饱和发生时置1IT[1:0] (IT Block) - bit 26-25IT块标志位J (Jazelle) - bit 24Jazelle位E (Endianness) - bit 9大端/小端执行状态位A (Async abort) - bit 8禁用异步中止位I (IRQ interrupt) - bit 7禁用IRQ中断位F (FIQ interrupt) - bit 6禁用FIQ中断位T (Thumb state) - bit 5Thumb状态位M[4:0] (Mode) - bit 4-0处理器模式位64位架构中的NZCV寄存器在ARM 64位架构中条件标志被分离出来存储在NZCV特殊寄存器中**bit 31 (N)**负数标志 (Negative flag)**bit 30 (Z)**零标志 (Zero flag)**bit 29 (C)**进位标志 (Carry flag)**bit 28 (V)**溢出标志 (oVerflow flag)四、基本数据处理指令详解数据传送指令32位架构MOV Rd, Rn将寄存器Rn的值传送到寄存器RdMOVT Rd, #imm16将16位立即数移到目标寄存器的高16位MOVW Rd, #imm16将16位立即数移到目标寄存器的低16位MVN Rd, Rn取反传送NOT操作LDR Rd, [Rn]从内存加载数据到寄存器LDR Rd, immediate加载立即数到寄存器PUSH {Rn}将寄存器压入栈POP {Rn}从栈弹出寄存器64位架构MOV Xd, Xs数据传送MOVZ Xd, #imm16将16位立即数移到目标寄存器指定的16位段MOVK Xd, #imm16, LSL #shift将16位立即数移到目标寄存器指定的16位段不改变其他位ADR Xd, label计算标签地址ADRP Xd, label计算页面地址LDR Xt, [Xn]加载寄存器LDR Xt, immediate加载立即数STR Xt, [Xn]存储寄存器算术运算指令32位架构ADD Rd, Rn, Rm加法运算SUB Rd, Rn, Rm减法运算RSB Rd, Rn, Rm逆向减法Rm - RnADC Rd, Rn, Rm带进位加法SBC Rd, Rn, Rm带借位减法RSC Rd, Rn, Rm带借位逆向减法MUL Rd, Rn, Rm乘法运算MLA Rd, Rn, Rm, Ra乘加运算MLS Rd, Rn, Rm, Ra乘减运算SDIV Rd, Rn, Rm有符号除法UDIV Rd, Rn, Rm无符号除法64位架构ADD Xd, Xn, Xm加法SUB Xd, Xn, Xm减法MUL Xd, Xn, Xm乘法SDIV Xd, Xn, Xm有符号除法UDIV Xd, Xn, Xm无符号除法SMULL Xd, Wn, Wm32位有符号数相乘结果为64位UMULL Xd, Wn, Wm32位无符号数相乘结果为64位逻辑运算指令32位架构AND Rd, Rn, Rm按位与ORR Rd, Rn, Rm按位或EOR Rd, Rn, Rm按位异或BIC Rd, Rn, Rm按位清除AND NOTORN Rd, Rn, Rm按位或非OR NOT64位架构AND Xd, Xn, Xm按位与ORR Xd, Xn, Xm按位或EOR Xd, Xn, Xm按位异或BIC Xd, Xn, Xm按位清除ORN Xd, Xn, Xm按位或非OR NOTEON Xd, Xn, Xm按位异或非EOR NOT移位操作指令32位架构LSL Rd, Rm, #n逻辑左移LSR Rd, Rm, #n逻辑右移ASR Rd, Rm, #n算术右移ROR Rd, Rm, #n循环右移RRX Rd, Rm带扩展的循环右移64位架构LSL Xd, Xn, #shift逻辑左移LSR Xd, Xn, #shift逻辑右移ASR Xd, Xn, #shift算术右移ROR Xd, Xn, #shift循环右移比较指令32位架构CMP Rn, Rm比较两个操作数CMN Rn, Rm负数比较TST Rn, Rm测试操作TEQ Rn, Rm相等测试64位架构CMP Xn, Xm比较两个操作数CMN Xn, Xm负数比较TST Xn, Xm测试操作TEQ Xn, Xm相等测试位操作指令32位架构CLZ Rd, Rm计算前导零的个数REV Rd, Rm字节反转REV16 Rd, Rm半字节反转RBIT Rd, Rm位反转64位架构CLZ Xd, Xm计算前导零的个数RBIT Xd, Xm位反转REV Xd, Xm字节反转REV16 Xd, Xm半字节反转REV32 Xd, Xm32位反转五、加载/存储指令详解32位架构加载/存储指令LDR Rt, [Rn, #offset]基本加载指令STR Rt, [Rn, #offset]基本存储指令LDM/LDMIA/LDMIB加载多个寄存器STM/STMIA/STMIB存储多个寄存器LDRB Rt, [Rn, #offset]加载字节零扩展LDRH Rt, [Rn, #offset]加载半字零扩展LDRSB Rt, [Rn, #offset]加载有符号字节符号扩展到32位LDRSH Rt, [Rn, #offset]加载有符号半字符号扩展到32位STRB Rt, [Rn, #offset]存储字节STRH Rt, [Rn, #offset]存储半字64位架构加载/存储指令LDR Xt, [Xn, #offset]加载64位STR Xt, [Xn, #offset]存储64位LDRW Xt, [Xn, #offset]加载32位零扩展到64位LDRSW Xt, [Xn, #offset]加载32位符号扩展到64位LDP Xt1, Xt2, [Xn, #offset]加载配对寄存器STP Xt1, Xt2, [Xn, #offset]存储配对寄存器LDRB Xt, [Xn, #offset]加载字节LDRH Xt, [Xn, #offset]加载半字LDRSB Xt, [Xn, #offset]加载有符号字节符号扩展到64位LDRSH Xt, [Xn, #offset]加载有符号半字符号扩展到64位STRB Xt, [Xn, #offset]存储字节STRH Xt, [Xn, #offset]存储半字六、与标志位相关的指令影响标志位的数据处理指令32位架构在32位ARM中大多数数据处理指令可以通过添加S后缀来更新标志位ADDS R0, R1, R2加法并更新标志SUBS R0, R1, R2减法并更新标志RSBS R0, R1, #100逆向减法并更新标志MOVS R0, R1传送并更新标志MVNS R0, R1取反并更新标志ANDS R0, R1, R2与操作并更新标志ORRS R0, R1, R2或操作并更新标志EORS R0, R1, R2异或并更新标志MULS R0, R1, R2乘法并更新标志64位架构在64位ARM中许多指令默认更新标志位或有专门的变体来更新标志ADDS X0, X1, X2加法并更新标志SUBS X0, X1, X2减法并更新标志MOVS X0, X1传送并更新标志ANDS X0, X1, X2与操作并更新标志ORRS X0, X1, X2或操作并更新标志MULS X0, X1, X2乘法并更新标志专门的比较指令32位架构CMP Rn, Rm计算Rn - Rm并更新NZCV标志CMN Rn, Rm计算Rn Rm并更新NZCV标志TST Rn, Rm计算Rn AND Rm并更新NZCV标志TEQ Rn, Rm计算Rn EOR Rm并更新NZCV标志64位架构CMP Xn, Xm计算Xn - Xm并更新NZCV标志CMN Xn, Xm计算Xn Xm并更新NZCV标志TST Xn, Xm计算Xn AND Xm并更新NZCV标志TEQ Xn, Xm计算Xn EOR Xm并更新NZCV标志条件执行指令ARM架构的一个强大特性是条件执行指令可以根据标志位的状态有条件地执行32位架构条件后缀EQ等于Z1NE不等于Z0CS/HS无符号更高或相同C1CC/LO无符号更低C0MI负数N1PL正数或零N0VS溢出V1VC无溢出V0HI无符号更高C1 且 Z0LS无符号更低或相等C0 或 Z1GE有符号大于或等于NVLT有符号小于N≠VGT有符号大于Z0 且 NVLE有符号小于或等于Z1 或 N≠VAL总是隐含默认情况示例ADDEQ R0, R1, R2仅当Z1时执行加法SUBNE R0, R1, R2仅当Z0时执行减法MOVEQ R0, #0仅当Z1时传送0到R064位架构条件后缀64位架构保持了类似的条件后缀但使用不同的形式CSET Wd, cond条件设置如果条件为真则设为1否则设为0CINC Wd, Wn, cond条件增加如果条件为真则增加1CSETM Wd, cond条件设置掩码如果条件为真则设为全1否则设为0CSINC Wd, Wn, Wm, cond条件选择递增CSINV Wd, Wn, Wm, cond条件选择取反CCMN Wn, Wm, #nzcv, cond条件比较CCMP Wn, Wm, #nzcv, cond条件比较直接操作标志位的指令32位架构MRS Rd, CPSR将CPSR复制到通用寄存器MSR CPSR_flg, Rm将通用寄存器的值写入CPSR的标志位MSR CPSR_c, #immediate将立即数写入CPSR的控制位64位架构MRS Xd, NZCV将NZCV标志寄存器复制到XdMSR NZCV, Xn将Xn的值写入NZCV标志寄存器MRS Xd, DAIF读取中断屏蔽位MSR DAIF, Xn设置中断屏蔽位七、分支跳转指令32位架构B label无条件跳转BL label带链接的跳转调用子程序BX Rn分支并交换切换Thumb/ARM状态BLX Rn带链接和交换的分支条件分支如BEQ,BNE,BCS,BCC,BMI,BPL,BVS,BVC,BHI,BLS,BGE,BLT,BGT,BLE64位架构B label无条件分支BL label带链接的分支函数调用BR Xn寄存器分支BLR Xn带链接的寄存器分支RET {Xn}返回指令条件分支B.cond如BEQ,B.NE,BCS,BCC,BMI,BPL,BVS,BVC,BHI,BLS,BGE,BLT,BGT,BLE八、特殊数据处理指令信号处理指令SIMD32位架构SMLABB Rd, Rn, Rm, Ra有符号乘法最底字节相乘SMLABT Rd, Rn, Rm, Ra有符号乘法底字节和顶字节相乘SMLATB Rd, Rn, Rm, Ra有符号乘法顶字节和底字节相乘SMLATT Rd, Rn, Rm, Ra有符号乘法顶字节相乘UMLAL Rd_lo, Rd_hi, Rn, Rm无符号长乘累加64位架构SMADDL Xd, Wn, Wm, Xa有符号32×32→64位乘加UMADDL Xd, Wn, Wm, Xa无符号32×32→64位乘加SMSUBL Xd, Wn, Wm, Xa有符号32×32→64位乘减UMSUBL Xd, Wn, Wm, Xa无符号32×32→64位乘减原子操作指令LDREX Rt, [Rn]独占加载STREX Rd, Rt, [Rn]独占存储CLREX清除独占监控九、标志位的使用实例32位示例assembly MOVW R0, #0x1234 将0x1234放入R0的低16位 MOVT R0, #0x5678 将0x5678放入R0的高16位R0 0x56781234 LDRSB R1, [R2] 从R2指向的地址加载一个有符号字节到R1符号扩展 LDRSH R3, [R4] 从R4指向的地址加载一个有符号半字到R3符号扩展 CMP R1, R2 ; 比较R1和R2更新标志 ORN R3, R4, R5 R3 R4 OR NOT(R5) MOVEQ R0, #1 ; 如果R1R2则R01 MOVNE R0, #0 ; 如果R1!R2则R00 ADDVS R3, R4, R5 ; 如果溢出则执行加法 SUBCS R6, R7, R8 ; 如果无符号更高或相等则执行减法### 64位示例 assembly MOVZ X0, #0x1234 将0x1234放入X0的0-15位 MOVK X0, #0x5678, LSL #16 将0x5678放入X0的16-31位 MOVK X0, #0x9ABC, LSL #32 将0x9ABC放入X0的32-47位 LDRSB X1, [X2] 从X2指向的地址加载一个有符号字节到X1符号扩展 LDRSH X3, [X4] 从X4指向的地址加载一个有符号半字到X3符号扩展 LDRSW X5, [X6] 从X6指向的地址加载一个有符号32位到X5符号扩展到64位 CMP X1, X2 ; 比较X1和X2更新标志 ORN X3, X4, X5 X3 X4 OR NOT(X5) CSET X0, EQ ; 如果X1X2则X01否则X00 CINC X5, X5, LT ; 如果X1X2则X5 CSINC X3, X4, X5, GT ; 如果X1X2则X3X41否则X3X51十、标志位在分支中的应用32位架构BEQ label等于时分支BNE label不等于时分支BCS/PHS label无符号更高或相同时分支BCC/PLO label无符号更低时分支BMI label负数时分支BPL label正数或零时分支BVS label溢出时分支BVC label无溢出时分支BHI label无符号更高时分支BLS label无符号更低或相等时分支BGE label有符号大于或等于时分支BLT label有符号小时分支BGT label有符号大于时分支BLE label有符号小于或等于时分支64位架构条件分支指令类似B.EQ、B.NE等另外还有循环指令CBZ如果零则跳转、CBNZ如果非零则跳转计数循环TBZ测试位零跳转、TBNZ测试位非零跳转十一、32位与64位的主要差异对比特性ARM 32位 (AArch32)ARM 64位 (AArch64)寄存器数量16个32位通用寄存器32个64位通用寄存器寄存器大小32位64位兼容32位操作地址空间32位地址4GB64位地址理论上2^64栈指针R13 (SP)SP (独立的64位寄存器)链接寄存器R14 (LR)X30 (LR)程序计数器R15 (PC)PC不能直接访问状态寄存器CPSRNZCV分离的条件标志指令编码32位固定长度32位固定长度函数参数传递R0-R3用于参数X0-X7用于参数标志更新大多数指令需S后缀更新标志更多指令默认更新标志条件执行指令后缀如ADDEQ专用条件指令如CSET大常数加载MOVW/MOVTMOVZ/MOVK符号扩展加载LDRSB/LDRSHLDRSB/LDRSH/LDRSW十二、特殊功能指令同步原语32位和64位都有LDREX/STREX独占加载/存储CLREX清除独占监控SWP交换已废弃系统控制MSRMove to System RegisterMRSMove from System RegisterDMBData Memory BarrierDSBData Synchronization BarrierISBInstruction Synchronization Barrier编程示例对比32位示例加载不同数据类型assembly .global _start _start: MOVW R0, #0x1234 设置低16位 MOVT R0, #0x5678 设置高16位此时R0 0x56781234 LDRB R1, [R2] 加载无符号字节零扩展到32位 LDRSB R3, [R4] 加载有符号字节符号扩展到32位 LDRH R5, [R6] 加载无符号半字零扩展到32位 LDRSH R7, [R8] 加载有符号半字符号扩展到32位 CMP R1, R2 ; 比较R1和R2更新标志 ORN R3, R4, R5 R3 R4 OR NOT(R5) BEQ skip 如果结果为零则跳过 MOV R3, #20 将立即数20放入R3 skip: B . 无限循环#### 64位示例加载不同数据类型 assembly .global _start _start: MOVZ X0, #0x1234 设置最低16位 MOVK X0, #0x5678, LSL #16 设置次低16位 MOVK X0, #0x9ABC, LSL #32 设置次高16位 MOVK X0, #0xDEF0, LSL #48 设置最高16位 LDRB W1, [X2] 加载无符号字节零扩展到32位 LDRSB X3, [X4] 加载有符号字节符号扩展到64位 LDRH W5, [X6] 加载无符号半字零扩展到32位 LDRSH X7, [X8] 加载有符号半字符号扩展到64位 LDRSW X9, [X10] 加载32位符号扩展到64位 CMP X1, X2 ; 比较X1和X2更新标志 ORN X3, X4, X5 X3 X4 OR NOT(X5) B.EQ skip 如果结果为零则跳过 MOV X3, #20 将立即数20放入X3 skip: B . 无限循环十三、浮点运算指令ARM架构支持IEEE 754标准的浮点运算主要通过VFPVector Floating Point和NEON单元实现。在AArch64中这些功能由高级SIMDNEON和浮点组件提供。32位架构中的浮点指令VFPv3/VFPv4ARM 32位架构中的浮点单元FPU通常实现了VFPv3或VFPv4扩展提供了单精度32位和双精度64位浮点运算支持。浮点寄存器VFP单元包含32个浮点寄存器S0-S31单精度或16个双精度寄存器D0-D15在VFPv3-D16模式下可以访问32个双精度寄存器D0-D31也可以表示为Q0-Q15四字寄存器128位用于SIMD操作这些寄存器实际上共享同一片物理存储区域Dn对应S2n和S2n1Qn对应D2n和D2n1浮点控制寄存器FPSCRFloating Point Status and Control Register控制和状态寄存器包含累积异常标志、舍入模式、异常使能位和状态标志通过FMXR/FMRX指令访问浮点数据传输指令VMOV Sd, Rt在通用寄存器和单精度浮点寄存器之间传送数据VMOV Rt, Sd从单精度浮点寄存器向通用寄存器传送数据VMOV.S32 Sd, #imm32将立即数加载到单精度浮点寄存器VLDR Sd, [Rn, #offset]从内存加载单精度浮点数到寄存器VSTR Sd, [Rn, #offset]将单精度浮点数存储到内存VLDR Dd, [Rn, #offset]从内存加载双精度浮点数到寄存器VSTR Dd, [Rn, #offset]将双精度浮点数存储到内存浮点算术运算指令VADD.Sd, Sn, Sm浮点加法VSUB.Sd, Sn, Sm浮点减法VMUL.Sd, Sn, Sm浮点乘法VDIV.Sd, Sn, Sm浮点除法VNEG.Sd, Sm浮点取反VABS.Sd, Sm浮点绝对值VSQRT.Sd, Sm浮点平方根VMLA.Sd, Sn, Sm浮点乘加Sd Sn Sm * SdVMLS.Sd, Sn, Sm浮点乘减Sd Sn - Sm * Sd浮点比较指令VCMP.Sd, Sm浮点比较与0比较VCMP.Sd, Sm, P浮点比较包括静默NaNVCMPE.Sd, Sm浮点比较并更新APSR标志VCMPE.Sd, Sm, P浮点比较并更新APSR标志包括静默NaN浮点转换指令VCVT.S32.F32 Sd, Sm浮点到整数转换向零截断VCVT.U32.F32 Sd, Sm浮点到无符号整数转换VCVT.F32.S32 Sd, Sm整数到浮点转换VCVT.F32.U32 Sd, Sm无符号整数到浮点转换VCVT.F64.F32 Sd, Sm单精度到双精度转换VCVT.F32.F64 Sd, Sm双精度到单精度转换64位架构中的浮点指令AArch64AArch64架构内置了完整的浮点和SIMD支持提供了32个128位宽的寄存器V0-V31可用于浮点和SIMD操作。浮点寄存器表示V0-V31128位向量寄存器可作为不同宽度使用16字节128位Qn8字节64位Dn4字节32位Sn2字节16位Hn1字节8位Bn所有这些表示方法都引用同一个物理寄存器的不同部分浮点控制寄存器FPCRFloating-Point Control Register浮点控制寄存器控制舍入模式、异常使能等FPSRFloating-Point Status Register浮点状态寄存器包含异常标志、状态标志等浮点数据传输指令FMov Dd, Dn浮点寄存器间传送双精度数FMov Sd, Sn浮点寄存器间传送单精度数FMov Dd, Rn将通用寄存器的64位值传送到浮点寄存器FMov Rn, Dd将浮点寄存器的64位值传送到通用寄存器FMov Sd, Wn将通用寄存器的32位值传送到浮点寄存器FMov Wn, Sd将浮点寄存器的32位值传送到通用寄存器LDR Sd, [Xn, #offset]加载单精度浮点数STR Sd, [Xn, #offset]存储单精度浮点数LDR Dd, [Xn, #offset]加载双精度浮点数STR Dd, [Xn, #offset]存储双精度浮点数LDR Qd, [Xn, #offset]加载128位向量数据浮点算术运算指令FAdd Sd, Sn, Sm单精度浮点加法FSub Sd, Sn, Sm单精度浮点减法FMul Sd, Sn, Sm单精度浮点乘法FDiv Sd, Sn, Sm单精度浮点除法FSqrt Sd, Sn单精度浮点平方根FNeg Sd, Sn单精度浮点取反FAbs Sd, Sn单精度浮点绝对值FMax Sd, Sn, Sm单精度浮点最大值FMin Sd, Sn, Sm单精度浮点最小值FNMul Sd, Sn, Sm单精度浮点负乘法FAdd Dd, Dn, Dm双精度浮点加法FSub Dd, Dn, Dm双精度浮点减法FMul Dd, Dn, Dm双精度浮点乘法FDiv Dd, Dn, Dm双精度浮点除法FSqrt Dd, Dn双精度浮点平方根FNeg Dd, Dn双精度浮点取反FAbs Dd, Dn双精度浮点绝对值FMax Dd, Dn, Dm双精度浮点最大值FMin Dd, Dn, Dm双精度浮点最小值浮点融合乘加指令FMAdd Sd, Sn, Sm, Sa单精度融合乘加Sd Sn × Sm SaFMSub Sd, Sn, Sm, Sa单精度融合乘减Sd Sn × Sm - SaFNMAdd Sd, Sn, Sm, Sa单精度融合负乘加Sd -(Sn × Sm) SaFNMSub Sd, Sn, Sm, Sa单精度融合负乘减Sd -(Sn × Sm) - SaFMAdd Dd, Dn, Dm, Da双精度融合乘加FMSub Dd, Dn, Dm, Da双精度融合乘减FNMAdd Dd, Dn, Dm, Da双精度融合负乘加FNMSub Dd, Dn, Dm, Da双精度融合负乘减浮点比较指令FCmp Sd, Sm单精度浮点比较FCmp Dd, Dm双精度浮点比较FCMPE Sd, Sm单精度浮点比较并异常FCMPE Dd, Dm双精度浮点比较并异常浮点转换指令SCVTF Sd, Wn有符号整数到单精度浮点转换SCVTF Dd, Wn有符号整数到双精度浮点转换SCVTF Sd, Xn64位有符号整数到单精度浮点转换SCVTF Dd, Xn64位有符号整数到双精度浮点转换UCVTF Sd, Wn无符号整数到单精度浮点转换UCVTF Dd, Wn无符号整数到双精度浮点转换UCVTF Sd, Xn64位无符号整数到单精度浮点转换UCVTF Dd, Xn64位无符号整数到双精度浮点转换FCVT Dd, Sn单精度到双精度转换FCVT Sn, Dn双精度到单精度转换FCVTZS Wd, Sn单精度浮点到有符号整数转换向零截断FCVTZS Wd, Dn双精度浮点到有符号整数转换向零截断FCVTZS Xd, Sn单精度浮点到64位有符号整数转换向零截断FCVTZS Xd, Dn双精度浮点到64位有符号整数转换向零截断FCVTZU Wd, Sn单精度浮点到无符号整数转换向零截断FCVTZU Xd, Sn单精度浮点到64位无符号整数转换向零截断浮点运算控制ARM浮点单元遵循IEEE 754标准支持多种舍入模式RNRound to Nearest向最近值舍入默认RPRound towards Plus Infinity向正无穷方向舍入RMRound towards Minus Infinity向负无穷方向舍入RZRound towards Zero向零舍入在AArch64中可以通过FPCR浮点控制寄存器配置舍入模式和其他浮点特性。浮点编程示例32位示例简单的浮点计算.global _start _start: VMOV.S32 S0, #0x40000000 S0 2.0 (IEEE 754单精度) VLDR S1, 3.5 从内存加载3.5到S1 VADD.S2, S0, S1 S2 S0 S1 2.0 3.5 5.5 VMUL.S3, S2, S0 S3 S2 * S0 5.5 * 2.0 11.0 VCMP.S3, S1 比较S3和S1 VMRS APSR_nzcv, FPSCR 将浮点状态标志复制到普通状态标志 BEQ equal_label 如果相等则跳转 B . 无限循环 equal_label: B . 无限循环64位示例简单的浮点计算.global _start _start: FMOV S0, #2.0 S0 2.0 LDR S1, 3.5 从内存加载3.5到S1 FADD S2, S0, S1 S2 S0 S1 2.0 3.5 5.5 FMUL S3, S2, S0 S3 S2 * S0 5.5 * 2.0 11.0 FCMP S3, S1 比较S3和S1 B.EQ equal_label 如果相等则跳转 B . 无限循环 equal_label: B . 无限循环

更多文章