❶ 80C51指令系統中Rn與Ri有什麼區別
arm匯編 和 arm C 混合編程 只支持一種 滿遞減堆棧 ,所以都是一樣的
❷ 為什麼要C和匯編混合編程
依我的看法,上面兩位說的都不對:
一樓:匯編語言是低級語言直接往硬體的寄存器里寫入東西:
其實C語言和匯編語言都一樣,都會編譯成二進制文件機器語言燒錄到單片機中,所以沒有一樓所說的區別
二樓:在C中也不會有數據損失的,如果你定義好數據類型的話。
單片機中是將C編譯成匯編,然後根據匯編編譯成機器語言---可執行文件;
其實單片機中經常在C中嵌入匯編,主要是因為時間的關系,因為一條匯編語言執行的時間都是可以知道的,而C指令執行的時間是不可知的,因為C編譯器不一樣,編譯後的匯編也是不一樣的,如果用匯編就不會有這種情況。所以在一些精確延時的場合,要嵌入匯編
另外,C的可移植性較強,不同的單片機里,功能要求相同的可以直接拿去用
總之,匯編是程序員可以自己翻譯成機器語言的,所以單片機的運行是可以完全掌握的
❸ ARM單片機可以用匯編語言編程嗎
ARM單片機程序可以用匯編語言進行編寫。除去協處理器(高級的arm單片機才具有)的指令,常用的指令大致為MSR、MRS、LDR、STR、LDM、STM,ORR、BIC,TEST, ADD, SUB,MUL等指令。如果說想寫一寫匯編代碼玩一下的話還行。原則上能用C語言則一定不會使用匯編。例如UBOOT的引導代碼,linux內核的啟動代碼都是用匯編寫的,本質是快速初始化以滿足C程序的運行條件。除了特殊的寄存器(如CPSR)要用專用的匯編指令(MSR、MRS)外,對於讀寫寄存器操作一般使用LDR、STR指令,也就對應於C語言的通過指針訪問內存。
在實際開發中,經常要讀寫寄存器。所以經常會使用到訪存指令(ldr、str),以及各種邏輯操作(add、sub、bic、orr、and)。如果設置到使用棧暫存數據還需要ldm和stm指令。其實常用的也就這幾個。因此,可以用匯編寫單片機程序,但還是那句話,能用C語言則不要使用匯編。因為把C程序轉化為匯編代碼那是編譯器做的事情。。。
❹ 嵌入式ARM 混合編程,匯編調用C語言,在線等
段定義前加 PRESERVE8 偽指令試一下。
前兩天剛好看到 ARM UCOS 匯編代碼中用到PRESERVE8這個關鍵字(加在段定義之前),以前沒見過的,於是網路。
1.匯編代碼沒有保持8位元組棧對齊而調用C或C++代碼。
2.ADS下的代碼用RVDS2.2編譯時,即使已經8位元組棧對齊,連接器也將之當作非8位元組棧對齊。
所以要用偽指令指明一下。
E文不好,故而附原文以供參詳:
where assembler code (that does not preserve 8-byte stack alignment) calls compiled C/C++ code (that requires 8-byte stack alignment), and
when attempting to link legacy SDT/ADS objects with RVCT 2.x objects. Legacy SDT/ADS objects that do not have these attributes are treated as '~PRES8', even if they do actually happen to preserve 8-byte alignment.
❺ 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語言更接近硬體而已。
❻ C/C++與匯編混合編程有什麼好處
當需要C/C++與匯編混合編程時,可以有以下兩種處理策略:
若匯編代碼較短,則可在C/C++源文件中直接內嵌匯編語言實現混合編程。
若匯編代碼較長,可以單獨寫成匯編文件,最後以匯編文件的形式加入項目中,通過ATPCS規定與C程序相互調用及訪問。
後綴.S文件中的匯編指令是用armasm匯編器進行匯編的,而C語言程序中的內嵌匯編指令則是用內嵌匯編器進行匯編的。這兩種匯編器存在一定的差異,所以在內嵌匯編時要注意以下幾點。
2.3.1 小心使用物理寄存器
必須小心使用物理寄存器,如R0~R3、IP(R12)、LR(R14)和CPSR中的N、Z、C、V標志位。因為計算匯編代碼中的C表達式時,可能使用這些物理寄存器,並會修改N、Z、C、V標志位。
如計算:
y=x+x/y;
[cpp] view plain
1. __asm
2. {
3. MOV R0, x //把x的值給R0
4. ADD y, R0, x/y //計算x/y時R0的值會被修改
5. }
2.3.2 內嵌匯編程序中允許使用C變數
在計算x/y時R0會被修改,從而影響R0+x/y的結果。內嵌匯編程序中允許使用C變數,用C變數來代替寄存器R0可以解決上述問題。這時內嵌匯編器將會為變數var分配合適的存儲單元,從而避免沖突的發生。如果內嵌匯編器不能分配合適的存儲單元,它將會報告錯誤。
[cpp] view plain
1. int var;
2. __asm
3. {
4. MOV var, x //把x的值給R0
5. ADD y, var, x/y //計算x/y時R0的值會被修改
6. }
2.3.3 不需要保存和恢復用到的寄存器
對於在內嵌匯編語言程序中用到的寄存器,編譯器在編譯時會自動保存和恢復這些寄存器,用戶不用保存和恢復這些寄存器。除了CPSR和SPSR寄存器外,其他物理寄存器在讀之前必須先賦值,否則編譯器會報錯。
[cpp] view plain
1. int fun (int x)
2. {
3. __asm
4. {
5. STMFD SP!, {R0} //保存R0,先讀後寫,匯編出錯
6. ADD R0, x, #1
7. EOR x, R0, x
8. LDMFD SP!, {R0} //多餘的
9. }
10. return x;
11. }