當前位置:首頁 » 編程軟體 » arm匯編程序

arm匯編程序

發布時間: 2022-05-19 01:55:30

Ⅰ ARM匯編程序中有什麼方法可以實現跳轉

ARM指令集中的跳轉指令可以完成從當前指令向前或向後的32MB的
地址空間
的跳轉,包括以下4條指令:
B
跳轉指令
BL
帶返回的跳轉指令
BLX
帶返回和狀態切換的跳轉指令
BX
帶狀態切換的跳轉指令

Ⅱ ARM的匯編語言

ARM 當然有自己的指令集,與 x86 相比,由於 ARM 是 RISC 模式的,指令數量要比 x86 少很多,但 ARM 隨著版本的進步,也在指令集中增加了比較多的復雜指令,比如類似 DSP 的,還有 SIMD 的等等,要說比 x86 簡單,那是肯定的,但比起大多數 8 位處理器那是復雜了不是一星半點啊。
一般來說,學一種 CPU 就要包括其匯編語言,就 ARM 來說,有幾個架構版本確實不能純粹使用 C 語言完成所有工作,必須使用匯編作為輔助,但好在這些必須使用匯編的部分,邏輯基本固定了,如果不是有特殊應用,可以不用研究它,直接拿現成的代碼來用就行了。
最新的 ARM Cortex 系列處理器,除了編寫一些特殊的程序,如 RTOS 等等之外,已經完全可以不用匯編語言了,現在很多人在寫 ARM Cortex 程序,其實大部分都不懂 ARM 匯編的。

Ⅲ arm常用幾個匯編語言的程序

一。從一數到十
COUNT EQU 0x30003100 ;定義變數COUNT的基地址 AREA Example1,CODE,READONLY;聲明代碼段Example1為只讀 ENTRY ;標識程序入口

CODE32 ;聲明32位ARM指令 START LDR R1,=COUNT ;將0X30003100賦給R1 MOV R0,#0 ;執行R0=0
STR R0,[R1] ;存儲R0寄存器的數據到R1指向的存儲單元 LOOP LDR R1,=COUNT ;將0X30003100賦給R1
LDR R0,[R1] ;將R1中的數值作為地址,取出此地址中的數據保存到R0中 ADD R0,R0,#1 ;執行R0=R0+1
CMP R0,#10 ;將R0與10進行比較
MOVHS R0,#0 ;若R0大於等於10,則R0=0
STR R0,[R1] ;存儲R0寄存器的數據到R1指向的地址單元 B LOOP ;跳轉到LOOP
END ;匯編文件結束
二,9的8次冪
X EQU 9 ;初始化X為9 n EQU 8 ;初始化N為8
AREA Example3,CODE,READONLY ;生明代碼段Example3為只讀 ENTRY ;標識程序入口路
CODE32 ;聲明32位ARM指令
START LDR SP,=0x30003F00 ;把0x30003F00 賦給SP(R13) LDR R0,=X ;把9賦給R0 LDR R1,=n ;把8賦給R1
BL POW ;跳轉到POW,並把下一條指令地址存入到R14中 HALT B HALT ;等待跳轉
POW STMFD SP!,{R1-R12,LR} ;將R1-R12入棧,滿遞減堆棧 MOVS R2,R1 ;將R1賦給R2,並影響標志位 MOVEQ R0,#1 ;若Z=1,則R0=1
BEQ POW_END ;若Z=1,跳轉到POW_END MOV R1,R0 ;將R0中值賦給R1 SUB R2,R2,#1 ;將R2-1的只賦給R2 POW_L1 BL DO_MUL ;跳轉到DO-MUL,並把下一條指令地址存入R14中 SUBS R2,R2,#1 ;將R2-1的值賦給R2,並影響標志位 BNE POW_L1 ;若Z=0,跳轉到POW_L1
POW_END LDMFD SP!,{R1-R12,PC} ;數據出棧,存入到R1-R12,PC中 DO_MUL MUL R0,R1,R0 ;把R1*R0的值賦給R0 MOV PC,LR ;LR中的值賦給PC END ;匯編結束
三:從一一直加到一百
程序清單(一) C 語言實驗參考程序
#define uint8 unsigned char ;定義一個無符號字元常量uint8 #define uint32 unsigned int ;定義一個無符號整型常量unint32
#define N 100 ;定義一個常量N=100(宏定義,100用N代替) uint32 sum; ;定義sum為無符號整型常量(聲明一個unsigned int型的變數sum) void Main(void) ;主函數
{uint32 i; ;定義無符號整型常量i(聲明一個unsigned int型的變數i) sum=0; ;sum初始值為0
for(i=0;i<=N;i++) ;i在N內自增加1(i從0開始,i<=N時循環成立) {sum+=i;} ;把sum+i賦給sum while(1); ;為真循環 }
程序清單(二) 簡單的啟動代碼
IMPORT |Image$$RO$$Limit | ;R0輸出段存儲區域界線 IMPORT |Image$$RW$$Base | ;RW輸出段運行時起始地址 IMPORT |Image$$ZI$$Base | ;ZI輸出段運行時起始地址 IMPORT |Image$$ZI$$Limit | ;ZI輸出段存儲區域界線 IMPORT Main ;主函數
AREA Start,CODE,READONLY ;聲明代碼段start,為只讀 ENTRY ;程序入口
CODE32 ;聲明32位ARM指令 Reset LDR SP,=0x40003f00 ;將0x40003f00賦給SP
LDR R0,=|Image$$RO$$Limit| ;將R0輸出段存儲區域界線賦給R0 LDR R1,=|Image$$RW$$Base | ;將RW輸出段運行時起始地址賦給R1 LDR R3,=|Image$$ZI$$Base | ;將ZI輸出段運行時起始地址賦給R3 CMP R0,R1 ;比較R0和R1,相等Z=1,反之Z=0 BEQ LOOP1 ;若Z=1,則跳到LOOP1
LOOP0 CMP R1,R3 ;比較R1和R3,若R1<r3,c=0
LDRCC R2,[R0],#4 ;若C=0,讀取R0地址單元內容並且存入R2,且R0=R0+4 STRCC R2,[R1],#4 ;若C=0,讀取R2中的數據存入R1,且R1=R1+4 BCC LOOP0 ;若C=0,跳轉到LOOP0
LOOP1 LDR R1,=|Image$$ZI$$Limit| ;將ZI輸出段存儲區域賦給R1 MOV R2,#0 ;把0賦給R2
LOOP2 CMP R3,R1 ;比較R1和R3,若R1<r3,c=0 strcc="" r2,[r3],#4="" ;若c="0,將R2中數據保存到內存單元R3中,且R3=R3+4" bcc="" loop2="" b="" main="" ;跳轉到主程序="" end="" ;匯編結束=""
四、程序清單(一) C 語言調用匯編的參考程序
#define uint8 unsigned char ;定義一個無符號字元常量uint8 #define uint32 unsigned int ;定義一個無符號整型常量.uint32
extern uint32 Add(uint32 x,uint32 y); //聲明子程序Add為一個無符號整型常量,它為2個無符號整型常量x,y的和
uint32 sum; ;定義sum為無符號整型常量 void Main(void) ;無返回主程序
{sum=Add(555,168); ;sum等於555+168 while(1); ;為真循環 }
程序清單(二) 匯編加法函數程序

EXPORT Add ;聲明子程序Add方便調用 AREA Start,CODE,READONLY ;聲明代碼段start,為只讀 ENTRY ;程序入口
CODE32 ;聲明32位ARM指令
Add ADD R0,R0,R1 ;將R0+R1值賦給R0 MOV PC,LR ;將LR值賦給PC

Ⅳ 在arm的匯編程序中有哪幾種偽指令

在ARM匯編語言程序里,有一些特殊指令助記符,這些助記符與指令系統的助記符不同,沒有相對應的操作碼,通常稱這些特殊指令助記符為偽指令,他們所完成的操作稱為偽操作。偽指令在源程序中的作用是為完成匯編程序作各種准備工作的,這些偽指令僅在匯編過程中起作用,一旦匯編結束,偽指令的使命就完成。
在ARM的匯編程序中,有如下幾種偽指令:符號定義偽指令、數據定義偽指令、匯編控制偽指令、宏指令以及其他偽指令。

4.1.1 符號定義(Symbol Definition)偽指令
符號定義偽指令用於定義ARM匯編程序中的變數、對變數賦值以及定義寄存器的別名等操作。常見的符號定義偽指令有如下幾種:
— 用於定義全局變數的GBLA、GBLL和GBLS。
— 用於定義局部變數的LCLA、LCLL和LCLS。
— 用於對變數賦值的SETA、SETL、SETS。
— 為通用寄存器列表定義名稱的RLIST。
1、 GBLA、GBLL和GBLS
語法格式:
GBLA(GBLL或GBLS) 全局變數名
GBLA、GBLL和GBLS偽指令用於定義一個ARM程序中的全局變數,並將其初始化。其中:
GBLA偽指令用於定義一個全局的數字變數,並初始化為0;
GBLL偽指令用於定義一個全局的邏輯變數,並初始化為F(假);
GBLS偽指令用於定義一個全局的字元串變數,並初始化為空;
由於以上三條偽指令用於定義全局變數,因此在整個程序范圍內變數名必須唯一。
使用示例:
GBLA Test1 ;定義一個全局的數字變數,變數名為Test1
Test1 SETA 0xaa ;將該變數賦值為0xaa
GBLL Test2 ;定義一個全局的邏輯變數,變數名為Test2
Test2 SETL {TRUE} ;將該變數賦值為真
GBLS Test3 ;定義一個全局的字元串變數,變數名為Test3
Test3 SETS 「Testing」 ;將該變數賦值為「Testing」
2、 LCLA、LCLL和LCLS
語法格式:
LCLA(LCLL或LCLS) 局部變數名
LCLA、LCLL和LCLS偽指令用於定義一個ARM程序中的局部變數,並將其初始化。其中:
LCLA偽指令用於定義一個局部的數字變數,並初始化為0;
LCLL偽指令用於定義一個局部的邏輯變數,並初始化為F(假);
LCLS偽指令用於定義一個局部的字元串變數,並初始化為空;
以上三條偽指令用於聲明局部變數,在其作用范圍內變數名必須唯一。
使用示例:
LCLA Test4 ;聲明一個局部的數字變數,變數名為Test4
Test3 SETA 0xaa ;將該變數賦值為0xaa
LCLL Test5 ;聲明一個局部的邏輯變數,變數名為Test5
Test4 SETL {TRUE} ;將該變數賦值為真
LCLS Test6 ;定義一個局部的字元串變數,變數名為Test6
Test6 SETS 「Testing」 ;將該變數賦值為「Testing」
3、 SETA、SETL和SETS
語法格式:
變數名 SETA(SETL或SETS) 表達式
偽指令SETA、SETL、SETS用於給一個已經定義的全局變數或局部變數賦值。
SETA偽指令用於給一個數學變數賦值;
SETL偽指令用於給一個邏輯變數賦值;
SETS偽指令用於給一個字元串變數賦值;
其中,變數名為已經定義過的全局變數或局部變數,表達式為將要賦給變數的值。
使用示例:
LCLA Test3 ;聲明一個局部的數字變數,變數名為Test3
Test3 SETA 0xaa ;將該變數賦值為0xaa
LCLL Test4 ;聲明一個局部的邏輯變數,變數名為Test4
Test4 SETL {TRUE} ;將該變數賦值為真
4、 RLIST
語法格式:
名稱 RLIST {寄存器列表}
RLIST偽指令可用於對一個通用寄存器列表定義名稱,使用該偽指令定義的名稱可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器訪問次序為根據寄存器的編號由低到高,而與列表中的寄存器排列次序無關。
使用示例:
RegList R www.hbbz08.com LIST {R0-R5,R8,R10} ;將寄存器列表名稱定義為RegList,可在ARM指令LDM/STM中通過該名稱訪問寄存器列表。

4.1.2 數據定義(Data Definition)偽指令
數據定義偽指令一般用於為特定的數據分配存儲單元,同時可完成已分配存儲單元的初始化。常見的數據定義偽指令有如下幾種:
— DCB 用於分配一片連續的位元組存儲單元並用指定的數據初始化。
— DCW(DCWU) 用於分配一片連續的半字存儲單元並用指定的數據初始化。
— DCD(DCDU) 用於分配一片連續的字存儲單元並用指定的數據初始化。
— DCFD(DCFDU)用於為雙精度的浮點數分配一片連續的字存儲單元並用指定的數據初始化。
— DCFS(DCFSU) 用於為單精度的浮點數分配一片連續的字存儲單元並用指定的數據初始化。
— DCQ(DCQU) 用於分配一片以8位元組為單位的連續的存儲單元並用指定的數據初始化。
— SPACE 用於分配一片連續的存儲單元
— MAP 用於定義一個結構化的內存表首地址
— FIELD 用於定義一個結構化的內存表的數據域
1、 DCB
語法格式:
標號 DCB 表達式
DCB偽指令用於分配一片連續的位元組存儲單元並用偽指令中指定的表達式初始化。其中,表達式可以為0~255的數字或字元串。DCB也可用「=」代替。
使用示例:
Str DCB 「This is a test!」 ;分配一片連續的位元組存儲單元並初始化。
2、 DCW(或DCWU)
語法格式:
標號 DCW(或DCWU) 表達式
DCW(或DCWU)偽指令用於分配一片連續的半字存儲單元並用偽指令中指定的表達式初始化。其中,表達式可以為程序標號或數字表達式。。
用DCW分配的字存儲單元是半字對齊的,而用DCWU分配的字存儲單元並不嚴格半字對齊。
使用示例:
DataTest DCW 1,2,3 ;分配一片連續的半字存儲單元並初始化。
3、 DCD(或DCDU)
語法格式:
標號 DCD(或DCDU) 表達式
DCD(或DCDU)偽指令用於分配一片連續的字存儲單元並用偽指令中指定的表達式初始化。其中,表達式可以為程序標號或數字表達式。DCD也可用「&」代替。
用DCD分配的字存儲單元是字對齊的,而用DCDU分配的字存儲單元並不嚴格字對齊。
使用示例:
DataTest DCD 4,5,6 ;分配一片連續的字存儲單元並初始化。
4、 DCFD(或DCFDU)
語法格式:
標號 DCFD(或DCFDU) 表達式
DCFD(或DCFDU)偽指令用於為雙精度的浮點數分配一片連續的字存儲單元並用偽指令中指定的表達式初始化。每個雙精度的浮點數占據兩個字單元。
用DCFD分配的字存儲單元是字對齊的,而用DCFDU分配的字存儲單元並不嚴格字對齊。
使用示例:
FDataTest DCFD 2E115,-5E7 ;分配一片連續的字存儲單元並初始化為指定的雙精度數。
5、 DCFS(或DCFSU)
語法格式:
標號 DCFS(或DCFSU) 表達式
DCFS(或DCFSU)偽指令用於為單精度的浮點數分配一片連續的字存儲單元並用偽指令中指定的表達式初始化。每個單精度的浮點數占據一個字單元。
用DCFS分配的字存儲單元是字對齊的,而用DCFSU分配的字存儲單元並不嚴格字對齊。
使用示例:
FDataTest DCFS 2E5,-5E-7 ;分配一片連續的字存儲單元並初始化為指定的單精度數。
6、 DCQ(或DCQU)
語法格式:
標號 DCQ(或DCQU) 表達式
DCQ(或DCQU)偽指令用於分配一片以8個位元組為單位的連續存儲區域並用偽指令中指定的表達式初始化。
用DCQ分配的存儲單元是字對齊的,而用DCQU分配的存儲單元並不嚴格字對齊。
使用示例:
DataTest DCQ 100 ;分配一片連續的存儲單元並初始化為指定的值。
7、 SPACE
語法格式:
標號 SPACE 表達式

Ⅳ arm匯編程序

輸出一個函數 change , 作用是可以判斷R0寄器存是否為1,是1的話調用外部函數 routine1,否則調用外部函數 routine2 。

Ⅵ 什麼是ARM匯編

匯編語言是比較依賴硬體的體系結構的,因為ARM的體系結構,和8086體系結構(也就是《微機原理》主要講的)不同,所以指令集上是有一些不同的,但是其實思想還是一樣的。ARM匯編是對ARM處理器的控制。學習嵌入式的bootloader時,就會有很多行代碼的匯編程序(基於ARM體系結構的),但是說實話,主要你能看懂,知道是怎麼跳轉執行的,就可以了!bootloader都是大公司里很多牛逼人,花幾個月寫的硬體初始化代碼,你要是自己能寫出來,並且好使,那你就NB了,年薪30萬左右了,慢慢來吧!我也是才菜鳥,大家一起加油!

Ⅶ 在ARM匯編編程中如何指定某段程序的存儲地址

在要指定代碼的存儲空間不是一件特別簡單的事情,尤其是你想為某個或某幾個函數指定具體的地址。
1,編譯器只有在最終的Link階段才會為代碼和數據分配內存地址,因此指定代碼段的地址一般是通過寫一個link腳本來進行的。Link階段時,編譯器的Linker會讀取你寫的Link腳本,並且按照腳本的規定給代碼分配地址。
2,根據ARM開發工具的不同,link腳本的語法和形式也有所不同。ARM MDK,ARM ADS,Eclips+GCC,Linux GCC, ARM Realview等開發工具都支持Link腳本。
如果你英文還可以,建議你直接找到開發工具的Help手冊去研究。如果你英語實在不行,也可以把開發工具名稱和你代碼的具體情況告訴我,我幫你看看。

Ⅷ ARM匯編程序

arm一般主要程序都是用c寫的。

用匯編。。一般來說只是用來寫些bootloader
或者運算速度非常有要求的地方。。
很少用。。。

你上面的代碼。。
如果你要匯編其實也很容易。。

反正你c都會寫了。

直接吧這個c代碼 編譯一下。。

然後查看他的匯編源碼就可以了。
如果匯編源碼的效率不夠高。。你可以自己優化一下。
何樂而不為呢。

所以以後不管想要什麼要的 匯編源碼都可以搞到。
也不用每次都來網路 問一下。不是。。

Ⅸ 在ARM匯編程序如何實現子程序的返回

把對應的R14寄存器中的值 賦值給PC寄存器
在進入子程序的時候 保存一下當前的 預取指令的下一條指令的地址到LR(R14)寄存器,在子程序返回的時候把LR的值賦值給PC寄存器 就OK 了

Ⅹ ARM匯編語言由哪些指令組成它們之間的區別是什麼

機器指令能被處理器直接執行,而匯編指令、偽指令和宏指令不能。機器指令包括ARM指令集和Thumb指令集 。

偽指令是在源程序匯編期間,由匯編編譯器處理。其作用是為匯編程序完成准備工作。

宏指令在程序中用於調用宏,宏是一段獨立的程序代碼;在程序匯編時,對宏調用進行展開,用宏體代替宏指令。

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:594
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:889
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:583
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:766
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:685
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1014
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:257
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:115
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:807
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:714