Gun汇编的保留字不是很多书会提到的, 查找起来很不方便, 我自己整理了一下. 希望对以后有用.
.ascii “<string>”<?xml:namespace prefix = o />
把string当成数据插入汇编中,和armasm的DCB类似.
.ascix “<string>”
类似 .ascii , 但在每个字符串后面跟一个零字节.
.balign <power_of_2> {, <fill_value> {, <max_padding> } }
对齐地址到<power_of_2>字节. 汇编器通过添加<fill_value>字节或者默认值来对齐, 如果需要填充的字节数大于<max_padding>, 则对齐不会发生.
.byte <bytr1> {, <byte2>} ….
把一系列的字节当成数据插入汇编, 和armasm的DCB类似.
.code <number_of_bits>
按bit 位役置指令的长度. 16位是Thumb, 32位是ARM, 这和armasm的CODE16和CODE32类似.
.else
使用在.if 和 .endif 之间. 和armasmr ELSE类似.
.end
标记一个汇编文件的结束. 这个通常被省略.
.endif
标志着条件汇编代码块的结束, 和armasm的ENDIF类似
.endm
结束一上宏定义. 和armasm的MEND类似
.endr
结束一个循环, 和armasm的WEND类似
.equ <symbol name>, <value>
设置一个标号(symbol)的值, 和armasm的EQU类似
.err
以一个错误导致汇编的结束.
.exitm
从当前宠定义体中提前退出. 和armasm的MEXIT类似
.global <symbol>
给标号<symbol>一个外部连接. 和armasmr EXPORT类似
.hword <short1> {, <short2>} …
把一系列的16位数当成数据插入汇编, 和armasm 的DCW类似
.if < logical_expression>
定义一个条件块, 以.endif 结束. 和armasmr IF类似
.ifdef <symbol>
如果<symbol> 是定义了的,则包含(include)下面的一段代码块, 这个代码块以 .endif来结束.
.ifndef <symbol>
如果<symbol> 是没有定义了的,则包含(include)下面的一段代码块, 这个代码块以 .endif来结束.
.include “<filename>”
包含指定的源文件. 和armasmr INCLUDE或者和C的#INCLUDE类似
.irp <param> {, <val_1>} {, <val_2>}….
开启一个循环的代码块,块中每个value列表的value 执行一次, 块以一个 .endr 来标记结束. 在循环的代码块中, 使用 \<param>来替代value列表中的value.
.macro <name> { <arg_1>} {,<arg_2>} …{, <arg_k>}
定义一个含有k个参数的名为<name>的宏. 宏定义必须以 .endm 来标记结束. 如果想提前跳出宏, 则可使用 .exitm . 这些和armasm中的MACRO, MEND和平MEXIT类似, 必须在宏参数前加一个”\”
.macro SHIFTLEFT a, b
.if \b<0
MOV \a, \a, ASR #-\b
.exitm
.endif
MOV \a, \a, LSL #\b
.endm
.rept <number_of_times>
按照指定的次数重复执行一个代码块, 这个块以 .endr 来标记结束
<register_name> .req <register_name>
为一个寄存器取个名字, tkg armasm的RN类似, 但这里右边的寄存器不能只给出寄存器号, 必须给出具体的寄存器, 如 acc .req r0.
.section <section_name> {, “<flags>”}
开始一个新的代码段或者数据段, 通常, 代码段称为 .text, 一个经过初始化的数据段称为 .data, 一个没有初始化的数据段称为 .bss . 它们都有默认的标记(flag), 连接器识别它们的默认名字, 和armasm的AREA类似,
ELF格式文件的<flag>
标记 含义
a 可分配段
w 可写段
x 可执行段
.set <variable_name> , <variable_value>
设置一个变量的值, 和armasm的SETA类似
.space <number_of_byte> {,<fill_byte>}
生成给定数量的字节, 如果指定了<fill_byte>, 则以指定的值填充每个字节, 如果没指定, 则以0 填充每个字节. 和armasm的SPACE类似
.word <word1> {,<word2>}…
把一系列的32位字当成数据插入汇编, 和armasm的DCD类似
用户1012427 2008-3-18 16:47
用户1360030 2007-5-5 19:09
请问 MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address)
ldr r0,=$HandleLabel;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND
这一段中的SUB SP,SP,#4怎么保存的PC啊,好象单独这一句不能保存跳转地址吧,看不懂,请大虾指教,学习了,谢谢
用户42895 2006-10-23 16:55
http://blog.21ic.com/more.asp?name=verver&id=30725