arm汇编快速入门
android 逆向中常用的arm汇编指令基础知识

android 逆向中常用的arm汇编指令基础知识在Android 逆向工程中,了解ARM 汇编指令的基础知识对于理解和分析应用程序的底层行为至关重要。
以下是一些常用的ARM 汇编指令及其简要说明:数据移动指令:MOV:将源操作数的值复制到目标寄存器。
STR:将寄存器的值存储到内存中。
LDR:从内存中加载值到寄存器。
算术指令:ADD:加法。
SUB:减法。
MUL:乘法。
DIV:除法。
AND:位与。
ORR:位或。
XOR:位异或。
NOT:位非。
比较指令:CMP:比较两个值,并根据结果设置条件标志。
TST:测试寄存器的位,并根据结果设置条件标志。
条件分支指令:B:无条件分支。
BEQ:当相等时分支。
BNE:当不相等时分支。
BGT:当大于时分支。
BLT:当小于时分支。
BGE:当大于或等于时分支。
BLE:当小于或等于时分支。
堆栈操作指令:PUSH:将寄存器值压入堆栈。
POP:从堆栈中弹出值到寄存器。
加载/存储指令:LDM:从内存加载多个寄存器。
STM:将多个寄存器存储到内存。
交换指令:SWP:交换寄存器的值与内存中的值。
程序控制指令:BL:带返回的分支。
BX:跳转到寄存器指定的地址。
了解这些指令可以帮助你在逆向工程中识别和分析关键代码段,例如函数入口、出口、条件跳转等。
此外,对于某些特定的逆向工程技术,如hooking、代码注入等,对ARM 汇编的深入理解也是必不可少的。
请注意,ARM 架构有多个版本(如ARMv7、ARMv8 等),不同版本可能具有不同的指令集和特性。
因此,在具体的应用中,你可能需要参考特定版本的ARM 架构文档来获取更详细和准确的信息。
linuxarm汇编语言pdfGNUARM汇编入门pdf

linuxarm汇编语言pdfGNUARM汇编入门pdf在编写标题所描述的内容需求文章时,需要注意字数限制,整洁美观的排版,语句通顺,流畅表达,且无影响阅读体验的问题。
文章可适当增加字数限制,并可以分小节论述。
以下是针对题目“linuxarm汇编语言pdfGNUARM汇编入门pdf”准备的一篇文章:Linux ARM汇编语言与GNU ARM汇编入门引言:汇编语言是一种底层的编程语言,用于与计算机硬件进行交互。
在Linux操作系统下,汇编语言的学习对于理解系统底层运行机制以及进行嵌入式系统开发具有重要意义。
本文旨在介绍Linux ARM汇编语言和GNU ARM汇编入门,帮助读者快速入门和掌握相关知识。
一、了解Linux ARM汇编语言1.1 汇编语言简介汇编语言是一种低级的编程语言,使用助记符来代替机器码,更接近计算机的工作方式。
它具有高度的灵活性和效率,但也需要更多的底层知识。
1.2 Linux系统下的ARM汇编语言Linux操作系统广泛应用于嵌入式系统和服务器领域,而ARM处理器则是其中最常见的架构之一。
学习Linux ARM汇编语言可以帮助我们深入了解计算机系统如何运行以及如何编写高效的嵌入式程序。
二、GNU ARM汇编入门2.1 GNU工具链简介GNU工具链是一套针对ARM架构的开源工具,其中包括编译器、汇编器和链接器等。
使用GNU工具链可以方便地进行ARM汇编开发,并实现与其他高级语言的混合编程。
2.2 GNU ARM汇编语言基础学习GNU ARM汇编语言需要了解基本的寄存器、指令集以及内存访问等。
通过准确理解这些概念,我们可以编写出高效、可靠的汇编代码。
三、实践与案例3.1 汇编语言的应用场景汇编语言在系统底层开发、驱动程序编写、嵌入式系统开发等方面有着广泛应用。
通过实践案例,我们可以更好地理解汇编语言的实际应用和开发流程。
3.2 GNU ARM汇编语言案例分析通过对一些实际的GNU ARM汇编语言案例进行分析和学习,我们可以更好地掌握如何使用GNU工具链进行开发,编写高效的汇编代码。
ARM初学入门

经过一段时间对ARM的学习,在这里跟大家说一些前期的学习经验,另外仅以一个例子说明一下ADS的开发过程,因为这也是初学,可能有的地方说的不太好,望大家谅解,另外可以找其它参考资料来学习。
第一部分:ARM前期学习经验个人认为,要想学好ARM应该首先对ARM的整体框架(包括ARM体系结构,ARM开发过程,及ARM程序框架及执行过程等)有一个了解。
这里这就不多说了,这些东西我也只是刚刚开始学习,还没有很好的掌握,就只说一些个人想法吧。
呵呵,因为时间比较紧张,本来说是一个星期搞定ARM,至少拿着书本可以一点点的做着,可是经过上一个星期,到最后,哇,真的快疯了。
刚开始拿到实验箱,以为和NIOS一样,多跑一些DEMO应该就差不多会玩了,没想到一开始就碰到一个大问题,ARM实验箱里边带了几本教材和实验指导书,拿着实验指导书做了几个DEMO就做不下去了,因为前两个DEMO还比较简单,就只是用汇编语言写了几条对ARM寄存器操作的语句,学过汇编语言的很快就可以理解了。
可是往后就不一样了,因为刚开始学,不太了解ARM程序的框架,实在是看不懂了,为什么每个全程里边都有用到44b.h ,44blib.h ,44blib.c还有一个44binit.s文件?前边三个还容易理解,玩过单片机的很容易就能看出来44b.h 里边定义了一些在S3C44B0X内部的寄存器,44blib.h和44blib.c定义了一些有关初始化的函数,而44binit.s呢?看不懂,到这里我的ARM程序就没法往下做了,只有在网上再找资料,看这个函数到底是干什么用的,原来这就是以前经常听说的“bootloader”或着说是“启动代码”,或着说是“ARM的引导程序”,就是处理器在启动的时候执行的一段代码,主要任务是初始化处理器模式,设置堆栈,初始化变量等等.由于以上的操作均与处理器体系结构和系统配置密切相关,所以一般由汇编来编写(关于这方面的内容大家可以查看相关资料)。
ARM快速入门教程

ARM快速入门教程ARM(Advanced RISC Machines)是一种基于精简指令集计算机(RISC)架构的处理器系列,被广泛应用于嵌入式系统、移动设备和消费类电子产品中。
本文将为您提供一个简单的ARM快速入门教程,帮助您了解ARM的基本概念和使用方法。
第一部分:ARM概述(200字)第二部分:ARM架构(300字)ARM架构采用RISC设计思想,通过简化指令集和优化硬件设计来提高性能和效率。
ARM处理器具有三个基本特征:简洁的指令集、统一的寄存器文件和可变长度的指令长度。
ARM指令集包括数据传输指令(如加载和存储指令)、算术指令(如加法和乘法指令)、控制指令(如分支和跳转指令)等。
这些指令被编码为16位或32位二进制代码,以提高指令执行效率。
ARM处理器的寄存器文件使用统一的32位寄存器,这意味着所有的寄存器都可以用于存储数据或表示内存地址。
该设计简化了指令集编码,并提高了程序的灵活性和扩展性。
与其他处理器架构相比,ARM指令的长度是可变的。
ARM处理器支持16位和32位的指令,根据实际需要进行选择。
这种设计也有利于降低功耗和提高代码密度。
第三部分:ARM开发环境(400字)要开始使用ARM进行开发,您需要一个ARM开发板、一台计算机和适当的开发环境。
ARM开发板是一种嵌入式系统,其中包含一块ARM处理器和各种外围设备(如闪存、RAM、串口等)。
您可以使用开发板来加载和运行您的ARM代码,并与外部设备进行交互。
第四部分:ARM编程(300字)ARM编程可以使用汇编语言或高级语言进行。
汇编语言是一种低级编程语言,直接对应于CPU的指令集。
使用汇编语言编程可以更加深入地了解和控制ARM处理器的操作。
高级语言(如C/C++)编程可以提高开发效率和代码可读性。
您可以使用C/C++编程语言编写ARM应用程序,然后通过交叉编译器将其编译成ARM指令。
在ARM编程中,您可以使用各种库函数和驱动程序来访问外部设备(如闪存、串口、显示屏等)。
ARM汇编入门指南

ARM汇编⼊门指南本篇⽂章的⽬的是希望以⼀个例⼦的⽅式,能够不那么枯燥的的给⼤家简单介绍⼀下Android或iOS这些移动终端上ARM架构的CPU是如何执⾏ARM汇编指令的。
如果说程序员在学习任何⼀门语⾔的起点都是从学习写helloworld程序开始的,那么本篇⽂章希望的就是成为你学习ARM汇编的那第⼀篇⼊门教程,⼿把⼿的带着你⽤ARM汇编⼿写⼀个helloworld程序。
Hello, ARM⾸先我们这⾥是准备⽤GNU ARM汇编来⼿写⼀个ARM64架构的helloworld程序,那么需要先准备如下⼏个东西:⼀个⽂本编辑器,这⾥我们⽤vim .⼀个ARM64的编译器,这⾥我们⽤的是Android NDK⾥⾯⾃带的clang.伪指令以上准备好了,我们就可以开始新建⼀个⽂件名为main.S的纯⽂本⽂件,然后⽤任意⾃⼰最⼼爱的⽂本编辑器( 对于我⽽⾔它永远是vim) 来打开它,咱们先来起个头:.text.file 'main.c'.globl main // -- Begin function main.p2align 2这⾥我们使⽤是GNU ARM汇编,其中以.开头的是汇编指令 (Assembler Directive ) ⼜或被称为伪指令( Pseudo-operatio),因为它们不属于ARM指令,因此被称为伪指令,这⾥我们先尽量忽略它们,因为我们的主要学习⽬的是学习真正的ARM汇编指令,⽽不是这些伪东西,如果想了解它们可以参考⽂末的附录(伪指令参考表),这⾥只需要看懂其中的⼀句伪指令即可:.globl main这⼀句伪指令它定义了最重要的事情:在我们这个⽂件⾥⾯有⼀个叫做main名称的导出函数,它就是我们helloworld程序的⼊门函数。
main函数然后我们就可以来书写我们的helloworld程序的main函数:.typemain,@functionmain: // @main// %bb.0:subsp, sp, #32 // =32stpx29, x30, [sp, #16] // 16-byte Folded Spilladdx29, sp, #16 // =16movw8, wzrsturwzr, [x29, #-4]adrpx0, .L.straddx0, x0, :lo12:.L.strstrw8, [sp, #8] // 4-byte Folded Spillblprintfldrw8, [sp, #8] // 4-byte Folded Reloadmovw0, w8ldpx29, x30, [sp, #16] // 16-byte Folded Reloadaddsp, sp, #32 // =32ret在GNU ARM汇编⾥⾯所有以:结尾的都会视为标签 ( label ),在这⾥我们定义⼀个叫做main的标签,并且使⽤.type伪指令定义这个标签的类型是⼀个函数(function),到此我们就定义了我们的main函数。
ARM汇编快速入门教程

ARM汇编快速入门教程本文主要分享如何快速上手(ARM)(汇编)开发的经验、汇编开发中常见的Bug以及Debug方法、用的Convolu(ti)on Dephtwise 算子的汇编实现相对于(C++)版本的加速效果三方面内容。
01前言(神经网络)模型能够在移动端实现快速推理离不开高性能算子,直接使用ARM汇编指令来进行算子开发无疑会大大提高算子的运算性能。
初次接触汇编代码可能会觉得其晦涩难懂然后望而却步,但ARM 汇编开发一旦入门就会觉得语言优美简洁,如果再切换到ARM INTRIS (IC)指令开发反而觉得没有直接写汇编码来的方便。
我会在第一节分享纯小白如何快速上手ARM汇编开发的经验,第二节会列举在汇编开发中常见的Bug以及Debug方法,第三节会展示常用的Convolution Dephtwise算子的汇编实现相对于C++版本的加速效果。
如果你已经能很熟练地使用ARM汇编指令进行开发了,可以跳过第一节。
02从简单函数上手学习汇编开发重要的一点是通过学习现有函数的汇编代码来实现自己的需求我写的第一个汇编算子是MaxPooling算子,算子本身的计算过程非常简单。
但当我开始实现MaxPooling的汇编代码时,我不知道第一行代码怎么写,不知道开头和结尾怎么写,不知道中间的计算逻辑怎么写。
当时我就在MNN库的source文件夹下面找到了一份逻辑简单的、自己非常熟悉的Relu算子当做参照来实现MaxPooling. 之所以我(推荐)用一个逻辑简单的、自己非常熟悉的算子当做学习汇编的模版,是因为当算子的计算逻辑简单时,我们才能把注意力放在汇编函数的声明、传参、读取数据、存储结果、返回等等这些大的流程上面,至于内部的函数实现(如何计算一行数据的最大值,如何去计算一个(寄存器)中所有数据的累加和等等)可以暂时不去关注。
学习一个新的东西时,我们找的例子模版不能过于复杂,因为这会导致我们将注意力放在例子本身的实现细节中,而忽略了如何去入门,这样会增加我们的学习成本。
ARM汇编的必知必会

ARM汇编的必知必会无论是体系结构还是指令集,大家或多或少都应该对X86汇编有些了解,而对于嵌入式领域已被广泛采用的ARM 处理器,了解的可能并不多。
如果你有兴趣从事嵌入式方面的开发,那么了解一些RISC 体系结构和ARM汇编的知识还是有必要的。
这里,我们找出了这两种体系结构最明显的不同之处,并对此进行介绍,让大家对于RISC体系结构的汇编有一个基本的了解。
首先,我们就来看一看基于RISC的ARM的体系结构。
基于RISC 的ARM CPUARM是一种RISC体系结构的处理器芯片。
和传统的CISC体系结构不同,RI SC 有以下的几个特点:◆简洁的指令集——为了保证CPU可以在高时钟频率下单周期执行指令,RI SC指令集只提供很有限的操作(例如add,sub,mul等),而复杂的操作都需要由这些简单的指令来组合进行模拟。
并且,每一条指令不仅执行时间固定,其指令长度也是固定的,这样,在译码阶段就可以对下一条指令进行预取。
◆Load-Store 结构——这个应该是RISC 设计中比较有特点的一部分。
在RI SC 中,CPU并不会对内存中的数据进行操作,所有的计算都要求在寄存器中完成。
而寄存器和内存的通信则由单独的指令来完成。
而在CSIC中,CPU是可以直接对内存进行操作的,这也是一个比较特别的地方。
◆更多的寄存器——和CISC 相比,基于RISC的处理器有更多的通用寄存器可以使用,且每个寄存器都可以进行数据存储或者寻址。
当然,作为RISC 领域最成功的处理器,ARM也遵从上面的特点。
这里,我们不妨来看一看在user 模式下,ARM处理器的体系结构,这对于我们了解其汇编语言是有好处的。
而其它模式下只是有一些寄存器分组略有不同,大家可以在ARM的手册上查到。
这里要说明的是,尽管ARM处理器也支持16位指令,不过在下文中,我们都假定ARM处理器在32 位模式下工作。
图1:user模式下ARM处理器体系结构从图1中我们看到,在user 模式下,ARM CPU 有16个数据寄存器,被命名为r0~r15(这个要比x86的多一些)。
第二章 ARM汇编语言基础

R14寄存器又被称为连接寄存器(Link Register, LR),在ARM体系中有下面两种特殊的作用。 (1)每一种处理器模式自己的物理R14中存放当 前子程序的返回地址,当通过跳转指令调用子程 序时,R14被设置为该子程序的返回地址;在子程 序中,把R14的值赋值到程序计数器PC中时,子 程序返回。 (2)当异常中断发生时,该异常模式特定的物理 R14被设置成该异常模式将要返回的地址,对于有 些异常模式,R14的值可能与将返回的地址有个常 数的偏移量。
压栈 SP栈顶 SP栈顶 0x12345678 0x12345678 SP栈顶 SP栈顶 压栈 0x12345678
满堆栈 栈底
27
空堆栈 栈底
这样就有四种类型的堆栈工作方式,即: 满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向 高地址生成。如指令LDMFA,STMFA 等。 满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向 低地址生成。如指令LDMFD,STMFD 等。 空递增堆栈:堆栈指针指向下一个将要放入数据的空位置, 且由低地址向高地址生成。如指令LDMEA,STMEA 等。 空递减堆栈:堆栈指针指向下一个将要放入数据的空位置, 且由高地址向低地址生成。如指令LDMED,STMED 等。
21
前变址
0x4000000C 0xAA
将R3+0x0C作为 R3 0x40000000 地址装载数据 R2 0xAA 0x55 LDR R2,[R3,#0x0C]
后变址
LDR
r2,[r3],#4; R2←[R3], R3←R3+4
0x40000000 0xAA
将R3作为地址 装载数据 LDR
MOV R2,R0 ADD R4,R3,R2 CMP R7,R8
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM汇编语言ARM汇编语言源程序语句,一般由指令,伪操作,宏指令和伪指令作成.ARM汇编语言的设计基础是汇编伪指令,汇编伪操作和宏指令.伪操作,是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,在源程序运行汇编程序处理,而不是在计算机运行期间有机器执行.也就是说,这些伪操作只是汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之消失.宏指令,是一段独立的程序代码,可以插在程序中,它通过伪操作来定义,宏在被使用之前必须提前定义好,宏之间可以互相调用,也可自己递归调用.通过直接书写宏名来使用宏.并本具宏指令的格式输入输出参数.宏定义本身不产生代码,只是在调用它时把宏体插入到原程序中.宏与C语言中的子函数形参和实参的调用相似,调用宏时通过实际的指令来代替宏体实现相关的一段代码,但宏的调用与子程序的调用有本质的区别,既宏并不会节省程序的空间,其优点是简化程序代码,提高程序的可读性以及宏内容可以同步修改.伪操作,宏指令一般与编译程序有关,因此ARM汇编语言的伪操作,宏指令在不同的编译环境下有不同的编写形式和规则.伪指令也是ARM汇编语言程序里的特殊助记符,也不在处理器运行期间由机器执行,他们在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作.目前常用的ARM编译环境有2种.1. ADS/SDT IDE:ARM公司开发,使用了CodeWarrior公司的编译器.2. 集成了GNU开发工具的IDE开发环境;它由GNU的汇编器as,交叉汇编器gcc和连接器id组成. ADS编译环境下的ARM伪操作和宏指令,可参考北航出版社的<<ARM微控制器基础与实践》(周立功)这里主要讲述ARM GNU常用汇编语言4 ARM GNU常用汇编语言介绍4.1 ARM GNU常用汇编伪指令介绍1. abort.abort: 停止汇编.align absexpr1,absexpr2:以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或32. 第二个表达式值表示填充的值.2. if...else...endif.if.else.endif: 支持条件预编译.include "file": 包含指定的头文件, 可以把一个汇编常量定义放在头文件中.4. comm.comm symbol, length:在bss段申请一段命名空间,该段空间的名称叫symbol, 长度为length. Ld连接器在连接会为它留出空间.5. data.data subsection: 说明接下来的定义归属于subsection数据段.6. equ.equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression).该指令并不分配空间.7. global.global symbol: 定义一个全局符号, 通常是为ld使用.8. ascii.ascii "string": 定义一个字符串并为之分配空间.9. byte.byte expressions: 定义一个字节, 并为之分配空间.10. short.short expressions: 定义一个短整型, 并为之分配空间..int expressions: 定义一个整型,并为之分配空间.12 long.long expressions: 定义一个长整型, 并为之分配空间.13 word.word expressions: 定义一个字,并为之分配空间, 4bytes.14. macro/endm.macro: 定义一段宏代码, .macro表示代码的开始, .endm表示代码的结束.15. reqname .req register name: 为寄存器定义一个别名.16. code.code [16|32]: 指定指令代码产生的长度, 16表示Thumb指令, 32表示ARM指令.17. ltorg.ltorg: 表示当前往下的定义在归于当前段,并为之分配空间.4.2 ARM GNU专有符号1. @表示注释从当前位置到行尾的字符.注释掉一整行.3. ;新行分隔符.4.3 操作码1. NOPnop空操作, 相当于MOV r0, r02. LDRldr <register> , = <expression>相当于PC寄存器或其它寄存器的长转移.3.ADRadr <register> <label>相于PC寄存器或其它寄存器的小范围转移. ADRLadrl <register> <label>相于PC寄存器或其寄存器的中范围转移.5 可执行生成说明5.1 lds文件说明5.1.1 主要符号说明1. OUTPUT_FORMAT(bfdname)指定输出可执行文件格式.2. OUTPUT_ARCH(bfdname)指定输出可执行文件所运行CPU平台3. ENTRY(symbol)指定可执行文件的入口段5.1.2 段定义说明1. 段定义格式SECTIONS{ ...段名:{内容}...}前言:以前用ARM的IDE工具,使用的是ARM标准的汇编语言。
现在要使用GNU的工具,当然要了解一点GNU ARM汇编的不同之处。
其实非常的简单,浏览一下文档然后再看看程序就完全可以搞定了,或者你硬着头皮看GNU ARM的汇编程序,用不了多少时间你就就可以无师自通了。
个人比较健忘,还是把文档翻译了一下,算是给自己一个避免遗忘的理由吧。
ARM汇编语言源程序语句,一般由指令,伪操作,宏指令和伪指令作成.ARM汇编语言的设计基础是汇编伪指令,汇编伪操作和宏指令.目前常用的ARM编译环境有2种:ARMASM: ARM公司的IDE中使用了CodeWarrior的编译器,绝大多数windows下的开发者都在使用这一环境,完全按照ARM的规定;GNU ARM ASM: GNU工具的ARM版本,与ARMASM略有不同;关于CodeWarriror ARM汇编的书和文章很多,本文假定你已经完全了解ARMASM,这里只说明GNU ARM汇编,并针对ARMASM给出说明。
本文翻译自:GNU ARM Assembler Qui ck Reference,本人水平有限,错误难免,转载随意,请注明出处。
英文原文地址不详。
GNU ARM 汇编快速入门任何汇编行都是如下结构:[<label>:] [<instruction or directive>} @ comment[<标签>:] [<指令>} @ 注释GNU ARM 汇编中,任何以冒号结尾的都被认为是一个标签,而不一定非要在一行的开始。
下面是一个简单的例子,这段汇编程序定义了一个"add"的函数,该函数返回两个参数的和:.section .text, “x”.global add @ give the symbol add external linkageadd:ADD r0, r0, r1 @ add input argumentsMOV pc, lr @ return from subroutine@ end of programGNU ARM汇编伪指令下面列出了一些GNU ARM汇编伪指令,并给出了相应说明。
.ascii “<string>” 在汇编中定义字符串并为之分配存储空间(与armasm中的DCB功能类似)。
.asciz “<string>” 和.ascii类似, 但不分配存储空间。
.balign <power_of_2> {,<fill_value> {,<max_padding>} }以某种排列方式在内存中填充数值。
(该指令与armasm中的ALIGN类似)。
power_of_2表示排列方式,其值可为4,8,16或32,单位是byte;fill_value是要填充的值;max_padding最大的填充界限,请求填充的bytes数超过该值,将被忽略。
.byte <byte1> {,<byte2>} … 定义一个或多个Byte,并为之分配空间(与ar masm的DCB类似)。
.code <number_of_bits> 设定指令宽度,16表示Thumb,32表示ARM assembl y(和armasm中的CODE16,CODE32相同)。
.if.else.endif预编译宏(与armasm中的IF ELSE ENDIF相同)。
.end 汇编文件结束标志,常常省略不用。
.endm 宏结束标志。
.exitm 宏跳出。
.macro <name> {<arg_1} {,<arg_2>} … {,<arg_N>}定义一段名为name的宏,arg_xxx为参数。
必须有对应的.endm结尾。
可以使用.exitm从中间跳出宏。
(与armasm中的MACRO, MEND, MEXIT相同)。
在使用宏参数时必须这样使用:“\<arg>”。
例如:[CODE].macro SHIFTLEFT a, b.if \b < 0MOV \a, \a, ASR #-\b.exitm.endifMOV \a, \a, LSL #\b.endm.rept <number_of_times> 循环执行.endr前的代码段number_of_times次。
(与armasm中的WEN相似).irp <param> {,<val_1>} {,<val_2>} …循环执行.endr前的代码段,param依次取后面给出的值。
在循环执行的代码段中必须以“\<param> ”表示参数。
.endr 结束循环(与armasm中的WEND相似)..equ <symbol name>, <value> 为一个标号赋值,类似C中的#define。
(与arm asm中的EQU相同).err 编译错误报告,将引起编译的终止。
.global <symbol> 全局声明标志,这样声明的标号将可以被外部使用。
(与arm asm中的EXPORT相同)。
.hword <short1> {,<short2>} …插入一个16-bit的数据队列。
(与armasm中的DCW相同).ifdef <symbol> 如果 <symbol>被定义,该快代码将被编译。