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...