第27部分- Linux x86 64位汇编 寄存器64位时候X86处理器的寄存器如下图:《Computer Systems A Programmer's Perspective, 3rd Edition》文件中有这图。re64和32位的差异是:64位有16个寄存器,32位只有8个。但是32位前8个都有不同的命名,分别是e开头,而64位前8个使用了r代替e。e开头的寄存器命名依然可以直接运用于相应寄存器的低32位。而剩下的寄存器名则是从r8 - r15,其低位分别用d,w,b指定长度。
第28部分- Linux x86 64位汇编 宏定义和函数在前面的例子移植中,我们知道NASM 使用resb、resw和resd关键字在 BSS 部分中分配字节、字和双字空间。GAS 使用.lcomm关键字分配字节级空间。Gas汇编器宏Linux 平台的标准汇编器是 GAS。GAS 提供.macro和.endm指令来创建宏。.macro指令后面跟着宏名称,后面可以有参数,也可以没有参数。宏参数是按名称指定的。.macro write_string p1,p2 ...
第29部分-Linux x86 64位汇编 加法指令adc指令可以执行两个无符号或者带符号整数值的加法,并且把前一个ADD指令产生的进位标志的值包含在其中。为了执行多组多字节的加法操作,可以把多个ADC指令链接在一起。示例代码如下:.section .datadata1: .quad 11111111,7252051615;//16字节整数data2: .quad 22222222,5732348928;//16字节整数output: .asciz "The res
第30部分-Linux x86 64位汇编 乘法/除法乘法无符号整数乘法mul如下,目标操作数总是eax寄存器的某种形式。使用IMUL可以进行有符号乘法。在只有一个操作数的情况下,结果保存到指定的目标寄存器EAX或寄存器的某种形式,这个同MUL。IMUL支持2个操作数。imul source,destinationIMUL支持3个操作数。imul multiplier,source,destination其中multiplier是一个立即值。乘法实例.sec
第31部分-Linux x86 64位汇编 移位指令乘法和除法是处理器上最为耗费时间的两种指令,但是运用移位指令可以提供快速的方法。移位乘法为了使整数乘以2的乘方,必须把值向左移位。可以使用两个指令使得整数值向左移位:SAL(向左算术位移)和SHL(向左逻辑位移)。移位除法通过移位进行除法操作涉及把二进制值向右移位。当把整数值向右移位时,必须要注意整数的符号。无符号整数,向右移位产生的空位可以被填充为零,而且不会有任何问题。不幸的事,对于带符号整数,使用零填充高位部分会对
第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...
第8部分- Linux ARM汇编 定义操作符号定义操作其中GBLA、GBLL及GBLS声明全局变量LCLA、LCLL及LCLS声明局部变量SETA、SETL及SETS给变量赋值RLIST为通用寄存器列表定义名称CN为协处理器的寄存器定义名称CP为协处理器定义名称DN及SN:为VFP的寄存器定义名称FN为FPA的浮点寄存器定义名称。数据定义操作LTORG声明一个数据缓冲池的开始MAP定义一个结构化的内存表的首地址FIELD定义结构化的内存表中的一.
第10部分- Linux ARM汇编 寻址方式都遵循gas汇编器的语法。立即寻址指令后面的地址码部分为立即数 MOV RO, #1234寄存器寻址中,操作数在寄存器中,指令执行时直接从寄存器中取值进行操作。 MOV R0, R1寄存器移位寻址是ARM指令集特有的寻址方式,和寄存器寻址类似,只是操作前需要对寄存器操作数进行移位操作。LSL:逻辑左移,移位后寄存器空出的低位补0。LSR:逻辑右移,移位后寄存器空出的高位补0。ASR:算术右移,移位过程...
第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了每次指令过后。如果一条指令确
第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 */.
第13部分- Linux ARM汇编 移位操作ARM语法中的 移位操作如下,也是寻址的一种方法。在寻址方法中还会看到。寄存器移位寻址是ARM指令集特有的寻址方式,和寄存器寻址类似,只是操作前需要对寄存器操作数进行移位操作。LSL:逻辑左移,移位后寄存器空出的低位补0。可以是立即数或寄存器。LSR:逻辑右移,移位后寄存器空出的高位补0。ASR:算术右移,移位过程中,符号位保持不变,如果源操作数是正数,则空出的高位补0,否则补1.ROR:循环右移,类似LSR,移位后移除的低位填入空出的高位
ADR指令作用:小范围的地址读取指令。ADR 指令将基于PC 相对偏移的地址值读取到寄存器中。原理:将有符号的21位的偏移,加上PC, 结果写入到通用寄存器,可用来计算+/-1MB范围的任意字节的有效地址。ADRP作用:以页为单位的大范围的地址读取指令,这里的P就是page的意思。原理:符号扩展一个21位的offset(immhi+immlo), 向左移动12位,PC的值的低12位清零,然后把这两者相加,结果写入到Xd寄存器,用来得到一块含有lable的4KB对齐内存区域的base地...
第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相结合的结构。连
第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...
第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个...
第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个
第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 : .
第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: .
第22部分- Linux ARM汇编分支指令在32位ARM系统中,可以通过指令本身中的条件字段来支持的分支判断。 例如在T32中,有用于构建条件序列的IT(如果-则-then)指令。 A64不支持此功能,但有一组不同的特定条件说明。32位预测分支源代码如下:.text.global mainmain: mov r1, #123 /* r1 ← 123 */ mov r2, #0 /* r2 ← 0 */loop: .
第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) {
第25部分- Linux ARM汇编NEON基础知识浮点指令除了VFP还有NEON。NEON 支持整数、定点和单精度浮点 SIMD 运算。NEON 是针对高级媒体和信号处理应用程序以及嵌入式处理器的 64/128 位混合 SIMD 技术。 它是作为 ARM内核的一部分实现的,但有自己的执行管道和寄存器组,该寄存器组不同于ARM 核心寄存器组。VFP指令用FADD,NEON指令用VADD。NEON指令集比VFP指令集更广泛,因此,尽管大多数VFP指令具有等效的NEON指令,但仍有许多...
第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),指数...
第27部分- Linux ARM汇编 ThumbThumb是ARM指令的重新编码子集,每个指令仅占用16位。 这意味着将不得不放弃一些指令。 作为一个好处,代码密度更高:大多数时候,将能够在一半的空间内对程序的代码进行编码。一个函数必须完全是ARM或Thumb,它不能是两个指令集的混合。Thumb-2ARMv7在ARMv6架构的基础上诞生了Thumb-2技术。ARMv7还采用了NEON技术,将DSP和媒体处理能力提供了近4倍,并支持改良的浮点运算。...
第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...
Aegisub和handbrake工具使用
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号