日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ARM 汇编学习——编写简单的ARM汇编程序

發布時間:2023/12/9 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARM 汇编学习——编写简单的ARM汇编程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?首先,我們先看一個簡單的匯編程序:

[plain]?view plaincopy
  • ????area?ff,code,readonly???;聲明代碼段??
  • ????code32??;聲明為32位ARM指令??
  • ????entry???;聲明程序入口??
  • start??
  • ????;b指令??
  • ????;1.b?跳轉范圍+_?32M?b?+?標號??
  • ????;b?start??
  • ????;b?stop??
  • ????;2.bl?子函數調用??
  • ????;會把預取指令的地址保存在lr(r14)??
  • ????;3.bx?子函數返回??
  • ????mov?r0,#9??
  • ????mov?r1,#15??
  • ????mov?r5,#9??
  • ????bl?func??
  • ????;int?func(int?a,int?b)??
  • stop??
  • ????b?stop??
  • func??
  • ????mov?r5,#1???
  • loop??
  • ????cmp?r0,r1??
  • ????beq?stop1??
  • ????subgt?r0,r0,r1??
  • ????sublt?r1,r1,r0??
  • ????b?loop??
  • stop1??
  • ????bx?lr??
  • ????end??
  • 可以看出,ARM匯編程序用“;”號進行注釋。

    ?

    一、匯編語言程序格式

    ?????? 一個完整的ARM匯編由兩部分組成:聲明實際代碼段兩部分組成。

    1、聲明

    ??????在一個程序之前先要進行聲明:

    1)聲明代碼段:

    ??????用AREA指令定義一個段,說明所定義段的相關屬性。(說明段的名字,段的屬性)

    2) 聲明ARM指令:

    ???? 用CODE32或CODE16來聲明程序為32位ARM指令或是16位Thumb指令。

    3)? 聲明程序入口:

    ?????用ENTRY指令標識程序的入口點。

    注:

    ?????這3個聲明缺一不可。

    ???? 在程序完成后要用END 指令聲明程序結束。每一個匯編程序段都必須有一條END指令,指示代碼段的結束。

    ?

    2、段

    1)在ARM匯編語言程序中,以程序段為單位組織代碼。段是相對獨立的指令或數據序列,具有特定的名稱。

    2)段的分類

    ??????代碼段:代碼段的內容為執行代碼

    ???? ?數據段:數據段存放代碼運行時需要用到的數據。

    注:一個匯編程序至少有一個代碼段。如果程序較長時,可以分割為多個代碼段和數據段。多個段在程序編譯連接時最終形成一個可執行的映像文件。

    3)段具有以下的屬性

    ? READONLY

    ? READWRITE

    ?

    二、匯編語言的語句格式

    ????????[LABEL]? OPERATION? [OPERAND] [;COMMENT]

    ????????標號域??? ?操作助記符域 操作數域?????? 注釋域?

    1.?? 標號域(LABLE)

    1>標號域用來表示指令的地址、變量、過程名、數據的地址和常量。

    2>標號是可以自己起名的標識符,語句標號可以是大小寫字母混合,通常以字母開頭,由字母、數字、下劃線等組成。

    3> 語句標號不能與寄存器名、指令助記符、偽指令(操作)助記符、變量名同名。

    4> 語句標號必須在一行的開頭書寫,不能留空格。?????

    ?

    2.?? 操作助記符域(OPERATION)

    1>操作助記符域可以為指令、偽操作、宏指令或偽指令的助記符。

    2> ARM匯編器對大小寫敏感,在匯編語言程序設計中,每一條指令的助記符可以全部用大寫、或全部用小寫,但不允許在一條指令中大、小寫混用

    3> 所有的指令都不能在行的開頭書寫,必須在指令的前面有空格,然后再書寫指令

    4> 指令助記符和后面的操作數或操作寄存器之間必須有空格,不可以在這之間使用逗號

    ?

    3.?? 操作數域(OPERAND)

    操作數域表示操作的對象,操作數可以是常量、變量、標號、寄存器名或表達式,不同對象之間必須用逗號“,”分開

    ?

    三、ARM指令集格式

    ??????? opcode? {<cond>}{S}??? <Rd>,<Rn>? {,<operand2>}

    1、其中<>中的項是必須的,{}中的項是可選的。

    ?

    2、opcode? 表示指令助記符

    cond:表示執行條件

    S:表示是否影響CPSR寄存器的值。

    Rd:表示目標寄存器

    Rn:表示第一個操作數的寄存器

    operand2:表示第2個操作數

    ?

    3、“operand2”具有如下的形式:

    1>#immed_8r:常數表達式

    eg: MOV? R0,#1

    ????? ADD?? R0,R1,#0X0F?

    2>Rm:寄存器形式。

    即在寄存器方式下,操作數即為寄存器的數值。

    eg: MOV???? PC,R0

    ????? ADD???? R1,R1,R2

    3>Rm,shift:寄存器移位方式。

    將寄存器的移位結果作為操作數,當Rm值保持不變。

    ? ASR #n:表示算術右移n位。

    ? LSR? #n:表示邏輯右移n位。

    ? ROR #n:表示循環右移n位。

    ? RRX??? #n:帶擴展的循環右移n位。

    ? LSL? #n:邏輯左移n位。

    ?

    4、 使用條件碼“cond”可以實現高效的邏輯操作,提高代碼的效率。

    ? 所有的ARM指令都可以條件執行。

    ? Thumb指令只有B(跳轉)指令具有條件執行功能。

    注:如果執行中不表明條件碼,默認為無條件(AL)執行。

    ?

    四、匯編程序中常用的符號

    ?????? 在匯編語言程序設計中,經常使用各種符號表示變量、常量和地址

    ? 符號由大小寫字母、數字以及下劃線組成。

    ? 符號區分大小寫,同名的大、小寫符號會被編譯器認為是兩個不同的符號。

    ? 符號在其作用范圍內必須唯一,即在其作用范圍內不可有同名的符號。

    ? 自定義的符號名不能與系統的保留字相同。

    ?? ?符號名不應與指令或偽指令同名。

    1.?? 程序中的變量:

    1>ARM匯編程序所支持的變量有數字變量,邏輯變量和字符串變量

    2>在ARM匯編程序設計中,可使用GBLA,GBLL,GBLS偽定義聲明全局變量,使用LCLA,LCLL,LCLS聲明局部變量,并可使用SETA,SETL和SETS對其經行初始化。

    2.?? 程序中的常量

    1>ARM匯編程序所支持常量有數字常量,邏輯常量和字符串常量。

    3.?? 程序中的變量代換

    1>程序中的變量可通過代換操作取的一個常量。代換操作符為”$”

    2>使用示例:

    [plain]?view plaincopy
  • LCLS????S1??
  • LCLS????S2????;定義局部字符串變量S1和S2??
  • S1??????SETS????????“Test!”??
  • S2??????SETS????????“This?is?a?$?S1”;S2的值為“This?is?a?Test ?
  • 總結

    以上是生活随笔為你收集整理的ARM 汇编学习——编写简单的ARM汇编程序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。