arm匯編c語言
『壹』 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語言更接近硬體而已。
『貳』 用ARM匯編語言實現C語言中的memcmp函數的功能
頭文件:#include <string.h>
定義函數:int memcmp (const void *s1, const void *s2, size_t n);
函數說明:memcmp()用來比較s1 和s2 所指的內存區間前n 個字元。
字元串大小的比較是以ASCII 碼表上的順序來決定,次順序亦為字元的值。memcmp()首先將s1 第一個字元值減去s2 第一個字元的值,若差為0 則再繼續比較下個字元,若差值不為0 則將差值返回。例如,字元串"Ac"和"ba"比較則會返回字元'A'(65)和'b'(98)的差值(-33)。
返回值:若參數s1 和s2 所指的內存內容都完全相同則返回0 值。s1 若大於s2 則返回大於0 的值。s1 若小於s2 則返回小於0 的值。
範例#include <string.h>main(){ char *a = "aBcDeF"; char *b = "AbCdEf"; char *c = "aacdef"; char *d = "aBcDeF"; printf("memcmp(a, b):%d\n", memcmp((void*)a, (void*)b, 6)); printf("memcmp(a, c):%d\n", memcmp((void*)a, (void*)c, 6)); printf("memcmp(a, d):%d\n", memcmp((void*)a, (void*)d, 6));}
執行結果:
memcmp(a, b):1 //字元串a>字元串b, 返回1
memcmp(a, c):-1 // 字元串a<字元串c, 返回-1
memcmp(a, d):0 //字元串a=字元串d, 返回0
『叄』 ARM匯編語言與C語言調用的一段代碼問題
STR storage register 就是存儲寄存器的意思,是將寄存器中的值存進內存中。LDR則是將內存單元中的值存入寄存器中。
STR lr, [sp, #-4]! 是將lr寄存器也稱鏈接寄存器r14(用於保存子程序的返回地址)的值(32位)存入sp指向堆棧的地址,從sp到sp-3地址單元。感嘆號是表示保存後sp的值跟著改變,及sp=sp-3,沒有感嘆號sp在使用結束後值不變。LDR那部分就不用解釋了吧,應該很詳細了。
『肆』 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語言更接近硬體而已。
『伍』 arm匯編語言實現c語言程序
不懂C語言但稍微懂一點ARM Cortex-M3 匯編
很久沒寫匯編了,下邊這個沒調試直接編的不是範例,所以肯定寫錯了
編譯器GCC-ARM-NONE-EABI
應該有範例,你還是找範例吧
i: .int 20 @ int i=20
a: .int 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 @ 定義A數組
b: .int 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 @ 定義B數組
ldr r0, = i @ 把20存到R0
xunhuan1: @ if 裡面
ldr r1, = a @ 把A數組的首地址存到R1
ldr r2, [r1, r0] @ 取出首地址加20處的數據存到R2
ldr r3, = b @ 把B數組的首地址存到R3
ldr r4, [r3, r0] @取出首地址加20處的數據存到R4
mov r5, # 4 @ 把被乘數存到R5
mul r4, r4, r5 @ R4乘以4 b[i]*4
add r6, r2, r4 @ R2加上R4存到R6 a[i]+b[i]*4
str r6, [r1, r0] @ R6的數據存到A首地址加20的地方
lsrs r0, # 1 @ R0邏輯右移
bne xunhuan @ 判斷R0是不是等於0不等於跳到xunhuan
xunhuan: @ while 循環
sub r0, # 1 @ i減1
cmp r0, # 0 @比較R0和0
bge xunhuan1 @大於等於跳轉xunhuan1
『陸』 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語言更接近硬體而已。
『柒』 ARM匯編調用c語言的問題
強烈建議初學者使用Keil工具。
1,無論是Keil工具還是ADS工具,都有一段入口匯編代碼,一般叫start.s。這取決於你這個程序的Project設置,自己去找找。
2,你一定要找到這個入口匯編代碼的文件,然後把你的匯編函數添加到末尾。
3,入口匯編代碼中要找到跳轉到C程序入口的那條跳轉語句。C程序的入口調用一般在ADS里是: B __main 這樣的一句匯編。把這句改成B callsum5。
『捌』 arm中如何實現C語言與匯編語言的混合編程
如果你是想在一個文件里混寫c語言和arm匯編,這個跟編譯器有關系,如果你用gcc,可以用__asm__語法,請自行搜索__asm__相關資料
另一種方法,就是arm匯編文件和c語言文件分開來寫,在c語言中聲明函數符號即可。然後分別編譯後再用鏈接器鏈到一起
『玖』 arm匯編裡面怎麼調用C語言函數
首先你得搞清楚s32 function(u32 VirtualAddr)編譯後叫什麼。一般來說可能會叫_function。
傳遞參數很簡單,如果ax里放的就是參數,那麼push ax,然後再調用就可以。
返回值如果我沒有記錯的話應該在AX里。如果返回值太長,就會放到堆棧里。
你想搞清楚如果跨語言編程,最好徹底明白C語言的機制。也就是寫一段函數調用程序比如下面的
main()
{ int i;}
fu(int i)
{in j}
然後編譯成匯編語言,好好研究一下。或者再復雜一點。請參考http://..com/question/348586073.html。
有什麼問題再向我提問
『拾』 arm編程與C語言的編程區別和方法
ARM公司賣的arm
cpu內核給許多公司,那些公司生產出眾多的ARM處理器。ARM編程實際上指的是應用ARM公司自己出產的IDE(集成開發環境)所開發進行的編程,比如現在業界常用的ADS1.2,MDK3.5等等IDE。主要進行ARM匯編和與c混合編程。
ARM公司自己規定了一套ARM指令集,也規定了一套匯編指令集。當然,我們覺得匯編編程生產效率低下,不易編寫大規模程序,那麼我們就可以用高級語言,比如c語言,面向對象的語言在操作系統上運行。