11 badman250

尚未进行身份认证

我要认证

专注分享IT知识技能

等级
TA的排名 22

第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

第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

第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

第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

第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

第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

第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

第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

第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

第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

第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

第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

第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

第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

第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

第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

第13部分- Linux ARM汇编 移位操作

第13部分- Linux ARM汇编 移位操作ARM语法中的 移位操作如下,也是寻址的一种方法。在寻址方法中还会看到。寄存器移位寻址是ARM指令集特有的寻址方式,和寄存器寻址类似,只是操作前需要对寄存器操作数进行移位操作。LSL:逻辑左移,移位后寄存器空出的低位补0。可以是立即数或寄存器。LSR:逻辑右移,移位后寄存器空出的高位补0。ASR:算术右移,移位过程中,符号位保持不变,如果源操作数是正数,则空出的高位补0,否则补1.ROR:循环右移,类似LSR,移位后移除的低位填入空出的高位

2020-06-06 17:07:43

第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

第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

第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

查看更多

勋章 我的勋章
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024超级勋章
    1024超级勋章
    授予原创文章总数达到1024篇的博主,感谢你对CSDN社区的贡献,CSDN与你一起成长。
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 分享王者
    分享王者
    成功上传51个资源即可获取