<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM匯編指令學(xué)習(xí)(0) ARM 匯編語(yǔ)言程序格式

          ARM匯編指令學(xué)習(xí)(0) ARM 匯編語(yǔ)言程序格式

          作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
          ARM匯編語(yǔ)言程序格式

          可執(zhí)行映象文件的格式:*.axm *.bin *.elf *.hex

          本文引用地址:http://www.ex-cimer.com/article/201611/317789.htm

          代碼段示例:

          匯編語(yǔ)言源程序的基本結(jié)構(gòu):

          AREA Init,CODE,READONLY

          ENTRY

          Start

          LDR R0,=0x3FF50000

          LDR R1,0xFF

          STR R1,[R0]

          LDR R0,=0x3FF5008

          LDR R1,0x01

          STR R1,[R0]

          END

          Arm體系結(jié)構(gòu)3種執(zhí)行流程:

          1順序執(zhí)行

          2跳轉(zhuǎn)執(zhí)行

          3異常中斷執(zhí)行

          Arm子程序調(diào)用使用命令BL子程序名稱

          子程序調(diào)用示例:

          AREA Init,CODE,READONLY

          ENTRY

          Start

          LDR R0,=0x3FF5000

          LDR R1,0xFF

          STR R1,[R0]

          LDR R0,=0x3FF5008

          LDR R1,0x01

          STR R1,[R0]

          BL PRINT_TEXT

          ┉┉

          PRINT_TEXT

          ┉┉

          MOV PC,LR

          ┉┉

          END

          C/C++及匯編語(yǔ)言的混合編程

          ARM集成開發(fā)環(huán)境中包含的C/C++編譯器。

          編譯器

          名稱

          編譯器

          種類

          源文件

          類型

          源文件

          后綴

          輸出目標(biāo)文件類型

          armcc

          C

          C

          *.C

          32位ARM代碼

          tcc

          C

          C

          *.C

          16位Thumb代碼

          armcpp

          C++

          C/C++

          *.C/*.C++

          32位ARM代碼

          tcpp

          C++

          C/C++

          *.C/*.C++

          16位Thumb代碼

          在CC++程序中使用內(nèi)嵌的匯編指令的語(yǔ)法格式:

          在ARM C語(yǔ)言程序中,使用關(guān)鍵字__asm來(lái)標(biāo)識(shí)一段匯

          編指令程序。

          __asm;2個(gè)下劃線

          {

          匯編語(yǔ)言程序

          ~~~~~~~~

          匯編語(yǔ)言程序

          }

          其中:如果一行中有多個(gè)匯編指令,指令之間使用分號(hào)(;)分開。

          在一條指令占多行,要使用續(xù)行符號(hào)().

          在C/C++程序中內(nèi)嵌匯編指令注意事項(xiàng):

          o必須小心使用物理寄存器,如R0~R3,SP,LR和CPSR中的N,Z,C,V標(biāo)志位.因?yàn)橛?jì)算匯編代碼中的C表達(dá)式時(shí),可能會(huì)使用這些物理寄存器,并會(huì)修改N,Z,C,V標(biāo)志位。

          __asm

          {

          MOV R0,x

          ADD y,R0,x/y //計(jì)算x/y時(shí)R0會(huì)被修改

          }

          在計(jì)算x/y時(shí)R0會(huì)被修改,從而影響R0+x/y的結(jié)果.用一個(gè)C程序的變量代替

          R0就可以解決這個(gè)問(wèn)題:

          __asm

          {

          MOV var,x

          ADD y,var,x/y

          }

          內(nèi)嵌匯編器探測(cè)到隱含的寄存器沖突就會(huì)報(bào)錯(cuò).

          o不要使用寄存器代替變量.盡管有時(shí)寄存器明顯對(duì)應(yīng)某個(gè)變量,但也不能直接使用寄存器代替變量.

          int bad_f(int x) //x存放在R0中

          {

          __asm

          {

          ADD R0,R0,#1 //發(fā)生寄存器沖突,實(shí)際上x的值沒(méi)有變化

          }

          return(x);

          }

          盡管根據(jù)編譯器的編譯規(guī)則似乎可以確定R0對(duì)應(yīng)x,但這樣的代碼會(huì)使內(nèi)嵌匯編器認(rèn)為

          發(fā)生了寄存器沖突.用其他寄存器代替R0存放參數(shù)x,使得該函數(shù)將x原封不動(dòng)地返回.

          這段代碼的正確寫法如下:

          int bad_f(intx)

          {

          __asm

          {

          ADD x,x,#1

          }

          return(x)

          }

          從匯編程序中訪問(wèn)C程序變量

          在C程序中聲明的全局變量可以被匯編程序通過(guò)地址間接訪問(wèn)。具體訪問(wèn)方

          法如下:

          o使用IMPORT偽指令聲明這個(gè)全局變量。

          o使用LDR指令讀取該全局變量的內(nèi)存地址,通常該全局變量的內(nèi)存地址存放在程序的數(shù)據(jù)緩沖池中。

          o根據(jù)該數(shù)據(jù)類型,使用相應(yīng)的LDR指令讀取該全局變量的值;使用相應(yīng)的STR指令修改該全局變量的值。

          AREAglobals,CODE,READONLY

          EXPORT asmsub

          IMPORTglovbvar;聲明外部變量glovbvar

          asmsub

          LDR R1,=glovbvar;裝載變量地址

          LDR R0,[R1];讀出數(shù)據(jù)

          ADD R0,R0,#1;加1操作

          STR R0,[R1];保存變量值

          MOV PC, LR

          END

          C程序與匯編程序互相調(diào)用規(guī)則

          寄存器的使用規(guī)則

          1. 子程序間通過(guò)寄存器R0~R3來(lái)傳遞參數(shù)。
          2. 在子程序中,使用寄存器R4~R11來(lái)保存局部變量。
          3. 寄存器R12用于子程序間scratch寄存器(用于保存SP,在函數(shù)返回時(shí)使用該寄存器出桟),記作IP。
          4. 寄存器R13用于數(shù)據(jù)棧指針,記作SP。寄存器SP在進(jìn)入子程序時(shí)的值和退出子程序時(shí)的值必須相等。
          5. 寄存器R14稱為鏈接寄存器,記作LR。它用于保存子程序的返回地址。
          6. 寄存器R15是程序計(jì)數(shù)器,記作PC

          *.axf(下載到sdram里面調(diào)試(AXD))

          ARM fromelf(轉(zhuǎn)化)---->*.bin*.elf*.hex*.i32燒寫到flash里面保存

          1.將映象文件(*.axf)下載到SDRAM內(nèi)調(diào)試,工具為JTAG板或者仿真器.

          RO BASE:設(shè)置SDRAM內(nèi)的地址,可以設(shè)置SDRAM的首地址,或者是靠近首

          地址值的地址值,RO BASE的值一定要按照字對(duì)齊.

          RW BASE:也可以不設(shè)置,如果要設(shè)置,RW BASE –RO BASE >映象文件的大下

          最好不設(shè)置,值一定要按照字對(duì)齊.

          2.將映象文件(*.bin *.hex)燒寫到nor flash內(nèi)

          RO BASE:設(shè)置flash首地址(0x00000000),值一定要按照字對(duì)齊.

          RW BASE:一定要設(shè)置,設(shè)置的地址值在SD RAM內(nèi),值一定要按照字對(duì)齊.

          IMAGE ENTRY POINT:可以不設(shè)置,如果設(shè)置就和RO BASE的值.

          PLACE AT BEGINNING OF IMAGE

          Object/Symbol:填寫映象文件中,第一個(gè)要執(zhí)行的源文件的目標(biāo)文件.

          (異常中斷的跳轉(zhuǎn)函數(shù))



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();