⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arm汇编伪指令详解(转载).txt

📁 在PROTEUS中使用ARM处理器及uC/OS-II移植理解
💻 TXT
📖 第 1 页 / 共 2 页
字号:
ARM汇编伪指令详解(转载)
2007-09-13 00:40ARM汇编程序分析过程中,比较难理解的是他的伪操作、宏指令和伪指令。在读vivi时遇到很多不懂的,所以在此对引导程序中出现伪操作、宏指令和伪指令进行总结, 
*****************************************************
     一、GET option.s
// GET和INCLUDE功能相同
功能:引进一个被编译过的文件。
格式:GET     filename
其中:fiename     汇编时引入的文件名,可以有路径名。
     GET符号在汇编时对宏定义,EQU符号以及存储映射时是很有用的,在引入文件汇编完以后,汇编将从GET符号后开始。在被引入的文件中可能有GET符号再引入其他的文件。GET符号不能用来引入目标文件。
*****************************************************
     二、INTPND EQU 0x01e00004
//EQU可以用“*”代替,在阅读源程序时注意。
功能:对一个数字常量赋予一个符号名。
格式:name     EQU    expression
其中:name    符号名。Expression     寄存器相关或者程序相关的固定值。
     使用EQU定义常量,与C语言中用#define定义一个常量相同。
例:num    EQU    2     ; 数字2赋予符号num
*****************************************************
     三、GBLL     THUMBCODE
         [ {CONFIG} = 16
             THUMBCODE SETL {TRUE}
             CODE32
         |  
             THUMBCODE SETL {FALSE}
         ]
         [ THUMBCODE
             CODE32    ;for start-up code for Thumb mode
         ]
//其中[=IF ,|=ELSE ,]= ENDIF, CODE32 表明一下操作都在ARM状态。这些都是伪操作这段理解为设定THUMCODE的值,然后确定,用户的程序是在ARM状态还是THUM状态。
*****************************************************
     四、MACRO
         $HandlerLabel HANDLER $HandleLabel
         $HandlerLabel
         sub sp,sp,#4 ;decrement sp(to store jump address)
         stmfd sp!,{r0} ;PUSH the work register to stack
         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
//MACRO……MEND
功能:标志一下宏的定义。
格式:MACRO
      Macro_prototype
      MEND
宏表达式的格式如下:
{$label}    macroname     {$ parameter{,parameter2}…}
其中:
$ label    参数,在宏使用时,被给定的符号替代。
Macroname    宏的名称,并不一定以一条指令或者符号名开始。
$parameter     在宏使用时,被替代的参数,格式为:$parameter=“default value”
    在宏体中,参数如:$parameter和变量一样使用,在被宏引用时,被赋于新值,参数必须用“$”符号加于区别。$label在宏定义内部符号 时很有用,可以看作宏的参数。使用“|”符号作为使用一个参数缺省值的变量,如果使用的是一个空格符串,将省去该变量。在使用内部标志的宏定义中,将内部 标志定义为带后缀的标志,将会很有用。如果在扩展中空间不够,可以作为参数和后继文字之间或者参数之间使用圆点隔开,但在文本和后继参数之间不能使用圆点。宏可以定义局部变量的范围。宏还可以嵌套使用。
例:
MACRO
$label     xmac     $p1,$p2
           LCLS    err
$labell,loopl
           BGE     $pl
$labell,loop2
           BL      $p1
           BEG       $p1
           BEG       $labell,loop2
MEND 
*****************************************************
     五、$和$$
//$临时变量替换,若程序中需要用字符$则用$$来表示,通常情况下,包含在两个||之间的$并不表示进行变量替换,但是如果|线是在双引号内,则将进行变量替换。用“.”来分割出变量名的用法,
GBLS STR1
GBLS STR2
STR1 SETS "AAA"
STR2 SETS "BBB$$STR1.CCC"   //汇编后STR2的值为bbAAACCC
*****************************************************
     六、 IMPORT   Main     ; The main entry of mon program
//该伪操作告诉编译器当前的符号不是在本文件中定义的,在本源文件中可能引用该符号,而不论该源文件是否使用该符号,该符号都将被加入到本源文件中。
格式:
IMPORT symbol {[WEAK]}
     symbol 引用的符号的名称,他是区分大小写的,[WEAK]指定这个选项后,如果symbol所在的源文件中没有被定义,编译器也不会报错。他和EXTERN作用相同,不同之处在于,如果本源文件没有实际引用该符号,该符号将不会被加入到本源文件的符号表中。
*****************************************************
     七、AREA     Init,CODE,READONLY
        ENTRY
//功能:指示汇编器汇编一段新的代码或新的数据区。
格式:
name   给出的特定段名。以数字开头,必须加竖线,否则,将报错,例如:|1_Data-Area|。某些名字已保留,如:|C$$code|已经被C编译器用作代码,或者用作与C库相连的代码段。
Attr     段名属性,下列属性是有效的:
ALIGN=expression
缺省状态下,AOF段将按4个字节对准,expression可以是2~31之间的整数,该段将按2(上标为expression)字节对准。例如,espression等于
10,该段将按1KB对准。
CODE         特定机器指令,缺省为READONLY。
COMDEF       通用段定义。该AOF段可能包括代码和数据,但必须与其他段名相区别。
COMMON       通用数据段,无须再注释定义任何代码和数据,通常由链接器初始化为零。
DATA         包含数据,但是不包含指令,缺省为READWRITE
INTERWORK    表明代码段可以适用ARM/Thumb interworking功能。
NOINIT       表明数据段可以初始化为零,只包含指示符。
PIC          表明定位独立段,可以不修改情况下,在任意地址执行。
READONLY     表明该段可读可写。
汇编时,必须至少有一个AREA指示符。使用AREA符号可以将源程序区分,但是必须不重名。通常需要独立的AOF段做为代码或者数据段,较大程序 可以分为多个代码段。AOF段可以定义局部标签的范围,可以使用ROUT符号。如果没有任何的AREA指示符定义,汇编器将会产生名为|$$$$$$$| 的AOF段和一条诊断信息,将限制由于缺少指示符而产生的错误信息,但是并不一定会成功汇编。
*****************************************************
     八、LTORG
//LTORG是在此指令出现的地方放一个文本池(literal pool). 在ARM汇编中常用到
     ldr    r0, =instruction      将地址instruction载入r0
     此时编译器将ldr尽可能的转变成mov或mvn指令。 如果转变不成, 将产生一个ldr指令,通过pc相对地址从一块保存常数的内存区读出instruction的值。此内存区既是文本池。一般的, 文本池放在END指令之后的地方。但是, 如果偏移地址大于4k空间, ldr指令会出错(因为ldr的相对偏移地址为12-bit的值). 此时使用LTORG放到会出错的ldr指令附近,以解决此问题。编译器会收集没有分配的ldr的值放到此文本池中
。所以必须在LDR指令前后4KB的范围内用LTORG显式地在代码段中添加一个文字池。
*****************************************************
     九、LDR r0,=WTCON ;watch dog disable 
       LDR r1,=0x0
功能:将一个32位常量或地址读取至寄存器。
格式:
LDR{condition} register,=[expression|Label-expression]
其中:
condition              可选的条件代码。
register               读取的寄存器。
expression             数字常量:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -