ARM匯編指令學(xué)習(0) ARM 匯編語(yǔ)言程序格式
可執行映象文件的格式:*.axm *.bin *.elf *.hex
本文引用地址:http://dyxdggzs.com/article/201611/317789.htm代碼段示例:
匯編語(yǔ)言源程序的基本結構:
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體系結構3種執行流程:
1順序執行
2跳轉執行
3異常中斷執行
Arm子程序調用使用命令BL子程序名稱(chēng)
子程序調用示例:
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集成開(kāi)發(fā)環(huán)境中包含的C/C++編譯器。
編譯器 名稱(chēng) | 編譯器 種類(lèi) | 源文件 類(lèi)型 | 源文件 后綴 | 輸出目標文件類(lèi)型 |
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++程序中使用內嵌的匯編指令的語(yǔ)法格式:
在A(yíng)RM C語(yǔ)言程序中,使用關(guān)鍵字__asm來(lái)標識一段匯
編指令程序。
__asm;2個(gè)下劃線(xiàn)
{
匯編語(yǔ)言程序
~~~~~~~~
匯編語(yǔ)言程序
}
其中:如果一行中有多個(gè)匯編指令,指令之間使用分號(;)分開(kāi)。
在一條指令占多行,要使用續行符號().
在C/C++程序中內嵌匯編指令注意事項:
o必須小心使用物理寄存器,如R0~R3,SP,LR和CPSR中的N,Z,C,V標志位.因為計算匯編代碼中的C表達式時(shí),可能會(huì )使用這些物理寄存器,并會(huì )修改N,Z,C,V標志位。
__asm
{
MOV R0,x
ADD y,R0,x/y //計算x/y時(shí)R0會(huì )被修改
}
在計算x/y時(shí)R0會(huì )被修改,從而影響R0+x/y的結果.用一個(gè)C程序的變量代替
R0就可以解決這個(gè)問(wèn)題:
__asm
{
MOV var,x
ADD y,var,x/y
}
內嵌匯編器探測到隱含的寄存器沖突就會(huì )報錯.
o不要使用寄存器代替變量.盡管有時(shí)寄存器明顯對應某個(gè)變量,但也不能直接使用寄存器代替變量.
int bad_f(int x) //x存放在R0中
{
__asm
{
ADD R0,R0,#1 //發(fā)生寄存器沖突,實(shí)際上x(chóng)的值沒(méi)有變化
}
return(x);
}
盡管根據編譯器的編譯規則似乎可以確定R0對應x,但這樣的代碼會(huì )使內嵌匯編器認為
發(fā)生了寄存器沖突.用其他寄存器代替R0存放參數x,使得該函數將x原封不動(dòng)地返回.
這段代碼的正確寫(xiě)法如下:
int bad_f(intx)
{
__asm
{
ADD x,x,#1
}
return(x)
}
從匯編程序中訪(fǎng)問(wèn)C程序變量
在C程序中聲明的全局變量可以被匯編程序通過(guò)地址間接訪(fǎng)問(wèn)。具體訪(fǎng)問(wèn)方
法如下:
o使用IMPORT偽指令聲明這個(gè)全局變量。
o使用LDR指令讀取該全局變量的內存地址,通常該全局變量的內存地址存放在程序的數據緩沖池中。
o根據該數據類(lèi)型,使用相應的LDR指令讀取該全局變量的值;使用相應的STR指令修改該全局變量的值。
AREAglobals,CODE,READONLY
EXPORT asmsub
IMPORTglovbvar;聲明外部變量glovbvar
asmsub
LDR R1,=glovbvar;裝載變量地址
LDR R0,[R1];讀出數據
ADD R0,R0,#1;加1操作
STR R0,[R1];保存變量值
MOV PC, LR
END
C程序與匯編程序互相調用規則
寄存器的使用規則
- 子程序間通過(guò)寄存器R0~R3來(lái)傳遞參數。
- 在子程序中,使用寄存器R4~R11來(lái)保存局部變量。
- 寄存器R12用于子程序間scratch寄存器(用于保存SP,在函數返回時(shí)使用該寄存器出桟),記作IP。
- 寄存器R13用于數據棧指針,記作SP。寄存器SP在進(jìn)入子程序時(shí)的值和退出子程序時(shí)的值必須相等。
- 寄存器R14稱(chēng)為鏈接寄存器,記作LR。它用于保存子程序的返回地址。
- 寄存器R15是程序計數器,記作PC
*.axf(下載到sdram里面調試(AXD))
ARM fromelf(轉化)---->*.bin*.elf*.hex*.i32燒寫(xiě)到flash里面保存
1.將映象文件(*.axf)下載到SDRAM內調試,工具為JTAG板或者仿真器.
RO BASE:設置SDRAM內的地址,可以設置SDRAM的首地址,或者是靠近首
地址值的地址值,RO BASE的值一定要按照字對齊.
RW BASE:也可以不設置,如果要設置,RW BASE –RO BASE >映象文件的大下
最好不設置,值一定要按照字對齊.
2.將映象文件(*.bin *.hex)燒寫(xiě)到nor flash內
RO BASE:設置flash首地址(0x00000000),值一定要按照字對齊.
RW BASE:一定要設置,設置的地址值在SD RAM內,值一定要按照字對齊.
IMAGE ENTRY POINT:可以不設置,如果設置就和RO BASE的值.
PLACE AT BEGINNING OF IMAGE
Object/Symbol:填寫(xiě)映象文件中,第一個(gè)要執行的源文件的目標文件.
(異常中斷的跳轉函數)
評論