GNU ARM Assembler Quick Reference
GNU ARM 汇编简明参考手册
A summary of useful commands and expressions for the ARM architecture using the GNU assembler is
presented briefly in the concluding portion of this Appendix.
在本附录的最后部分简要介绍了使用GNU汇编程序的ARM体系结构的有用命令和表达式。
Each assembly line has the following format:
[
Unlike the ARM assembler, using the GNU assembler does not require you to indent instructions and
directives. Labels are recognized by the following colon instead of their position at the start of a line.
与ARM汇编程序不同,使用GNU汇编程序不需要在指令或伪操作前缩进。标号由跟随在其后的“:”识别,而不是其在行首的位置。
An example follows showing a simple assembly program defining a function ‘add’ that returns the sum of
two input arguments:
.section .text, “x”
.global add @ give the symbol add external linkage
add:
ADD r0, r0, r1 @ add input arguments
MOV pc, lr @ return from subroutine
@ end of program
一个返回两个参数和的‘add’函数例子:
.section .text, “x”
.global add @ 赋予add符号外部链接属性
add:
ADD r0, r0, r1 @ r0 r1是传入的参数,可以搜索gnu eabi来获取更多信息
MOV pc, lr @ lr存储了返回的指令地址,将lr赋值给pc就会从子程序返回
@ 程序结束
GNU Assembler Directives for ARM
ARM GNU 汇编伪操作
The follow is an alphabetical listing of the more command GNU assembler directives.
下表是按字母顺序排序的常见GNU 汇编伪操作
GNU Assembler Directive Description
GNU 汇编为操作 描述
.ascii “
.ascii "<字符串>" 将字符串作为数据插入,可以通过添加一个标号引用它
hello:
.ascii "hello"
.asciz “
.asciz "<字符串>" 和.ascii很像,但是会在字符串结尾附加'\0'
.balign
{,
{,
bytes are required (similar to ALIGN in armasm).
.balign <2的幂次>
{,<填充字节> 对齐地址到<2的幂次>的整倍数。汇编工具用<填充字节>或一个恰当的默认字节
{,<最大填充字节数>} } 从当前地址填充到对齐地址。需要填充的字节如果超过了<最大填充字节数>
对齐操作不会执行
.byte
.byte <字节1> {,<字节2>} ... 将一列单字节范围的数值作为数据插入
.code
ARM assembly (similar to CODE16 and CODE32 in armasm).
.code
.else Use with .if and .endif (similar to ELSE in armasm).
.else 和 .if 和 .endif 一起使用
.end Marks the end of the assembly file (usually omitted).
.end 标记汇编文件的结尾,一般会被省略
.endif Ends a conditional compilation code block – see .if, .ifdef, .ifndef (similar to ENDIF in armasm).
.endif 标记条件编译代码块的结束 - 参见 .if,.ifdef,.ifndef
.endm Ends a macro definition – see .macro (similar to MEND in armasm).
.endm 标记宏定义的结束 - 参见 .macro
.endr Ends a repeat loop – see .rept and .irp (similar to WEND in armasm).
.endr 结束一个重复循环 - 参见 .rept 和 .irp
.equ
.equ <标记名>, <数值> 这个伪指令设置<标记名>为<数值>,注意这里没有作为数据插入
.err Causes assembly to halt with an error.
.err 停止汇编操作并报错
.exitm Exit a macro partway through – see .macro (similar to MEXIT in armasm)
.exitm 在一个宏代码块的中间提前退出 - 参考 .macro
.global
.global <标记> 这条伪操作使<标记>可以被外部链接
.hword
...
.hword
...
.if
(similar to IF in armasm). See also .else.
.if <逻辑表达式> 根据<逻辑表达>真假决定是否执行紧随其后的代码块。使用.endif标记这个代码块的结束。
同时参考 .else.
.ifdef
.ifdef <标记> 如果<标记>被定义那么就包含紧随其后的代码块。使用.endif标记这个代码块的结束。
.ifndef
.ifndef <标记> 如果<标记>没有被定义那么就包含紧随其后的代码块。使用.endif标记这个代码块的结束。
.include “
.include “<文件名>” 包含<文件名>指定的源文件到当前文件中。
.irp {,
{,
repeated code block, use \ to substitute the associated
value in the value list.
.irp {,
{,
.macro
{,
macro at an earlier point, use .exitm. These directives are
similar to MACRO, MEND, and MEXIT in armasm. You must
precede the dummy macro parameters by \. For example:
.macro SHIFTLEFT a, b
.if \b < 0
MOV \a, \a, ASR #-\b
.exitm
.endif
MOV \a, \a, LSL #\b
.endm
.macro
.macro SHIFTLEFT a, b
.if \b < 0
MOV \a, \a, ASR #-\b
.exitm
.endif
MOV \a, \a, LSL #\b
.endm
.rept
.rept <次数> 重复执行一个代码块<次数>次,该代码块以.endr标记结束。
number on the right (e.g., acc .req r0).
.section
{,”
.bss, an uninitialized data section. These sections have default
flags, and the linker understands the default names (similar
directive to the armasm directive AREA). The following are
allowable .section flags for ELF format files:
a allowable section
w writable section
x executable section
.section <段名> 标记一个新的code或data段的开始。
{,”<属性标志>”} GNU段名 描述
.text a code section
.data an initialized data section, and
.bss an uninitialized data section.
这些段都有默认的属性标识,连接器可以识别处理这些默认的段名的属性
以下是允许的ELF格式文件的段属性标志
<标志> 含义
a 段需要占用内存
w 段可写
x 段可执行
.set
.set <变量名>, 设置<变量名>为的值为<变量值>
<变量值>
.space
{,
.space <字节数> 保留<字节数>个字节的空间,并用<填充字节>填充,如果没有指定<填充字节>则填充0。
{,<填充字节>}
.word
.word
Assembler Special Characters / Syntax
汇编器特殊字符及语法
Inline comment char: ‘@’
代码中的注释符号:'@'
Line comment char: ‘#’
整行注释符号:'#'
Statement separator: ‘;’
语句分割符:';'
Immediate operand prefix: ‘#’ or ‘$’
直接操作数前缀:'#' 或 '$'
Register Names
寄存器名
General registers: %r0 - %r15 ($0 = const 0)
通用寄存器: %r0 - %r15
FP registers: %f0 - %f7
FP寄存器: %f0 - %f7 (没有查到功能)
Non-saved (temp) regs: %r0 - %r3, %r12
临时寄存器(caller saved): %r0 - %r3,%r12
Saved registers: %r4 - %r10
全局寄存器(callee saved): %4 - %r10
Stack ptr register: %sp
堆栈指针寄存器: %sp
Frame ptr register: %fp
堆栈帧指针寄存器: %fp (和SP配合用于调试时backtrace功能)
Link (retn) register: %lr
链接返回寄存器: %lr (一是用来保存子程序返回地址;
二是当异常发生时,LR中保存的值等于异常发生时PC的值减4(或者减2),
因此在各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行)
Program counter: %ip
程序计数器: %ip (应该是原文件错了,这里是%pc,ip应该指Intra-Procedure-call Scratch Register)
Status register: $psw
状态寄存器: $psw
Status register flags: xPSR
状态寄存器标识: xPSR
(x = C current) xPSR_all
(x = S saved ) xPSR_f
xPSR_x
xPSR_ctl
xPSR_fs
xPSR_fx
xPSR_fc
xPSR_cs
xPSR_cf
xPSR_cx
.. and so on
Arm Procedure Call Standard (APCS) Conventions
Arm过程调用标准(APCS)约定
Argument registers: %a0 - %a4 (aliased to %r0 - %r4)
参数寄存器: %a0 - %a4 (别名 %r0 - %r4)
Returned value regs: %v1 - %v6 (aliased to %r4 - %r9)
返回值寄存器:%v1 - %v6 (别名 %r4 - %r9)
Addressing Modes
寻址模式
‘rn’ in the following refers to any of the numbered registers, but not the control registers.
'rn'代指除控制寄存器以外的寄存器
addr Absolute addressing mode
addr 绝对地址寻址模式,例如ldr r0,=msg
%rn Register direct
%rn 寄存器直接寻址,使用寄存器存储的值作为指令的参数
[%rn] Register indirect or indexed
[%rn] 寄存器间接寻址或下标寻址,寄存器存储的值是操作数的指针
[%rn,#n] Register based with offset
[%rn,#n] 寄存器基址偏移寻址,例如ldr r0,[%r1, #4]
#imm Immediate data
#imm 操作数在指令中直接使用
Machine Dependent Directives
机器相关伪操作
.arm Assemble using arm mode
.arm 汇编使用arm模式
.thumb Assemble using thumb mode
.thumb 汇编使用thumb模式
.code16 Assemble using thumb mode
.code16 汇编使用thumb模式
.code32 Assemble using arm mode
.code32 汇编使用arm模式
.force_thumb Force thumb mode (even if not supported)
.force_thumb 强制使用thumb模式,即使不支持
.thumb_func Mark entry point as thumb coded (force bx entry)
.thumb_func 标记函数的入口点为thumb代码(强制使用bx跳转)
.ltorg Start a new literal pool
.ltorg 标记一个新文字池的开始(文字池:嵌入式代码中用于存放常量的区域)
Opcodes
For detailed information on the machine instruction set, see this manual:
更多关于机器指令集的详细信息请参考这些手册:
ARM Architecture Reference Manual, Addison-Wesley ISBN 0-201-73719-1
Here is a recommended book to get a lot of system developer information on the ARM architecture.
ARM System Developer’s Guide, Morgan Kaufmann Publishers ISBN 1-55860-874-5 (alk.paper), authors:
Andrew N. Sloss, Dominic Symes, Chris Wright, 2004