自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

badman250的专栏

分享一个Linux性能诊断网站:http://linuxperformance.top/ ,访问有收获

原创 第29部分- Linux ARM汇编 术语和参考

第29部分- Linux ARM汇编 术语和参考 术语 AAPCS:ARM Architecture Procedure Call Standard. TrustedOS: This is the operating system running in the Secure World. I...

2020-06-08 22:40:11 61 0

原创 第28部分- Linux ARM汇编 编译/链接/加载

第28部分- Linux ARM汇编 编译/链接/加载 编译 编译参数 -march=armv7-a:指定编译时arm架构(即代码要运行的架构)。 -mfloat-abi=softfp:soft/softfp/hard。 soft(软浮点):表明不是用FPU硬件,使用GCC整数算术库来模...

2020-06-07 09:39:07 51 0

原创 第27部分- Linux ARM汇编 Thumb

第27部分- Linux ARM汇编 Thumb Thumb是ARM指令的重新编码子集,每个指令仅占用16位。 这意味着将不得不放弃一些指令。 作为一个好处,代码密度更高:大多数时候,将能够在一半的空间内对程序的代码进行编码。 一个函数必须完全是ARM或Thumb,它不能是两个指令集的混合。 ...

2020-06-07 09:39:02 59 0

原创 第26部分- Linux ARM汇编 浮点和向量

第26部分- Linux ARM汇编 浮点和向量 二进制浮点数是一个实数的近似表示,由三个部分组成:符号,尾数和指数。 1.01110是20+ 2-2+ 2-3+ 2-4= 1.43750(10) VFPv2支持两个IEEE 754数字:Binary32和Binary64,通常以其C类型...

2020-06-07 09:38:46 76 0

原创 第23部分- Linux ARM汇编ARM32到ARM64迁移

第23部分- Linux ARM汇编ARM32到ARM64迁移 1、在32位ARM系统中,可以通过指令本身中的条件字段来支持的分支判断。 例如在T32中,有用于构建条件序列的IT(如果-则-then)指令。 A64不支持此功能,但有一组不同的特定条件说明。 2、64位仍可以对第二个操作数进行移...

2020-06-07 09:38:41 309 0

原创 第25部分- Linux ARM汇编NEON基础知识

第25部分- Linux ARM汇编NEON基础知识 浮点指令除了VFP还有NEON。 NEON 支持整数、定点和单精度浮点 SIMD 运算。 NEON 是针对高级媒体和信号处理应用程序以及嵌入式处理器的 64/128 位混合 SIMD 技术。 它是作为 ARM内核的一部分实现的,但有自己的...

2020-06-07 09:38:41 54 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[...

2020-06-07 09:38:40 57 0

原创 第22部分- Linux ARM汇编分支指令

第22部分- Linux ARM汇编分支指令 在32位ARM系统中,可以通过指令本身中的条件字段来支持的分支判断。 例如在T32中,有用于构建条件序列的IT(如果-则-then)指令。 A64不支持此功能,但有一组不同的特定条件说明。 32位预测分支 源代码如下: .text .glob...

2020-06-07 09:38:23 137 0

原创 第21部分- Linux ARM汇编adrp指令

ADR指令作用:小范围的地址读取指令。ADR 指令将基于PC 相对偏移的地址值读取到寄存器中。 原理:将有符号的21位的偏移,加上PC, 结果写入到通用寄存器,可用来计算+/-1MB范围的任意字节的有效地址。 ADRP作用:以页为单位的大范围的地址读取指令,这里的P就是page的意思。 ...

2020-06-07 09:38:19 90 0

原创 第20部分- Linux ARM汇编 函数调用斐波那契数列实现

斐波那契数列64位示例 .data msg_input: .asciz "Please type a number: " scanf_fmt : .asciz "%d" msg_output: .asciz "Fibonacci numbe...

2020-06-07 09:38:13 70 0

原创 第19部分- Linux ARM汇编 函数调用栈使用-阶乘

第19部分- Linux ARM汇编 函数调用栈使用-阶乘 调用栈我们以阶乘为例。阶乘比较经典。 堆栈定义:堆栈是仅由当前动态激活拥有的内存区域。 我们先来看下阶乘的C代码如下: int factorial(int n) { if (n == 0) return 1; ...

2020-06-07 09:38:08 51 0

原创 第18部分- Linux ARM汇编 函数调用示例

第18部分- Linux ARM汇编 函数调用示例 我们先来看个函数调用的示例。 32位 定义函数如下,位于文件中: .data .balign 4 return2: .word 0 .text .type mult_by_5,function .globl mult_by_5 mul...

2020-06-06 17:09:08 29 0

原创 第17部分- Linux ARM汇编 交互的示例

第17部分- Linux ARM汇编 交互的示例 我们先来看个交互的示例。 32位 .data /* First message */ .balign 4 message1: .asciz "Hey, type a number: " /* Second messa...

2020-06-06 17:08:48 184 0

原创 第16部分- Linux ARM汇编 ARM64调用标准

第16部分- Linux ARM汇编 ARM64调用标准 本章主要是是一些描述性的内容,我们先来看下4个术语。 AArch32– the legacy 32-bit instruction set architecture (ISA) defined by ARM, including Thu...

2020-06-06 17:08:04 69 0

原创 第15部分- Linux ARM汇编 ARM32函数调用

第15部分- Linux ARM汇编 ARM32函数调用 函数调用需要遵循函数调用个规则,否则调用之后就无法再回来了。 ARM的规则是: Procedure Call Standard for the ARM Architecture 简称就是AAPCS了。 32位函数传递 特殊的寄存...

2020-06-06 17:07:57 47 0

原创 第14部分- Linux ARM汇编数组/结构体/索引

第14部分- Linux ARM汇编数组/结构体/索引 我们先来看下,如果在C代码中两个定义如下,一个数组和一个结构体。 int a[100]; struct my_struct { char f0; int f1; } b; ...

2020-06-06 17:07:50 142 0

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

第13部分- Linux ARM汇编 移位操作 ARM语法中的 移位操作如下,也是寻址的一种方法。在寻址方法中还会看到。 寄存器移位寻址是ARM指令集特有的寻址方式,和寄存器寻址类似,只是操作前需要对寄存器操作数进行移位操作。 LSL:逻辑左移,移位后寄存器空出的低位补0。可以是立即数或寄存器...

2020-06-06 17:07:43 42 0

原创 第12部分- Linux ARM汇编 控制指令/冰雹猜想

第12部分- Linux ARM汇编 控制指令/冰雹猜想 ARM的汇编控制如下: IF、ELSE及ENDIF WHILE及WEND MACRO及WEND MEXIT 32位示例 完成1+2+…+22。 .text .global main main: mov r1, #...

2020-06-06 17:07:38 59 0

原创 第11部分- Linux ARM汇编 执行分支

第11部分- Linux ARM汇编 执行分支 在32位的ARM架构系统中,通用寄存器中有一个寄存器比较特殊,就是r15,它也是PC寄存器。 PC是program counter。也叫做ip,instruction pointer。 当ARM处理器执行一条指令时,在其执行结束时可能会发生两件...

2020-06-06 17:07:32 69 0

原创 第10部分- Linux ARM汇编 寻址方式

第10部分- Linux ARM汇编 寻址方式 都遵循gas汇编器的语法。 立即寻址指令后面的地址码部分为立即数 MOV RO, #1234 寄存器寻址中,操作数在寄存器中,指令执行时直接从寄存器中取值进行操作。 MOV R0, R1 寄存器移位寻址是ARM指令集特有的寻址方式,和寄存...

2020-06-06 17:07:26 100 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个通用寄存器:...

2020-06-06 17:05:47 38 0

原创 第8部分- Linux ARM汇编 定义操作

第8部分- Linux ARM汇编 定义操作 符号定义操作 其中 GBLA、GBLL及GBLS声明全局变量 LCLA、LCLL及LCLS声明局部变量 SETA、SETL及SETS给变量赋值 RLIST为通用寄存器列表定义名称 CN为协处理器的寄存器定义名称 CP为协处理器定义名称 ...

2020-06-05 21:43:35 46 0

原创 第7部分- Linux ARM汇编 X86和ARM64部分汇编差异

第7部分- Linux ARM汇编 X86和ARM64部分汇编差异 X86和ARM64部分汇编差异 x86 Mnemonic A64 Mnemonic Instruction MOVZX UXT ...

2020-06-05 21:43:27 52 0

原创 第6部分- Linux ARM汇编 指令集概要

第6部分- Linux ARM汇编 指令集概要 ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器传输指令、Load/Store指令、协处理器指令和异常中断产生指令6类。 ARM指令长为固定的32位。典型的ARM指令编码格式如下: Opcode:指令操作符编码 Cond是指令...

2020-06-05 21:43:23 196 0

原创 第5部分- Linux ARM汇编 ARM 架构细节

第5部分- Linux ARM汇编 ARM 架构细节 ARM处理器有37个寄存器,包括31个通用寄存器,和6个状态寄存器。 通用寄存器是31个从x0-x30,31个数量是比较奇怪的,其实还有一个是Zero Register是wzr。如果是使用寄存器中的32位,就是w0-w30了。类型X86中的...

2020-06-05 21:43:16 83 0

原创 第4部分- Linux ARM汇编首个程序

第4部分- Linux ARM汇编首个程序 首个64位汇编 我们先创建第一个AArch64上的首个汇编程序,这个64位代码是我在一个ARMv8服务器上运行的。有国产的华为鲲鹏/飞腾,非国产的也可以是安培或者Cavium。 first64.s .arch armv8-a .global _...

2020-06-05 21:43:10 46 0

原创 第3部分- Linux ARM汇编引言

第3部分- Linux汇编 引言 为什么要学汇编 摘自书籍 Why should engineers and programmers spend time learning to program in assembly language? The reasons presented in...

2020-06-05 21:43:09 33 0

原创 第2部分- Linux ARM汇编ARM指令集变化和优势

第2部分- Linux汇编ARM指令集变化和优势 指令集变化 T32,A32和A64指令集与可能导致它们之间切换的事件之间的关系。 指令集架构调整 ARMv4及之前:只使用32位的ARM指令集。 ARMv4T,在32位ARM指令集的基础上,增加了16位的Thumb指令集。这是第一个被...

2020-06-05 21:43:03 61 0

原创 第1部分- Linux ARM汇编-ARM技术变迁演进和ARMv8-a架构

第1部分- Linux汇编ARM技术变迁 关于ARM版本 先来看下ARM版本如下图: Tips:Cortex-A53同样是采取了ARMv8-A架构,能够支持32位的ARMv7代码和64位代码的AArch64执行状态。 ARM Cortex内核系列提供非常广泛的具有可扩展性的性能选项...

2020-06-05 21:43:00 144 0

原创 第82部分- Linux x86 64位汇编 参考

第82部分- Linux x86 64位汇编 参考 NASM The Netwide Assembler: NASM NasmAssembly https://nasm.us/doc/nasmdoc4.html ATT 《Professional Assembly Language...

2020-06-05 19:50:09 38 0

原创 第81部分- Linux x86 64位汇编 内存映射文件

第81部分- Linux x86 64位汇编 内存映射文件 上个例子中,如果执行如下: #readchange readchange.s readchange.s 则会发现readchange.s会空了。 因为系统不能在读取一个文件的同时把数据写入到同一个文件。 但是很多应用程序中涉及到...

2020-06-05 19:50:03 29 0

原创 第80部分- Linux x86 64位汇编 使用文件

第80部分- Linux x86 64位汇编 使用文件 我们知道C或者C++进行程序设计有函数fopen/read/write。汇编中如何呢? 汇编语言程序中处理数据文件时必须使用特定的顺序。通过Linux系统调用执行。 打开 先来按下open系统调用如下: int open(const...

2020-06-04 21:22:40 30 0

原创 第78部分- Linux x86 64位汇编 创建优化的代码

第78部分- Linux x86 64位汇编 创建优化的代码 我们可以用gcc编译器从C程序创建编译器优化后的汇编代码,然后分析优化。 以tempconv.c文件为例,将华氏温度转为摄氏温度。 #include <stdio.h> float convert(int deg)...

2020-06-04 21:22:35 51 0

原创 第79部分- Linux x86 64位汇编 优化技巧

第79部分- Linux x86 64位汇编 优化技巧 优化汇编主要是5中常用的方法: 优化运算/优化变量/优化循环/优化条件分支/优化通用子表达式。 减少运算过程中的局部变量的大量使用。 处理变量有3种方式:使用.data或者.bss段内存中定义变量/堆栈中定义局部变量/使用可用的寄存器...

2020-06-04 21:22:35 32 0

原创 第77部分- Linux x86 64位汇编 优化编译器代码

第77部分- Linux x86 64位汇编 优化编译器代码-O1/-O2/-O3 仅仅使用汇编语言代码替换C或者C++不会必然使得程序执行的更好,因为编译器已经把所有高级语言代码都转化成了汇编语言。 这里的关键是编写比编译器生成的代码更好的汇编语言。当然也可以使用若干优化技巧来指示编译器生成...

2020-06-04 21:22:28 42 0

原创 第76部分- Linux x86 64位汇编 CPUID

第76部分- Linux x86 64位汇编 CPUID CPUID指令是一条汇编语言指令。 处理器把厂商字符串返回到ebx,edx和ecx寄存器中。 示例 如下: #cpuid.s Sample program to extract the processor Vendor ID...

2020-06-04 21:22:23 38 0

原创 第75部分- Linux x86 64位汇编 kdbg

第75部分- Linux x86 64位汇编 kdbg 在ubnut环境中通过apt install kdbg进行安装。 即可使用。 kdbg是一个带有图形化界面的调试器,可以在程序的任何地方暂停并观察变量值。 可以直接选择二进制文件进行debug, 文件编译的时候要加上-g参数,这样源码...

2020-06-04 21:22:20 36 0

原创 第74部分- Linux x86 64位汇编hexdump

第74部分- Linux x86 64位汇编hexdump 通过hexdump -C xx 可以看到二进制文件具体16进制和字符串显示情况。 例如下: 00000070 b8 01 00 00 00 cd 80 55 89 e5 83 ec 04 8b 5d 08 |.......U.......

2020-06-04 21:22:17 34 0

原创 第73部分- Linux x86 64位汇编 反汇编objdump

第73部分- Linux x86 64位汇编 反汇编objdump 通过objdump可以进行反汇编操作。 通过objdump -d xxx可以查看二进制目标程序。 准备一个经典代码如下,我们进行编译,gcc -S disass.c -o disass.s,得到汇编代码。 #includ...

2020-06-04 21:22:14 34 0

原创 第72部分- Linux x86 64位汇编调用汇编库

第72部分- Linux x86 64位汇编调用汇编库 如果希望汇编语言函数和C以及C++程序一起工作,必须显式的遵守C样式的函数格式。 汇编语言函数的源代码文件包含在编译器命令行中。 例如: gcc -o exe xx.c xx.s xx2.s xx3.s 创建汇编语言函数的目标文件时...

2020-06-04 21:22:12 30 0

提示
确定要删除当前文章?
取消 删除