ARM體系結構與程式設計學習(四)

2021-06-17 16:18:28 字數 3691 閱讀 3289

4.3 arm組合語言格式

變數或者常量

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

end4.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      ;從子程式返回

endarm彙編程式設計例項

;宣告兩個字元變數,用以存放兩個函式引數

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  

while    _ok

if  _arglen>=:len:$s

_ok           setl  ; break if used up input string

else

$arg          sets  ($s:left:(_arglen+1)):right :1   ;下乙個字元

if $arg=" "

_ok    setl   

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變數

;語法格式如下:#define

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

macro

comment  $a,$b,$c

mend

assert   $s:left:1="("

$s   sets  $s:right:(:len:$s-1)

_spaces_remove  $s

mend

ARM體系結構與程式設計

arm處理器的7中執行模式 usr fiq irq svc abt und sys。arm處理器共37個暫存器 31個通用暫存器 未備份暫存器r0 r7,在全部模式下指的都是同乙個物理暫存器 備份暫存器r8 r12,每乙個暫存器相應兩個不同的物理暫存器。對於r13 sp 和r14 lr 來說,每乙個...

ARM體系結構與程式設計學習(五)

ldr rd,label 示例 字串複製 example 2.7 顯示了用乙個字串覆蓋另乙個字串的 arm 例程。該例程使用ldr偽指令從乙個資料節中載入兩個字串的位址。有以下幾點需要特別注意 dcb dcb指令定義乙個或多個儲存位元組。除了整數值之外,dcb還接受帶引號的字串。字串的每個字元均存放...

ARM體系結構與程式設計學習(六)

adr偽指令例項 設定本段程式的名稱及屬性 area adrlabel code,readonly entry start 跳轉到子程式func執行 bl func 呼叫angel swireason reportexception arm semihosting swi stop mov r0,0...