1. ARM的匯編語言
ARM 當然有自己的指令集,與 x86 相比,由於 ARM 是 RISC 模式的,指令數量要比 x86 少很多,但 ARM 隨著版本的進步,也在指令集中增加了比較多的復雜指令,比如類似 DSP 的,還有 SIMD 的等等,要說比 x86 簡單,那是肯定的,但比起大多數 8 位處理器那是復雜了不是一星半點啊。
一般來說,學一種 CPU 就要包括其匯編語言,就 ARM 來說,有幾個架構版本確實不能純粹使用 C 語言完成所有工作,必須使用匯編作為輔助,但好在這些必須使用匯編的部分,邏輯基本固定了,如果不是有特殊應用,可以不用研究它,直接拿現成的代碼來用就行了。
最新的 ARM Cortex 系列處理器,除了編寫一些特殊的程序,如 RTOS 等等之外,已經完全可以不用匯編語言了,現在很多人在寫 ARM Cortex 程序,其實大部分都不懂 ARM 匯編的。
2. arm匯編跟匯編、C語言的區別
不一樣,匯編主要是要了解CPU指令及用法。
我們常說的是PC機的x86匯編,指令是x86的復雜指令集。
arm匯編是arm的精簡指令集,比x86容易學,程序格式倒是和x86匯編差不多。你下載一份arm的手冊就可以了解了。
C語言ARM的和x86的差不多,除了對硬體寄存器操作不同,其它語法和流程都一樣。
回答補充:
arm匯編程序每一行是指定arm
core執行一條指令,每條指令都是硬體相關。
如
LDR
R3,
#1
;用LDR指令將數值1放入R3寄存器准備參與運算
C語言與arm指令無關,只與邏輯運算有關,指定硬體地址的操作才與硬體相關;如果用arm編譯器來編譯,每行可能編譯出1到多條arm指令。
如
i++;
//變數
i
遞增1
等效於
LDR
R3,#1
;用LDR指令將數值1放入R3寄存器准備參與運算
ADD
R2,
R2,
R3
;用ADD指令將R2、R3寄存器里的數值相加後放回R2寄存器
以上等效匯編的R2、R3寄存器只是為了舉例,C語言不像匯編,不需要由程序員指定用哪個寄存器參與運算,編譯器編譯時會根據程序結構自動判斷選擇。
強調mcuos有錯,「c語言被編譯器編譯的時候會最終解釋為匯編語言的」,無論是c語言還是匯編語言,編譯器編譯後的結果是機器執行碼,很多人因為匯編語言比較難懂及指令相關,所以以為它就是機器語言,其實它仍是人類設計的編寫程序的語言,仍需要編譯器編譯成機器碼才能執行,它只是比C語言更接近硬體而已。
3. ARM匯編編程(重金懸賞)
C語言中調用ARM匯編——數組排序演算法
#include<stdio.h>
extern void select(int *src,int number);
int main(void) {
int i=0;
int num=0;
int *array=NULL;
int *array2[1];
while(num <= 0) {
printf("please enter the number of elements:\n");
scanf("%d",&num);
if(num > 0) {
break;
}
}
if(NULL == (array = (int *)malloc(num*sizeof(int)))) {
printf("malloc failed!\n");
exit(-1);
}
array2[0]=array;
printf("please enter the elements:\n");
for(i = 0; iprintf("\n%d:\t", i);
scanf("%d", array+i);
}
select(array,num);
printf("the result is:\n");
for(i = 0; i{
printf("%d:\t%d\n", i, *(array2[0]+i));
}
return 0;
}
-------------------------------------------sortasm.s文件
.section .text
.globl select
select:
SUBS R1,R1,#1
loop: MOV R7,R1
MOV R4,R0
loop2: LDR R5,[R4]
LDR R6,[R4,#4]!
CMP R5,R6
BLS skip
STR R5,[R4]
STR R6,[R4,#-4]
skip: SUBS R1,R1,#1
BNE loop2
MOV R1,R7
SUBS R1,R1,#1
BNE loop
4. 《ARM體系結構與編程第二版》pdf下載在線閱讀全文,求百度網盤雲資源
《ARM體系結構與編程第二版》網路網盤pdf最新全集下載:
鏈接:https://pan..com/s/1yYDq8g7FV6eBT-m-8-tRGg
5. 請問基於ARM匯編語言與基於X86匯編語言的區別差距有多大謝謝
架構完全不一樣
ARM是精簡指令集
x86是復雜指令集
兩者匯編語言是不同的
但如果你懂x86匯編,那麼學起來ARM匯編會容易很多,畢竟在硬體原理方面兩者有相通之處,ARM架構其實是x86架構的優化精簡且增加了自己的特色.
6. ARM 匯編語言指令
ARM處理器有9種定址方式:
1、寄存器定址,2、立即定址,3、寄存器器移位定址,4、寄存器間接定址,5、基址定址,6、多寄存器定址,7、堆棧定址,8、塊拷貝定址,9、相對定址。
ARM指令集:ARM指令基本格式如下:
<OPCODE>{<COND>}{S} <Rd> ,<Rn>{,<OPERAND2>}
其中<>的內容是必須的,{}的內容是可選的。OPCODE指令助記符。
7. ARM匯編語言由哪些指令組成它們之間的區別是什麼
機器指令能被處理器直接執行,而匯編指令、偽指令和宏指令不能。機器指令包括ARM指令集和Thumb指令集 。
偽指令是在源程序匯編期間,由匯編編譯器處理。其作用是為匯編程序完成准備工作。
宏指令在程序中用於調用宏,宏是一段獨立的程序代碼;在程序匯編時,對宏調用進行展開,用宏體代替宏指令。
8. 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
9. 什麼是ARM匯編
匯編語言是比較依賴硬體的體系結構的,因為ARM的體系結構,和8086體系結構(也就是《微機原理》主要講的)不同,所以指令集上是有一些不同的,但是其實思想還是一樣的。ARM匯編是對ARM處理器的控制。學習嵌入式的bootloader時,就會有很多行代碼的匯編程序(基於ARM體系結構的),但是說實話,主要你能看懂,知道是怎麼跳轉執行的,就可以了!bootloader都是大公司里很多牛逼人,花幾個月寫的硬體初始化代碼,你要是自己能寫出來,並且好使,那你就NB了,年薪30萬左右了,慢慢來吧!我也是才菜鳥,大家一起加油!
10. ARM匯編程序
arm一般主要程序都是用c寫的。
用匯編。。一般來說只是用來寫些bootloader
或者運算速度非常有要求的地方。。
很少用。。。
你上面的代碼。。
如果你要匯編其實也很容易。。
反正你c都會寫了。
直接吧這個c代碼 編譯一下。。
然後查看他的匯編源碼就可以了。
如果匯編源碼的效率不夠高。。你可以自己優化一下。
何樂而不為呢。
所以以後不管想要什麼要的 匯編源碼都可以搞到。
也不用每次都來網路 問一下。不是。。