❶ ARM匯編語言由哪些指令組成它們之間的區別是什麼
機器指令能被處理器直接執行,而匯編指令、偽指令和宏指令不能。機器指令包括ARM指令集和Thumb指令集 。
偽指令是在源程序匯編期間,由匯編編譯器處理。其作用是為匯編程序完成准備工作。
宏指令在程序中用於調用宏,宏是一段獨立的程序代碼;在程序匯編時,對宏調用進行展開,用宏體代替宏指令。
❷ arm編程與C語言的編程區別和方法
匯編主要是要了解CPU指令及用法,常說的是PC機的x86匯編,指令是x86的復雜指令集。
arm匯編是arm的精簡指令集,比x86容易學,程序格式倒是和x86匯編差不多。
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語言不像匯編,不需要由程序員指定用哪個寄存器參與運算,編譯器編譯時會根據程序結構自動判斷選擇。
無論是c語言還是匯編語言,編譯器編譯後的結果是機器執行碼,很多人因為匯編語言比較難懂及指令相關,所以以為它就是機器語言,其實它仍是人類設計的編寫程序的語言,仍需要編譯器編譯成機器碼才能執行,它只是比C語言更接近硬體而已。
❸ 使用宏寫一個可以根據具體調用實現1到100求奇數或偶數和的ARM程序!
public class Test{
public static void main(String [] args){
for(int i=0;i<100;i++){
if(i%2==0){
System.out.println("偶數:"+i);
}else{
System.out.println("奇數:"+i);
}
}
}
}
❹ 什麼是ARM編程
ARM編程就是針對ARM處理器指令的編程,
也就是嵌入式開發,現在ARM支持匯編、c、
c++等語言。
❺ 初學arm,編程時很多寄存器前加r是什麼意思
你學的是三星的arm?寄存器前加r是別人的頭文件自定義的宏,你去頭文件里查看宏可以發現#define rGPACON (*(volatile unsigned *)0x56000000),事實上,他也可以定義為#define GPACON (*(volatile unsigned *)0x56000000),定義什麼樣的宏只是別人的編程習慣。
❻ 什麼是ARM編程
如果說,「嵌入式」是2001年電子工程師談論得最多的詞之一,2002年談論得最多的一個詞就是「ARM」。究竟什麼是ARM呢,他是英國一家電子公司的名字,全名的意思是Advanced RISC Machine。該公司成立於1990年11月,是蘋果電腦,Acorn電腦集團和VLSI Technology的合資企業。Acorn曾推出世界上首個商用單晶元RISC處理器,而蘋果電腦當時希望將RISC技術應用於自身系統,ARM微處理器新標准因此應運而生。
80年代末90年代初半導體行業產業鏈剛剛出現分工,台積電,聯電等半導體代工廠正悄悄崛起,美國矽谷中的一些fabless公司也如雨後春筍一樣涌現出來,所謂的fabless公司自己設計晶元,但是生產過程則包給台積電等代工廠生產。而ARM更是為天下先,12年前首創了chipless的生產模式,即該公司既不生產晶元,也不設計晶元,而是設計出高效的IP內核,授權給半導體公司使用,半導體公司在ARM技術的基礎上添加自己的設計並推出晶元產品,最後由OEM客戶採用這些晶元來構建基於ARM技術的系統產品。這種方式有點象通信行業的高通和半導體行業的RAMBUS,他們站在了半導體產業鏈上游的上游。12年前成立的ARM可能面臨著很大風險,因為沒有人知道這條路能不能行得通,但是現在的事實已經證明,ARM走了一條沒人走過,卻是正確的道路。,作為附加產品,他還讓中國的行業人士從這個窗口認識到了英國的電子公司,ARM的成功帶動了英國的chipless公司的發展。
因為ARM的產品是IP Core,沒有任何物理意義上的硬體或者軟體實體,所以只能在中國注冊成為「咨詢」公司,盡管咨詢只是其業務中很小的一塊。ARM的核心業務是銷售晶元核心技術IP,目前全球有103家巨型IT公司在採用ARM技術,20家最大的半導體廠商中有19家是ARM的用戶,包括德州儀器,意法半導體,Philips, Intel等。20大巨頭中唯一沒有購買ARM授權的是Intel的老對頭AMD,因為Intel攜帶型處理器採用的是StrongARM,而AMD則收購了Alchemy公司與之抗衡,採用的是MIPS結構。
微處理器核是ARM技術的重中之中,目前面向市場的有ARM7, ARM9, ARM9E-S,StrongARM和ARM10系列。ARM專利技術收入主要來自兩個方面,一個是專利授權費用,客戶如果採用ARM專利時一次性付給ARM的費用; 另一部分是按照一定比例收取客戶產品的專利使用費,即客戶每賣出一片晶元,就收取同等比例的費用。這兩項收入占公司總收入的70%。目前在中國已經有中興通訊,中芯國際和上海華虹購買了ARM的內核授權,生產自己的晶元。ARM中國方面的業務的其它重點還在於對晶元設計公司(fables)的支持,開展大學計劃等。另外ARM還授權科匯宏盛(Impact)和北京旋極為開發工具的授權分銷商2002年的銷售額增長在三位數(100%)以上。
一般來說,ARM的合作夥伴分為三種:
1. EDA夥伴計劃,融合了ARM在線系統設計、可重復使用IP生成和IP模型等方面的專長與領先EDA工具廠商的專業特長,開發SoC產品。
2. ARM技術共享計劃,為ARM與外部設計服務公司合作關系的擴展和規范化結果,現在已經有2900多工程師成員。
3. 製造商計劃,使新興市場的OEM能分享ARM處理器技術,用於設計和製造先進的SoC解決方案。
北航出版社和清華出版蛇出版了幾本關於ARM技術方面的書籍,並且還會陸續出版更多,質量更高的書。同時ARM中國還計劃授權各合作夥伴,開辦ARM技術培訓班,並為合作夥伴的老師提供培訓,另一方面,也將和國內大學開展大學合作計劃,加大ARM技術推廣和普及的力度,幫助中國的電子工程師迅速和國際接軌,並掌握最新的電子設計技術。
總之,ARM是英國全球著名的32位嵌入式RISC晶元內核的設計公司,也是ARM的產品商標,其產品ARM嵌入式內核已被全球各大晶元廠商採用,基於ARM的開發技術席捲了全球嵌入式市場,已成為嵌入式系統主流技術之一。旋極公司作為嵌入式業內的皎皎者,銳意創新,致力於ARM技術的、開發應用和推廣,再一次走在了同行的前列,率先成立了ARM的研發中心,並在全國開辦了基於ARM的嵌入式系統開發應用培訓。2001年12月,旋極正式成為ARM授權中國唯一指定培訓中心(ATC)和其系列產品代理商。
ARM開發的32位CPU核,全球廠商都可以獲得授權生產ARM晶元。而且價格出乎意料得便宜,比如做網路應用的4510隻需45元人民幣,這樣低端產品可以採用8051等8位單片機,而中高端產品採用ARM是非常明智的選擇。現在很多人開始學習ARM,開始都是買ARM實驗板和JTAG模擬器。
❼ 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寄存器在C語言中宏定義的問題
PORTA應該要定義的吧,可能以前你只看c文件,頭文件沒注意吧。嵌入式系統編程,要求程序員能夠利用C語言訪問固定的內存地址。不進行宏定義的話就得每次用的時候用地址了,那多麻煩。關於這個定義,可以看下面講解。。
既然是個地址,那麼按照C語言的語法規則,這個表示地址的量應該是指針類型。所以,知道要訪問的內存地址後,比如0x5F,
第一步是要把它強制轉換為指針類型
(unsigned char *)0x5F,AVR的SREG是八位寄存器,所以0x5F強制轉換為指向
unsigned char類型。
volatile(可變的)這個關鍵字說明這變數可能會被意想不到地改變,這樣編譯器就不會去假設這個變數的值了。這種「意想不到地改變」,不是由程序去改變,而是由硬體去改變——意想不到。
第二步,對指針變數解引用,就能操作指針所指向的地址的內容了
*(volatile unsigned char *)0x5F
第三步,小心地把#define宏中的參數用括弧括起來,這是一個很好的習慣,所以#define SREG (*(volatile unsigned char *)0x5F)
類似的,如果使用一個32位處理器,要對一個32位的內存地址進行訪問,可以這樣定義#define RAM_ADDR (*(volatile unsigned long *)0x0000555F)
然後就可以用C語言對這個內存地址進行讀寫操作了
讀:tmp = RAM_ADDR;
寫:RAM_ADDR = 0x55;
#define U0RBR (*((volatile unsigned char *) 0xE000C000))
這個在單片機里很常見,
((volatile unsigned char *) 0xE000C000) 是將0xE000C000強制轉換為
保存可能隨時更新(volatile的作用)無符號字元型數據的地址
前面又加了*,是表示指向這個地址裡面的值,這與其他普通定義的指針一樣了,如char x,y,*p;p=&x;*p=y;y=*p
就如同一個變數一樣,既可以從這里讀出值,也可以給被賦值,這里需要注意的是,這個地址值里的東西是不是既可以讀又可以寫,這個在datasheet應該有定義,或者看程序中都拿他干什麼。
#define U0RBR (*((volatile unsigned char *) 0xE000C000)) 這個是宏定義,即UORBR替換(*((volatile unsigned char *) 0xE000C000)),宏定義是為了程序書寫方便,因為在程序中可能有好多地方要使用(*((volatile unsigned char *) 0xE000C000)),在用時,總要寫這么多東西麻煩。
❾ 什麼是ARM編程
ARM是種cpu的構架。這種晶元一般用於嵌入式設備的。手機上用得很多。我們pc是x86的。
arm編程就是編寫使用arm晶元設備能夠運行的程序。
❿ 關於ARM在中斷中的一個語句或者宏定義的意義
這個程序的意思是 先查看定時器1是否有中斷請求,如果有請求就打開定時器1的中斷。
分析如下:
INTPND是中斷掛起寄存器,它的每一位都對應著一個中斷,如果某一位寫1,就表示這個中斷提出請求,0表示無情求。由於不知道你這個是arm7還是arm9,分別說一下吧,arm7中定時器1在INTPND寄存器中對應的位置是第12位,所以BIT_TIMER1的值是(1<<12),即第12位為1,剩下的為0.在arm9中BIT_TIMER1的值是(1<<11),即第11位為1,剩下的為0.
if(rINTPND&BIT_TIMER1)的意思就是查看定時器1是否發出請求。如果有請求,就將SRCPND的對應的位置置1.
rINTMSK&=~(BIT_TIMER1);
INTMSK是中斷屏蔽寄存器,也是每一位都對應一個中斷,如果某一位是1,表示屏蔽這個中斷,如果是0表示允許中斷,也就是你說的開中斷。所以這句代碼就是將定時器1對應的位置0.開這一位的中斷。有什麼地方不明白繼續叫我~~~呵呵