64位 ARM处理器汇编技术系列
badman250
专注分享IT知识技能
展开
-
第7部分- Linux ARM汇编 X86和ARM64部分汇编差异
第7部分- Linux ARM汇编 X86和ARM64部分汇编差异X86和ARM64部分汇编差异 x86 Mnemonic A64 Mnemonic Instruction MOVZX UXT Zero-Extend. MOVSX SXT Sign-Extend. BSWAP .原创 2020-06-05 21:43:27 · 743 阅读 · 0 评论 -
第29部分- Linux ARM汇编 术语和参考
第29部分- Linux ARM汇编 术语和参考术语AAPCS:ARM Architecture Procedure Call Standard.TrustedOS: This is the operating system running in the Secure World. It supports the execution of trusted applications in Secure EL0. When EL3 is using AArch64 it executes in...原创 2020-06-08 22:40:11 · 666 阅读 · 6 评论 -
第28部分- Linux ARM汇编 编译/链接/加载
第28部分- Linux ARM汇编 编译/链接/加载编译编译参数-march=armv7-a:指定编译时arm架构(即代码要运行的架构)。-mfloat-abi=softfp:soft/softfp/hard。soft(软浮点):表明不是用FPU硬件,使用GCC整数算术库来模拟浮点运算-mfpu=neon-vfpv4,参数-mfpu就是用来指定要产生那种硬件浮点运算指令。常用的有vfpv3,vfpv4,neon等,hi3536 A17支持的是neon+vfpv4相结合的结构。连原创 2020-06-07 09:39:07 · 842 阅读 · 0 评论 -
第27部分- Linux ARM汇编 Thumb
第27部分- Linux ARM汇编 ThumbThumb是ARM指令的重新编码子集,每个指令仅占用16位。 这意味着将不得不放弃一些指令。 作为一个好处,代码密度更高:大多数时候,将能够在一半的空间内对程序的代码进行编码。一个函数必须完全是ARM或Thumb,它不能是两个指令集的混合。Thumb-2ARMv7在ARMv6架构的基础上诞生了Thumb-2技术。ARMv7还采用了NEON技术,将DSP和媒体处理能力提供了近4倍,并支持改良的浮点运算。...原创 2020-06-07 09:39:02 · 572 阅读 · 1 评论 -
第26部分- Linux ARM汇编 浮点和向量
第26部分- Linux ARM汇编 浮点和向量二进制浮点数是一个实数的近似表示,由三个部分组成:符号,尾数和指数。1.01110是20+ 2-2+ 2-3+ 2-4= 1.43750(10)VFPv2支持两个IEEE 754数字:Binary32和Binary64,通常以其C类型分别为float和double或单精度和双精度。在单精度浮点中,尾数为23位(归一化数字为整数1的+1),指数为8位(因此指数范围为-126到127)。在双精度浮点中,尾数为52位(+1),指数...原创 2020-06-07 09:38:46 · 3780 阅读 · 0 评论 -
第25部分- Linux ARM汇编NEON基础知识
第25部分- Linux ARM汇编NEON基础知识浮点指令除了VFP还有NEON。NEON 支持整数、定点和单精度浮点 SIMD 运算。NEON 是针对高级媒体和信号处理应用程序以及嵌入式处理器的 64/128 位混合 SIMD 技术。 它是作为 ARM内核的一部分实现的,但有自己的执行管道和寄存器组,该寄存器组不同于ARM 核心寄存器组。VFP指令用FADD,NEON指令用VADD。NEON指令集比VFP指令集更广泛,因此,尽管大多数VFP指令具有等效的NEON指令,但仍有许多...原创 2020-06-07 09:38:41 · 3632 阅读 · 0 评论 -
第24部分- Linux ARM汇编 内联汇编
第24部分- Linux ARM汇编 内联汇编内联汇编如下:#include <stdio.h> int add(int i, int j) { int res = 0; asm ( "ADD %w[result], %w[input_i], %w[input_j]" : [result] "=r" (res) : [input_i] "r" (i), [input_j] "r" (j) ); return res; } int main(void) {原创 2020-06-07 09:38:40 · 530 阅读 · 0 评论 -
第23部分- Linux ARM汇编ARM32到ARM64迁移
第23部分- Linux ARM汇编ARM32到ARM64迁移1、在32位ARM系统中,可以通过指令本身中的条件字段来支持的分支判断。 例如在T32中,有用于构建条件序列的IT(如果-则-then)指令。 A64不支持此功能,但有一组不同的特定条件说明。2、64位仍可以对第二个操作数进行移位,旋转和符号扩展或零扩展,但A64位不支持以相同的方式将移位和旋转操作“嵌入”到数据处理指令中。3、通常不再可以访问程序计数器(PC)。 特别是,它不能像其他通用寄存器一样被读取或修改。 有伪指令可用于间接使原创 2020-06-07 09:38:41 · 1499 阅读 · 1 评论 -
第22部分- Linux ARM汇编分支指令
第22部分- Linux ARM汇编分支指令在32位ARM系统中,可以通过指令本身中的条件字段来支持的分支判断。 例如在T32中,有用于构建条件序列的IT(如果-则-then)指令。 A64不支持此功能,但有一组不同的特定条件说明。32位预测分支源代码如下:.text.global mainmain: mov r1, #123 /* r1 ← 123 */ mov r2, #0 /* r2 ← 0 */loop: .原创 2020-06-07 09:38:23 · 1209 阅读 · 0 评论 -
第21部分- Linux ARM汇编adrp指令
ADR指令作用:小范围的地址读取指令。ADR 指令将基于PC 相对偏移的地址值读取到寄存器中。原理:将有符号的21位的偏移,加上PC, 结果写入到通用寄存器,可用来计算+/-1MB范围的任意字节的有效地址。ADRP作用:以页为单位的大范围的地址读取指令,这里的P就是page的意思。原理:符号扩展一个21位的offset(immhi+immlo), 向左移动12位,PC的值的低12位清零,然后把这两者相加,结果写入到Xd寄存器,用来得到一块含有lable的4KB对齐内存区域的base地...原创 2020-06-07 09:38:19 · 2134 阅读 · 0 评论 -
第20部分- Linux ARM汇编 函数调用斐波那契数列实现
斐波那契数列64位示例.data msg_input: .asciz "Please type a number: "scanf_fmt : .asciz "%d"msg_output: .asciz "Fibonacci number %d is %ld\n" .text.global _start_start: stp x19, x30, [sp, #-16]! // Keep x19 and x30 (link register) sub sp, sp, #16原创 2020-06-07 09:38:13 · 1565 阅读 · 0 评论 -
第19部分- Linux ARM汇编 函数调用栈使用-阶乘
第19部分- Linux ARM汇编 函数调用栈使用-阶乘调用栈我们以阶乘为例。阶乘比较经典。堆栈定义:堆栈是仅由当前动态激活拥有的内存区域。我们先来看下阶乘的C代码如下:int factorial(int n){ if (n == 0) return 1; else return n * factorial(n-1);}阶乘示例32位.datamessage1: .asciz "Type a number: "format: .原创 2020-06-07 09:38:08 · 1193 阅读 · 1 评论 -
第18部分- Linux ARM汇编 函数调用示例
第18部分- Linux ARM汇编 函数调用示例我们先来看个函数调用的示例。32位定义函数如下,位于文件中:.data.balign 4return2: .word 0.text.type mult_by_5,function.globl mult_by_5mult_by_5: ldr r1, address_of_return2 /* r1 ← &address_of_return */ str lr, [r1] .原创 2020-06-06 17:09:08 · 514 阅读 · 0 评论 -
第17部分- Linux ARM汇编 交互的示例
第17部分- Linux ARM汇编 交互的示例我们先来看个交互的示例。32位.data/* First message */.balign 4message1: .asciz "Hey, type a number: " /* Second message */.balign 4message2: .asciz "I read the number %d\n" /* Format pattern for scanf */.balign 4scan_pattern : .原创 2020-06-06 17:08:48 · 2651 阅读 · 0 评论 -
第16部分- Linux ARM汇编 ARM64调用标准
第16部分- Linux ARM汇编 ARM64调用标准本章主要是是一些描述性的内容,我们先来看下4个术语。AArch32– the legacy 32-bit instruction set architecture (ISA) defined by ARM, including Thumb mode execution. AArch64– the new 64-bit instruction set architecture (ISA) defined by ARM. ARMv7– t...原创 2020-06-06 17:08:04 · 840 阅读 · 0 评论 -
第15部分- Linux ARM汇编 ARM32函数调用
第15部分- Linux ARM汇编 ARM32函数调用函数调用需要遵循函数调用个规则,否则调用之后就无法再回来了。ARM的规则是:Procedure Call Standard for the ARM Architecture简称就是AAPCS了。32位函数传递特殊的寄存器,在32位中r15是pc寄存器。此外,还有r14是lr, r13是sp寄存器。lr表示link register,调用指令之后的指令地址(我们将在后面看到这是什么)。sp是堆栈寄存器。函数的前4个原创 2020-06-06 17:07:57 · 1177 阅读 · 0 评论 -
第14部分- Linux ARM汇编数组/结构体/索引
第14部分- Linux ARM汇编数组/结构体/索引我们先来看下,如果在C代码中两个定义如下,一个数组和一个结构体。 int a[100]; struct my_struct { char f0; int f1; } b; 在32位ARM汇编中的定义如下: .data.balign 4a: .skip 400.balign 4b: .skip 8 结构体my_struct实际是5个...原创 2020-06-06 17:07:50 · 1640 阅读 · 0 评论 -
第13部分- Linux ARM汇编 移位操作
第13部分- Linux ARM汇编 移位操作ARM语法中的 移位操作如下,也是寻址的一种方法。在寻址方法中还会看到。寄存器移位寻址是ARM指令集特有的寻址方式,和寄存器寻址类似,只是操作前需要对寄存器操作数进行移位操作。LSL:逻辑左移,移位后寄存器空出的低位补0。可以是立即数或寄存器。LSR:逻辑右移,移位后寄存器空出的高位补0。ASR:算术右移,移位过程中,符号位保持不变,如果源操作数是正数,则空出的高位补0,否则补1.ROR:循环右移,类似LSR,移位后移除的低位填入空出的高位原创 2020-06-06 17:07:43 · 1124 阅读 · 1 评论 -
第12部分- Linux ARM汇编 控制指令/冰雹猜想
第12部分- Linux ARM汇编 控制指令/冰雹猜想ARM的汇编控制如下:IF、ELSE及ENDIF WHILE及WEND MACRO及WEND MEXIT32位示例完成1+2+…+22。.text.global mainmain: mov r1, #0 /* r1 ← 0 */ mov r2, #1 /* r2 ← 1 */loop: cmp r2, #22 /* compare r2 and 22 */.原创 2020-06-06 17:07:38 · 426 阅读 · 0 评论 -
第11部分- Linux ARM汇编 执行分支
第11部分- Linux ARM汇编 执行分支在32位的ARM架构系统中,通用寄存器中有一个寄存器比较特殊,就是r15,它也是PC寄存器。PC是program counter。也叫做ip,instruction pointer。当ARM处理器执行一条指令时,在其执行结束时可能会发生两件事。 如果指令没有修改pc,则pc只会增加4,因为在32位ARM中,指令为32位宽,所以每条指令之间有4个字节。 如果指令修改了pc,则使用pc的新值。当然64位的ARM就是增加8了每次指令过后。如果一条指令确原创 2020-06-06 17:07:32 · 369 阅读 · 0 评论 -
第10部分- Linux ARM汇编 寻址方式
第10部分- Linux ARM汇编 寻址方式都遵循gas汇编器的语法。立即寻址指令后面的地址码部分为立即数 MOV RO, #1234寄存器寻址中,操作数在寄存器中,指令执行时直接从寄存器中取值进行操作。 MOV R0, R1寄存器移位寻址是ARM指令集特有的寻址方式,和寄存器寻址类似,只是操作前需要对寄存器操作数进行移位操作。LSL:逻辑左移,移位后寄存器空出的低位补0。LSR:逻辑右移,移位后寄存器空出的高位补0。ASR:算术右移,移位过程...原创 2020-06-06 17:07:26 · 488 阅读 · 0 评论 -
第9部分- Linux ARM汇编 语法
第9部分- Linux ARM汇编 语法AArch64上基本所有指令都有3个操作符。一个目标寄存器和2个源寄存器。例如:add w5, w3, w4 // w5 ← w3 + w4或者:add x5, x3, x4 // x5 ← x3 + x4可以第32个通用寄存器:add w0, w1, wzr // w0 ← w1 + 0add w0, w1, #2 // w0 ← w1 + 2add w0, w1, #-2 // w0...原创 2020-06-06 17:05:47 · 1599 阅读 · 0 评论 -
第8部分- Linux ARM汇编 定义操作
第8部分- Linux ARM汇编 定义操作符号定义操作其中GBLA、GBLL及GBLS声明全局变量LCLA、LCLL及LCLS声明局部变量SETA、SETL及SETS给变量赋值RLIST为通用寄存器列表定义名称CN为协处理器的寄存器定义名称CP为协处理器定义名称DN及SN:为VFP的寄存器定义名称FN为FPA的浮点寄存器定义名称。数据定义操作LTORG声明一个数据缓冲池的开始MAP定义一个结构化的内存表的首地址FIELD定义结构化的内存表中的一.原创 2020-06-05 21:43:35 · 474 阅读 · 0 评论 -
第6部分- Linux ARM汇编 指令集概要
第6部分- Linux ARM汇编 指令集概要ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器传输指令、Load/Store指令、协处理器指令和异常中断产生指令6类。 ARM指令长为固定的32位。典型的ARM指令编码格式如下:Opcode:指令操作符编码Cond是指令执行的条件编码S是决定指令的操作是否影响CPSR的值Rd目标寄存器编码Rn包含第一个操作数的寄存器编码Shifter_operand:表示第2个操作数。条件码条件...原创 2020-06-05 21:43:23 · 611 阅读 · 0 评论 -
第5部分- Linux ARM汇编 ARM 架构细节
第5部分- Linux ARM汇编 ARM 架构细节ARM处理器有37个寄存器,包括31个通用寄存器,和6个状态寄存器。通用寄存器是31个从x0-x30,31个数量是比较奇怪的,其实还有一个是Zero Register是wzr。如果是使用寄存器中的32位,就是w0-w30了。类型X86中的rax和eax寄存器,一个64位一个32位。ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组响应的寄存器组。在AArch64时使用X30作为子函数调用时使用的link register在原创 2020-06-05 21:43:16 · 2845 阅读 · 0 评论 -
第4部分- Linux ARM汇编首个程序
第4部分- Linux ARM汇编首个程序首个64位汇编我们先创建第一个AArch64上的首个汇编程序,这个64位代码是我在一个ARMv8服务器上运行的。有国产的华为鲲鹏/飞腾,非国产的也可以是安培或者Cavium。first64.s.arch armv8-a.global _start.text_start: mov x8, 93 svc 0编译:as -g -o first64.o first64.sld -o first64 first64.o在armv8原创 2020-06-05 21:43:10 · 430 阅读 · 0 评论 -
第3部分- Linux ARM汇编引言
第3部分- Linux汇编 引言为什么要学汇编摘自书籍Whyshould engineers and programmers spend time learning to program in assemblylanguage? The reasons presented in the first edition are as valid today as in 2009,perhaps even more so. The complexity of the modern SoCs原创 2020-06-05 21:43:09 · 372 阅读 · 0 评论 -
第2部分- Linux ARM汇编ARM指令集变化和优势
第2部分- Linux汇编ARM指令集变化和优势指令集变化T32,A32和A64指令集与可能导致它们之间切换的事件之间的关系。指令集架构调整ARMv4及之前:只使用32位的ARM指令集。ARMv4T,在32位ARM指令集的基础上,增加了16位的Thumb指令集。这是第一个被广泛使用的架构,代表芯片ARM7TDMI和ARM9TDMI。 ARMv5TE,增加了DSP操作,饱和算法,ARM和Thumb切换。代表芯片:ARM926EJ-S。 ARM v6,对内存访问的架构有所..原创 2020-06-05 21:43:03 · 478 阅读 · 0 评论 -
第1部分- Linux ARM汇编-ARM技术变迁演进和ARMv8-a架构
第1部分- Linux汇编ARM技术变迁关于ARM版本先来看下ARM版本如下图:Tips:Cortex-A53同样是采取了ARMv8-A架构,能够支持32位的ARMv7代码和64位代码的AArch64执行状态。ARM Cortex内核系列提供非常广泛的具有可扩展性的性能选项,设计人员有机会在多种选项中选择最适合自身应用的内核,而非千篇一律的采用同一方案。Cortex系列组合大体上分为三种类别:Cortex-A—面向性能密集型系统的应用处理器内核 Cortex-R—面向实时应用的原创 2020-06-05 21:43:00 · 685 阅读 · 0 评论