當前位置:首頁 » 編程語言 » arm匯編c語言

arm匯編c語言

發布時間: 2022-11-12 09:08:23

『壹』 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語言,面向對象的語言在操作系統上運行。

熱點內容
怎麼把伺服器的ip固定了 發布:2025-01-12 03:55:42 瀏覽:578
php伺服器開發 發布:2025-01-12 03:55:35 瀏覽:672
軟體自製編程 發布:2025-01-12 03:54:00 瀏覽:534
j2ee和java的區別 發布:2025-01-12 03:42:44 瀏覽:581
android6小米 發布:2025-01-12 03:38:35 瀏覽:85
redis與資料庫 發布:2025-01-12 03:20:21 瀏覽:211
怎麼升級安卓100 發布:2025-01-12 03:19:37 瀏覽:516
c語言倒數 發布:2025-01-12 03:14:37 瀏覽:929
如何免費激活行動電話卡安卓 發布:2025-01-12 03:10:27 瀏覽:89
2020凱越精英配置什麼樣 發布:2025-01-12 03:08:02 瀏覽:685