ARM体系结构与编程学习(四)

来源:互联网 发布:淘宝企业店铺公司简介 编辑:程序博客网 时间:2024/05/29 10:16

4.3 arm汇编语言格式

{symbol}  {instruction|directive|pseudo-instruction}   {;comment}

其中:symbol为符号。符号必须从一行的行头开始,并且符号不能有空格。在指令和伪指令中,符号用作地址标号。在伪操作中,符号用作

                                 变量或者常量

          instruction,指令不能从一行的行头开始,前面必须有空格或者符号

          directive      伪操作

          pseudo-instruction,伪指令

          comment为注释,以;开头

在arm汇编语言中,各个指令、伪指令、伪操作的助记符必须全部用大写字母或者全部用小写字母

/这个符号表示下一行将续在本行之后,/之后不能有其他符号,空格和制表符也不行

4.3.2 arm汇编语言中的表达式

  表达式的优先级

1、括号内的表达式优先级最高

2、各种操作都有一定的优先级

3、相邻的单目操作符的执行顺序为从右到左,单目操作符优先级高于其他操作符

4、优先级相同的双目操作符执行顺序为从左到右

字符串表达式

GBLS  STRING1                    ;声明字符串变量STRING1

GBLS  STRING2                    ;声明字符串变量STRING2

STRING1  SETS  "AAACCC"   ;给字符串变量赋值

STRING2  SETS  "BB":CC:(STRING1:LEFT:3)     ;为变量STRING2赋值为"BBAAA"

数字表达式

注意:数字表达式表示一个32位的整数,进行大小比较时都是无符号数,DCQ及DCQU表示的数的范围是0~2^64-1

4.4 arm汇编语言程序格式

arm汇编语言以段(section)为单位。段分为代码段和数据段。

AREA  EXAMPLE  ,CODE ,READNOLY

ENTRY

start

        MOV  r0,#10

        MOV  r1, #3

        ADD  r0, r0,r1

END

4.4.2 汇编语言子程序调用

子程序调用时通过BL指令完成

AREA  EXAMPLE2 ,CODE ,READONLY

ENTRY

start     MOV R0 ,#10   ;设置输入参数R0

            MOV  R1 ,#3     ;设置输入参数R1

BL     doadd                 ;调用子程序doadd

doadd  ADD R0,R0 ,R1 ;子程序

            MOV  PC ,LR      ;从子程序返回

END

arm汇编程序设计实例

;声明两个字符变量,用以存放两个函数参数

        GBLS    _arg0

        GBLS    _arg1

;宏_spaces_remove

;删除全局变量wstring开头和结尾的空格

        MACRO

        _spaces_remove  $wstring

        WHILE  ( ("*" :CC:$wstring):RIGHT :1=“ ”)

$wstring  SETS  ($wstring :LEFT: (:LEN:$wstring-1))

        WEND

        WHILE  ( ($string:CC: "*"):LEFT:1=" ")

$wstring  SETS  ($wstring :RIGHT: (:LEN:$wstring-1))

         WEND

         MEND

;宏_lbracket_remove

;删除一起左括号-如果不存在左括号则报错

        MACRO

        _lbracket_remove  $s

        ASSERT   $s:LEFT:1="("

$s   SETS  $s:RIGHT:(:LEN:$s-1)

        _spaces_remove  $s

        MEND

;宏_rbracket_remove

;删除一起右括号-如果不存在右括号则报错

        MACRO

        _lbracket_remove  $s

        ASSERT   $s:RIGHT:1=")"

$s   SETS  $s:LEFT:(:LEN:$s-1)

        _spaces_remove  $s

        MEND

;宏_comment_remove

;删除行末的所有注释及空格

        MACRO

        _comment_remove $s

        _spaces_remove     $s

        IF  (("**":CC:$s):RIGHT:2)="*/"

          WHILE ($s:RIGHT:2)<> "/*"

$s      SETS  $s:LEFT:(:LEN:$s-1)

          WEND

$s      SETS  $s:LEFT:(:LEN:$s-2)

        _spaces_remove  $s

        ENDIF

        MEND

;宏_arg_remove

;从一个用空格分割的串中获取一个变量

        MACRO

        _arg_remove    $s,$arg

        LCLA         _arglen

        LCLL         _ok

        _arglen   SETA   0

        _ok          SETL   {TRUE}

        WHILE    _ok

          IF  _arglen>=:LEN:$s

_ok           SETL  {FALSE}; break if used up input string

          ELSE

$arg          SETS  ($s:LEFT:(_arglen+1)):RIGHT :1   ;下一个字符

          IF $arg=" "

_ok    SETL    {FALSE}

          ELSE

_arglen    SETA   _arglen+1

          ENDIF

        ENDIF

       WEND

$arg      SETS   $s:LEFT:_arglen

$s         SETS  $s:RIGHT:(:LEN:$s-arglen)

          _spaces_remove  $s

        MEND

;宏define

;作用:使用#define定义C/Assembler变量

;语法格式如下:#<space/tab>define<spaces><symbol><spaces><value></*comment*/>

        MACRO

$la    define   $a

_arg0  SETS  "$a"

        ASSERT   "$la"="#"

        _comment_remove   _arg0

        _arg_remove            _arg0,_arg1

        IF  "$_arg0"  /=""

$_arg1   EQU   $_arg0

        ELSE

$_arg1  EQU   1

        ENDIF

        MEND

        MACRO

$la     ifndef     $a

        MEND

        MACRO

$la     endif    $a

        MEND

;comment

;作用:用于注释

;语法格式:comment <anything you like>

        MACRO

        COMMENT  $a,$b,$c

        MEND

        ASSERT   $s:LEFT:1="("

$s   SETS  $s:RIGHT:(:LEN:$s-1)

        _spaces_remove  $s

        MEND