首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

arm-Linux汇编语法及它和ADS汇编转换的问题

arm-Linux汇编语法及它和ADS汇编转换的问题

          第一部分 Linux下ARM汇编语法        
            尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点(www.gnu.org)上下载有关规范。        
  
      一. Linux汇编行结构    
            任何汇编行都是如下结构:      
      [:] [} @ comment      
      [:] [} @ 注释      
      Linux ARM 汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要在一行的开始。      
      【例1】定义一个"add"的函数,返回两个参数的和。      
      .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        
  
      二. Linux 汇编程序中的标号    
            标号只能由a~z,A~Z,0~9,“.”,_等字符组成。当标号为0~9的数字时为局部标号,局部标号可以重复出现,使用方法如下:      
       标号f: 在引用的地方向前的标号      
       标号b: 在引用的地方向后的标号      
      【例2】使用局部符号的例子,一段循环程序      
      1:      
          subs r0,r0,#1        @每次循环使r0=r0-1      
          bne 1f         @跳转到1标号去执行      
      局部标号代表它所在的地址,因此也可以当作变量或者函数来使用。        
  
      三. Linux汇编程序中的分段    
            (1).section伪操作      
      用户可以通过.section伪操作来自定义一个段,格式如下:      
       .section section_name [, "flags"[, %type[,flag_specific_arguments]]]      
      每一个段以段名为开始, 以下一个段名或者文件结尾为结束。这些段都有缺省的标志(flags),连接器可以识别这些标志。(与armasm中的AREA相同)。      
      下面是ELF格式允许的段标志      
      <标志> 含义      
      a 允许段      
      w 可写段      
      x 执行段      
      【例3】定义段      
       .section .mysection @自定义数据段,段名为 “.mysection”      
       .align  2      
       strtemp:      
       .ascii  "Temp string \n\0"      
      (2)汇编系统预定义的段名      
      .text  @代码段      
      .data  @初始化数据段      
      .bss  @未初始化数据段      
      .sdata @      
      .sbss  @      
      需要注意的是,源程序中.bss段应该在.text之前。      
      四. 定义入口点      
      汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点。      
      【例4】定义入口点      
      .section.data      
      < initialized data here>      
      .section .bss      
      < uninitialized data here>      
      .section .text      
      .globl _start      
      _start:      
      <instruction code goes here>        
  
      五. Linux汇编程序中的宏定义    
            格式如下:      
       .macro 宏名 参数名列表   @伪指令.macro定义一个宏      
         宏体      
       .endm  @.endm表示宏结束      
      如果宏使用参数,那么在宏体中使用该参数时添加前缀“\”。宏定义时的参数还可以使用默认值。      
      可以使用.exitm伪指令来退出宏。      
      【例5】宏定义      
      .macro SHIFTLEFT a, b      
      .if \b < 0      
      MOV \a, \a, ASR #-\b      
      .exitm      
      .endif      
      MOV \a, \a, LSL #\b      
      .endm        
  
      六. Linux汇编程序中的常数    
            (1)十进制数以非0数字开头,如:123和9876;      
      (2)二进制数以0b开头,其中字母也可以为大写;      
      (3)八进制数以0开始,如:0456,0123;      
      (4)十六进制数以0x开头,如:0xabcd,0X123f;      
      (5)字符串常量需要用引号括起来,中间也可以使用转义字符,如: “You are welcome!\n”;      
      (6)当前地址以“.”表示,在汇编程序中可以使用这个符号代表当前指令的地址;      
      (7)表达式:在汇编程序中的表达式可以使用常数或者数值, “-”表示取负数, “~”表示取补,“<>”表示不相等,其他的符号如:+、-、*、 /、%、<、<<、>、>>、|、&、^、!、==、>=、<=、&&、|| 跟C语言中的用法相似。
继承事业,薪火相传
返回列表