ARM学习笔记(汇编篇)



前言

使用不同的编译器,指导编译器编译链接的文件lds稍许不一样,现在分arm-linux-gnueabi-gcc、IAR、Keil分开记录


提示:以下是本篇文章正文内容,下面案例可供参考

一、GCC

语法

marco

macro为定义一个宏,.macro为首,.endm为尾,。
在其他文件调用此宏定义,即可用定义的代码段替换宏。下面是一个宏定义示例。

.macro CPWAIT reg
	mrc	p15, 0, \reg, c2, c0, 0
	mov	\reg, \reg
	sub	pc, pc, #4
.endm

rept

在汇编语言中,reptendr 通常是用于创建重复的代码块(重复宏)。rept 指令用于开始一个重复块,然后可以在其中重复执行一段代码,直到遇到 endr 指令为止。这样可以方便地生成重复的汇编代码。

例如,以下是一个使用 reptendr 的示例:


.section .mmutable, "a"
mmutable:
	.align	14
	/* 0x00000000 - 0xffe00000 : 1:1, uncached mapping */
	.set	__base, 0
	.rept	0xfff
	.word	(__base << 20) | 0xc12
	.set	__base, __base + 1
	.endr

	/* 0xfff00000 : 1:1, cached mapping */
	.word	(0xfff << 20) | 0x1c1e

在上面的示例中,rept 0xfff 表示下面的代码块将被重复执行 0xfff 次,然后 endr 表示重复块的结束。因此,其中的代码会被复制和粘贴 0xfff 次,作用就是建立了一张mmu表。

section

.section 是汇编语言中的一个指令,通常用于将汇编代码分组为不同的节(sections)。在汇编器中,节是指代码或数据的逻辑分区,用于将不同类型的内容分开存放。每个节可以包含代码、数据、常量等不同类型的信息。

在大多数汇编语言中,.section 指令用于创建不同类型的节,并且可以指定节的属性和名称。具体的语法和属性取决于所使用的汇编器和体系结构。

以下是一个示例,展示了在某些汇编语言中使用 .section 的方式:

.section .data
    data_value: .word 42

.section .text
    .global main
main:
    mov r0, r1
    bx lr

在这个示例中,.section .data 表示接下来的代码将位于名为 .data 的节中,这通常用于存放数据。.section .text 表示接下来的代码将位于名为 .text 的节中,这通常用于存放指令代码。结合lds文件,便可以把section存放在指定区域了。

.extern

.extern用于在汇编文件中声明外部变量

.set

在GCC中,.set 汇编伪指令用于为汇编代码中的符号(如标签或变量)分配一个特定的数值。这通常用于在汇编代码中定义常数或指定地址。(ps:相当于c语言中的宏定义#define)

.set BUFFER_SIZE, 100

以上是一个示例,假设你要在汇编代码中定义一个名为 BUFFER_SIZE 的常数,其大小为 100。然后,在你的汇编代码中,你可以使用 BUFFER_SIZE 而不必在每个地方使用数字 100。

.align

//.align 指令的一般形式是
.align <alignment>

// 对齐到4字节边界
.align 2

// 对齐到8字节边界
.align 3

// 对齐到16字节边界
.align 4

其中, 表示要对齐的边界,通常是2的幂。例如,.align 4 将当前位置对齐到4字节边界,.align 8 将当前位置对齐到8字节边界,以此类推。

.org

.org 是一种汇编伪指令,通常用于设置程序计数器(PC)或地址计数器(AC),以指示汇编器生成的代码或数据应该放置在特定的内存地址或位置。这在编写汇编程序时非常有用,因为它允许你控制生成的二进制代码的位置。

例如,假设你正在编写一个汇编程序,想要将一段代码放置在内存的地址0x1000处,你可以使用以下指令:

.org 0x1000
//后续跟随代码块,即生成在0x1000位置

专业名词

Post-index

Post-index 是一种内存地址计算方式,它表示在访问内存后,将索引添加到基地址。这是在ARM汇编语言中的一种寻址模式,通常与加载(Load)和存储(Store)指令一起使用。

以下是一个示例,使用 Post-indexing 进行加载操作的 ARM 汇编代码:

ldr x0, [x1], #4

在这个例子中:

ldr 是 Load 指令,用于从内存中加载数据到寄存器。
x0 是目标寄存器,用于存储加载的数据。
[x1], #4Post-index 寻址模式。它表示从存储器地址 x1 处加载数据到 x0,然后将 x1 的值增加 4 个字节(32位)。
这个指令的效果是,首先加载 x1 指向的内存位置的数据到 x0,然后将 x1 的值增加 4,使其指向下一个数据元素。(ps :类似于c语言中的i++中的++)

Pre-Index

Pre-indexing 是一种内存地址计算方式,与 Post-indexing 相对,它表示在访问内存之前将索引添加到基地址。在ARM汇编语言中,Pre-indexing通常与加载(Load)和存储(Store)指令一起使用。

以下是一个使用 Pre-indexing 进行加载操作的 ARM 汇编代码示例:

ldr x0, [x1, #4]!

在这个例子中:

ldr 是 Load 指令,用于从内存中加载数据到寄存器。
x0 是目标寄存器,用于存储加载的数据。
[x1, #4]! 是 Pre-indexing 寻址模式。它表示将 x1 的值增加 4 个字节(32位)后,再从存储器地址 x1 处加载数据到 x0。
这个指令的效果是,在访问内存之前,将 x1 的值增加 4,然后加载这个新地址处的数据到 x0。


二、IAR

汇编

关键字详解
sectionsection关键字一般放在s文件首部,它的一般形式如下SECTION .vectors:CODE:NOROOT(2),section代表一个段的开始,.vector代表段名,后面跟的是属性,具体含义要参考文档
PUBLIC在这里插入图片描述将本文件的函数做外部声明,声明之后可在c函数中调用,如Assembly_causeUndefine函数即可在c文件中调用
EXTERN声明一个外部函数,然后可在本文件中调用,如在c文件中实现了一个PrintHello,可在本文件中调用

扩展内联汇编

//内敛汇编基本格式
asm ( assembler template
        : output operands                /*在MOV R0,R1中,R1->R0,R1为output*/
        : input operands                 /*在MOV R0,R1中,R1->R0,R0为input*/
        : list of clobbered registers   /* optional */
);

output operandsinput operands分别代表输入输出函数
clobbered registers指明修改的寄存器或者内存,如果某个指令改变了某个寄存器的值,我们就必须在asm中第三个冒号后的Clobber List中标示出该寄存器。为的是通知GCC,让其不再假定之前存入这些寄存器中的值依然合法。输入输出寄存器不用放Clobber List中,因为GCC能知道asm将使用这些寄存器。(因为它们已经显式被指定输入输出标出在输入输出部分) 。其他使用到的寄存器,无论是显示还是隐式的使用,必须在clobbered list中标明。

//具体代码
void print_r0r1(int r0, int r1,int r2,int r3)
{
    int value,addr;
    fmsh_print("r0 0x%x r1 0x%x\n",r0,r1);
    asm(
        "MOV %[op1], SP\n"
        "LDR %[op2], [SP]\n"
        :
        :[op1]"r"(addr),[op2]"r"(value)
        :
    );
    fmsh_print("SP addr 0x%x value 0x%x\n",addr,value);
}

// 32 位写操作
void write32(uint32_t value, volatile uint32_t *address) {
    __asm__ __volatile__(
        "str %w[value], [%[addr]]"
        : : [value] "r" (value), [addr] "r" (address)
        : "memory"
    );
}

// 32 位读操作
uint32_t read32(volatile uint32_t *address) {
    uint32_t result;
    __asm__ __volatile__(
        "ldr %w[result], [%[addr]]"
        : [result] "=r" (result)
        : [addr] "r" (address)
        : "memory"
    );
    return result;
}

IAR汇编帮助文档

在IAR IDE内,如下图操作,可获得IAR提供汇编指导文档
在这里插入图片描述


三、KEIL


四、链接脚本

https://sourceware.org/binutils/docs/ld/Scripts.html#Scripts

相关参考资料:
https://www.jianshu.com/p/1782e14a0766

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习ARM汇编指令的经典资料。 对ARM的各种汇编指令进行了深入全面的讲解,并给出了各种示例和详细注解,并且还对一些值得注意的点或是容易犯错误的地方进行了总结。 目录 前言................................................................................................................................................................i 目录................................................................................................................................................................I ARM7TDMI(-S)指令集及汇编....................................................................................................................1 ARM处理器寻址方式..........................................................................................................................2 寄存器寻址....................................................................................................................................2 立即寻址........................................................................................................................................2 寄存器偏移寻址............................................................................................................................2 寄存器间接寻址............................................................................................................................3 基址寻址........................................................................................................................................3 多寄存器寻址................................................................................................................................4 堆栈寻址........................................................................................................................................4 块拷贝寻址....................................................................................................................................5 相对寻址........................................................................................................................................5 指令集介绍............................................................................................................................................7 ARM指令集..................................................................................................................................7 指令格式................................................................................................................................7 第2个操作数................................................................................................................7 #immed_8r...........................................................................................................7 Rm..........................................................................................................................8 Rm,shift..................................................................................................................8 条件码............................................................................................................................9 ARM存储器访问指令........................................................................................................11   LDR和STR........................................................................................................11   LDM和STM.......................................................................................................14   SWP.....................................................................................................................17 ARM数据处理指令............................................................................................................19 数据传送指令..............................................................................................................20   MOV............................................................................................................20   MVN............................................................................................................20 算术逻辑运算指令......................................................................................................20   ADD.............................................................................................................20   SUB..............................................................................................................21   RSB..............................................................................................................21   ADC.............................................................................................................21   SBC..............................................................................................................21   RSC..............................................................................................................22   AND.............................................................................................................22   ORR..............................................................................................................22   EOR..............................................................................................................22   BIC...............................................................................................................23 比较指令......................................................................................................................23   CMP.............................................................................................................23   CMN.............................................................................................................23   TST...............................................................................................................24   TEQ..............................................................................................................24 乘法指令......................................................................................................................25   MUL.............................................................................................................25   MLA.............................................................................................................25   UMULL........................................................................................................25   UMLAL........................................................................................................26   SMULL........................................................................................................26   SMLAL........................................................................................................26 ARM跳转指令....................................................................................................................27   B...........................................................................................................................27   BL.........................................................................................................................27   BX........................................................................................................................27 ARM协处理器指令............................................................................................................28   CDP......................................................................................................................28   LDC......................................................................................................................29   STC......................................................................................................................29   MCR.....................................................................................................................30   MRC.....................................................................................................................30 ARM杂项指令....................................................................................................................31   SWI......................................................................................................................31   MRS.....................................................................................................................32   MSR.....................................................................................................................33 ARM伪指令........................................................................................................................34   ADR.....................................................................................................................35   ADRL...................................................................................................................35   LDR......................................................................................................................36   NOP......................................................................................................................37 Thumb指令集.............................................................................................................................39 Thumb指令集与ARM指令集的区别..............................................................................39 Thumb存储器访问指令.....................................................................................................40   LDR和STR........................................................................................................41   PUSH和POP......................................................................................................43   LDMIA和STMIA..............................................................................................43 Thumb数据处理指令.........................................................................................................45 数据传送指令..............................................................................................................46   MOV............................................................................................................46   MVN............................................................................................................46   NEG..............................................................................................................47 算术逻辑运算指令......................................................................................................47   ADD.............................................................................................................47   SUB..............................................................................................................48   ADC.............................................................................................................49   SBC..............................................................................................................49   MUL.............................................................................................................50   AND.............................................................................................................50   ORR..............................................................................................................50   EOR..............................................................................................................51   BIC...............................................................................................................51   ASR..............................................................................................................51   LSL...............................................................................................................52   LSR..............................................................................................................52   ROR..............................................................................................................53 比较指令......................................................................................................................53   CMP.............................................................................................................53   CMN.............................................................................................................54   TST...............................................................................................................54 Thumb跳转指令.........................................................................................................55   B...................................................................................................................55   BL.................................................................................................................55   BX................................................................................................................55 Thumb杂项指令.........................................................................................................56   SWI..............................................................................................................56 Thumb伪指令.............................................................................................................57   ADR.............................................................................................................57   LDR..............................................................................................................57   NOP..............................................................................................................58 伪指令..................................................................................................................................................59 符号定义伪指令..........................................................................................................................59   GBLA、GBLL、GBLS..............................................................................................59   LCLA、LCLL、LCLS................................................................................................60   SETA、SETL、SETS.................................................................................................61   RLIST...........................................................................................................................61   CN................................................................................................................................62   CP.................................................................................................................................62   DN、SN.......................................................................................................................62   FN.................................................................................................................................63 数据定义伪指令..........................................................................................................................63   LTORG.........................................................................................................................64   MAP.............................................................................................................................64   FIELD..........................................................................................................................65   SPACE..........................................................................................................................66   DCB.............................................................................................................................66   DCD和DCDU............................................................................................................67   DCDO..........................................................................................................................67   DCFD和DCFDU........................................................................................................68   DCFS和DCFSU.........................................................................................................68   DCI...............................................................................................................................69   DCQ和DCQU............................................................................................................69   DCW和DCWU..........................................................................................................70 报告伪指令..................................................................................................................................70   ASSERT.......................................................................................................................70   INFO............................................................................................................................71   OPT..............................................................................................................................71   TTL和SUBT..............................................................................................................72 汇编控制伪指令..........................................................................................................................73   IF、ELSE和ENDIF...................................................................................................73   MACRO和MEND.....................................................................................................74   WHIL和WEND.........................................................................................................75 杂项伪指令..................................................................................................................................76   ALIGN.........................................................................................................................77   AREA...........................................................................................................................78   CODE16和CODE32..................................................................................................79   END.............................................................................................................................80   ENTRY.........................................................................................................................80   EQU.............................................................................................................................81   EXPORT和GLOBAL................................................................................................81   IMPORT和EXTERN.................................................................................................82   GET和INCLUDE......................................................................................................83   INCBIN........................................................................................................................83   KEEP............................................................................................................................83   NOFP...........................................................................................................................84   REQUIRE....................................................................................................................84   PEQUIRE8和PRESERVE8.......................................................................................84   RN................................................................................................................................84   ROUT...........................................................................................................................85 ARM伪指令................................................................................................................................86   ADR.............................................................................................................................86   ADRL...........................................................................................................................86   LDR..............................................................................................................................86   NOP..............................................................................................................................86   LDFD...........................................................................................................................86   LDFS............................................................................................................................87 Thumb伪指令.............................................................................................................................87   ADR.............................................................................................................................87   LDR..............................................................................................................................87   NOP..............................................................................................................................88 ARM汇编程序设计............................................................................................................................88 文件格式......................................................................................................................................88 ARM汇编的一些规范................................................................................................................88 汇编语句格式......................................................................................................................88 标号......................................................................................................................................89   基于PC的标号...................................................................................................89   基于寄存器的标号..............................................................................................90   绝对地址..............................................................................................................90 局部标号..............................................................................................................................90 符号......................................................................................................................................91 常量......................................................................................................................................91   数字常数..............................................................................................................91   字符常量..............................................................................................................92   布尔常量..............................................................................................................92 段定义..................................................................................................................................92 宏定义及其作用..................................................................................................................93 子程序的调用..............................................................................................................................94 数据比较跳转..............................................................................................................................95 循环..............................................................................................................................................95 数据块复制..................................................................................................................................95 栈操作..........................................................................................................................................96 特殊寄存器定义及应用..............................................................................................................96 散转功能......................................................................................................................................97 查表操作......................................................................................................................................97 长跳转..........................................................................................................................................97 对信号量的支持..........................................................................................................................98 伪指令使用..................................................................................................................................98 一个完整的例子..........................................................................................................................98 外围部件控制..............................................................................................................................99 三级流水线介绍..........................................................................................................................99 C与汇编混合编程............................................................................................................................100 内嵌汇编....................................................................................................................................100 内嵌汇编的指令用法........................................................................................................103 内嵌汇编器与armasm汇编器的差异.............................................................................104 内嵌汇编注意事项............................................................................................................104 访问全局变量............................................................................................................................106 C与汇编相互调用....................................................................................................................107 寄存器的使用规则............................................................................................................108 堆栈使用规则....................................................................................................................108 参数传递规则....................................................................................................................109 C程序调用汇编程序........................................................................................................110 汇编程序调用C程序.......................................................................................................111 ARM指令集列表..............................................................................................................................113 ARM存储器访问指令表列表..................................................................................................113 ARM数据处理指令列表..........................................................................................................114 ARM乘法指令列表..................................................................................................................115 ARM跳转指令列表..................................................................................................................116 ARM协处理器指令列表..........................................................................................................117 ARM杂项指令列表..................................................................................................................118 ARM伪指令列表......................................................................................................................119 Thumb指令集列表...........................................................................................................................120 Thumb存储器访问指令列表...................................................................................................120 Thumb数据处理指令列表.......................................................................................................121 Thumb跳转指令及软中断指令列表.......................................................................................122 Thumb伪指令列表...................................................................................................................123 汇编预定义变量及伪指令................................................................................................................124 预定义的寄存器和协处理器名................................................................................................124 通用寄存器........................................................................................................................124 程序状态寄存器................................................................................................................124 浮点数寄存器....................................................................................................................124 协处理器及协处理器寄存器............................................................................................125 内置变量列表............................................................................................................................125 伪指令列表................................................................................................................................126 指令条件码列表........................................................................................................................128 CPSR和SPSR分配图.............................................................................................................................129
嗨!对于逆向学习汇编语言的学习笔记,我可以给你一些基本的指导。首先,汇编语言是一种低级语言,它与计算机的底层硬件密切相关。逆向工程则是通过分析和理解已编译的程序来获取程序的内部信息。 以下是一些学习汇编语言和逆向工程的建议: 1. 学习基础知识:了解计算机体系结构、寄存器、内存和指令集等基础概念是必要的。可以先阅读相关的书籍或在线教程,掌握这些基本概念。 2. 掌握汇编语言的语法和指令集:每种计算机体系结构都有自己的汇编语言语法和指令集。选择一种你感兴趣的体系结构(如x86、ARM等),并学习它的汇编语言。 3. 练习编写和调试汇编代码:通过编写简单的汇编代码来熟悉语法和指令集。使用调试器来单步执行代码并观察寄存器和内存的变化。 4. 分析已编译程序:选择一个目标程序进行逆向分析。使用反汇编器将程序转换为汇编代码,并分析代码的逻辑和功能。这有助于理解程序的结构和运行过程。 5. 使用调试器进行动态分析:通过调试器来动态地执行程序,并观察程序在运行时的行为。使用断点、内存查看器和寄存器查看器等工具来分析程序的状态和数据。 6. 学习逆向工程工具和技术:了解常用的逆向工程工具和技术,如IDA Pro、OllyDbg、Ghidra等。掌握这些工具的使用可以提高你的逆向分析能力。 7. 参考优秀资源:阅读与逆向工程和汇编语言相关的书籍、论文和博客,关注相关的社区和论坛。与其他逆向工程师交流经验也是很有帮助的。 记住,逆向工程是一个需要耐心和实践的过程。持续学习和实践将帮助你提高逆向分析的技能。祝你在学习汇编语言和逆向工程的过程中取得好成果!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值