1. 程式人生 > >系統學習ARM之五 --C語言和彙編混合編寫

系統學習ARM之五 --C語言和彙編混合編寫

一、GNU彙編書寫格式

  • 程式碼行中的註釋符號: ‘@’ 整行註釋符號: ‘#’ 語句分離符號: ‘;’ 直接運算元字首: ‘#’ 或 ‘$’
  • 全域性標號:標號只能由a~z,A~Z,0~9,“.”,_等(由點、字母、數字、下劃線等組成,除區域性標號外,不能以數字開頭)字元組成,標號的後面加“:”。
             段內標號的地址值在彙編時確定;              段外標號的地址值在連線時確定
  • 區域性標號:區域性標號 主要在區域性範圍內使用而且區域性標號可以重複出現。它由兩部組成開頭是一個0-99直接的數字區域性標號 後面加“:”???
         F:指示編譯器只向前搜尋,程式碼行數增加的方向
/ 程式碼的下一句          B:指示編譯器只向後搜尋,程式碼行數減小的方向              注意區域性標號的跳轉,就近原則 例子:        1:a     2:b     1:c     b 1b    跳轉到 c 所處的位置 ==================================================================

二、混合程式設計和內聯彙編

【1】1.c 和2.c 編譯成一個elf檔案

     gcc  -c 1.c -o 1.o        gcc  -c 2.c -o 2.o      ld  -Ttext 40008000 1.o 2.o -o  a.elf

【2】1.s 和2.c 編譯成一個elf檔案

     gcc  -c 1.s -o 1.o        gcc  -c 2.c -o 2.o      ld  -Ttext 40008000 1.o 2.o -o  a.elf

【3】c語言中調用匯編中的函式

            在彙編中.global/.globl  (在定義的檔案中)             在 c 中extern                 (在呼叫的檔案中)   ================內聯彙編============

【4】內聯彙編:在c語言程式碼中嵌入彙編指令

    (1)Gcc 通過關鍵字“asm”來宣告內聯彙編     (2)格式: asm或__asm__開頭,小括號+分號,括號內容寫彙編指令。             指令+
\n\t用雙引號引上        asm(code : output operand list : input operand list : clobber list);     (3)例一:無引數,無返回值           asm          (             //彙編指令             "mrs r0,cpsr     \n\t"             "bic r0,r0,#0x80 \n\t"             "msr cpsr,r0     \n\t"          );     (4)         例二:有引數 1,有返回值          讓內聯彙編做加法運算,求a+b,結果存在c中              int a =100;              int b =200;              int c =0;              asm              (                  "add%0,%1,%2\n\t"                  : "=r"(c)              //輸出列表 %0 --c                  : "r"(a),"r"(b)        //輸入列表 %1 --a  %2--b                  : "memory"             //通知列表              );          例三:有引數 2 ,有返回值          讓內聯彙編做加法運算,求a+b,結果存在c中,把a-b的存在d中              int a=100;              int b=200;              int c=0;              int d=0;      asm volatile     (         "add  %[op1],%[op2],%[op3]\n\t"     :[op1]"=r”(sum) :[op2]"r"(a),[op3]”r”(b)         :"memory"         " sub%[op4],%[op2],%[op3]\n\t " :[%op4]"=r"(d)         :         :"memory"     );

【5】 gcc的程式碼優化級別,在 makefile 檔案中的編譯命令

        4級  O0 -- O3  數字越大,優化程度越高。O3最大優化

【6】volatile作用

        volatile修飾的變數,編譯器再進行優化,每次都真正訪問記憶體地址空間。  

三、ATPCS規則:(ARM、thumber程式呼叫規範)

(1)使用r0-r3,依次接受引數

     void func(a,b,c,d,e)       a -- r0       b -- r1       c -- r2       d -- r3       e -- 棧

(2)使用r0 接收返回值

     int func1(int m, int n)      m  -- r0      n  -- r1      返回值給 r0

(3)區域性變數,儲存到r4--r11,當局部變數多餘8個,用棧

(4)r12 -- ip(儲存sp)

     r13 -- sp      r14 -- lr      r15 -- pc

相關推薦

系統學習ARM --C語言彙編混合編寫

一、GNU彙編書寫格式: 程式碼行中的註釋符號: ‘@’ 整行註釋符號: ‘#’ 語句分離符號: ‘;’ 直接運算元字首: ‘#’ 或 ‘$’全域性標號:標號只能由a~z,A~Z,0~9,“.”,_等(由點、字母、數字、下劃線等組成,除區域性標號外,不能以數字開頭)字

系統學習redis——redis數據類型list類型及操作

hello 保留 個數 描述 查詢 元素 例如 ltr 插入 list數據類型介紹 list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的所有值等等,操作中key可以理解為鏈表的名字。redis的list類型其實就是一個每個子元素都是string類型的雙向鏈表。

學習ios路:C語言】② 二維.三維陣列.字串陣列的應用

二.三維陣列 例如: int a[2][4][3] = {0}; 表⽰示整型的三維陣列,2層4⾏3列。元素個數為2*4*3 = 24個.例:隨機產生一個三維陣列,求三維陣列的和. <span style="font-size:14px;">for (int

一段C語言彙編的對應分析,揭示函式呼叫的本質

一段C語言和彙編的對應分析,揭示函式呼叫的本質 2018年09月30日 13:32:19 sdulibh 閱讀數:17 本文作者周平,原創作品轉載請註明出處 首先對會涉及到的一些CPU暫存器和彙編的基礎知識羅列一下:   16位、32位、64

學習日記享元模式Effective C++

實例 存儲 通過 由於 類型 ati 擦除 -s 當前 享元模式(Flyweight):運用共享技術有效地支持大量細粒度的對象。 (1),享元模式能夠避免大量很相似的開銷。在程序設計中,有時須要生成大量細粒度的類實例來表示數據。假設能發現這些實例除了幾個參數外基本上都是

sqlite學習筆記7:C語言中使用sqlite打開數據庫

實例 clas details code 返回 pri san filename stdlib.h 數據庫的基本內容前面都已經說得差點兒相同了。接下看看如何在C語言中使用sqlite。 一 接口 sqlite3_open(const char *filename, s

sqlite學習筆記11:C語言中使用sqlite刪除記錄

false done mta ase rom real not null -a ubun 最後一節,這裏記錄下怎樣刪除數據。 前面全部的代碼都繼承在這裏了,在Ubuntu14.04和Mac10.9上親測通過。 #include <stdio.h> #in

sqlite學習筆記9:C語言中使用sqlite插入數據

name article void num mes cut cpp content int 前面創建了一張表,如今給他插入一些數據。插入數據跟創建表差點兒相同,不過SQL語言不一樣而已,完整代碼例如以下: #include <stdio.h> #inclu

Unity3DMecanim動畫系統學習筆記():Animator Controller

浮點 key 發現 菜單 融合 stat mon 好的 project 簡介 Animator Controller在Unity中是作為一種單獨的配置文件存在的文件類型,其後綴為controller,Animator Controller包含了以下幾種功能: 可以對

python學習高級語言低級語言

框架 HP 算法 高級 bin 環境 ruby 後綴 局限 註意:隨筆大家都可以看,文章別人找不到但可以通過URL訪問,日誌別人找不到URL也看不到 網絡編程:斷點續傳 WEB框架:用於寫網站 設計模式+算法 高級語言:Java、C#、PHP、Go、ruby 、C++

R語言學習筆記

常用 right 規則 如同 include 順序 rect amp 數據 摘要: 僅用於記錄R語言學習過程: 內容提要: 數據排序:sort()函數、rank()函數、order()函數; 長寬型數據的轉換:stack()函數、reshape()函數、reshape2擴展

tensorflow源碼學習 -- 同步訓練異步訓練

stack location warning 可能 oss implicit mov -i ner 同步和異步訓練是由optimizer來決定的。 1. 同步訓練 同步訓練需要使用SyncReplicasOptimizer,參考http

C++ Primer Plus》學習筆記——第章 迴圈關係表示式(一)

本章內容: for迴圈和while迴圈 表示式和語句 運算子組合 複合語句 逗號運算子以及關係運算符 typedef工具 字元輸入方法get() 檔案尾條件 巢狀迴圈和二維陣列 計算機除了儲存資料外,還可以做很多其他工作。可以對資料進

tensorflow原始碼學習 -- 同步訓練非同步訓練

 同步和非同步訓練是由optimizer來決定的。         1. 同步訓練         同步訓練需要使用SyncReplicasOptimizer,參考https://www.tensorflow.org

Nordic nRF5 SDK 學習筆記, 使用者定製數量的 LED BUTTON

硬體: nRF52832 DK 軟體: nRF SKD Ver 15.2 1. LED 數量以板載的4個改為8個, 修改 pca10040.h 檔案中相關定義 // LEDs definitions for PCA10040 #define LEDS_NUMBER 8 #de

C++ Primer Plus》學習筆記——第章 迴圈關係表示式(二)

while迴圈 while迴圈是沒有初始化和更新部分的for迴圈,它只有測試條件和迴圈體。 while (test-condition) { body; } //當test-condition為true,即不為0時,執行迴圈體。 編寫延時迴圈 long wai

C++ Primer Plus》學習筆記——第章 迴圈關係表示式(三)

迴圈與文字輸入 迴圈完成的一項最常見最重要的任務:逐字元地讀取來自檔案或鍵盤的文字。 cin物件支援三種不同模式的單字元輸入,其使用者介面各不相同。 使用原始的cin進行輸入: 通過迴圈來讀取鍵盤的文字輸入,則必須有辦法停止讀取。 一種方法是選擇某個特殊的字元(哨兵

C++ Primer Plus》學習筆記——第章 迴圈關係表示式(四)

程式設計練習 1.編寫一個要求使用者輸入兩個整數的程式。該程式將計算並輸出這兩個整數之間(包括這兩個整數)所有整數的和。這裡假設先輸入較小的整數。例如,如果使用者輸入的是2和9,則程式將指出2~9之間的所有整數的和為44. #include <iostream>

學習筆記------資料結構(C語言版)陣列三元組順序表

//TSMatrix.cpp #include"predefined.h" #include"TSMatrix.h" Status TransposeSMatrix(TSMatrix M,TSMat

C++學習筆記 複合型別結構體(struct)

結構宣告的位置很重要。可以有兩種宣告位置:一種是可以將宣告放在main()函式中,緊跟在開始括號的後面。另一種是將宣告放在main()函式的前面,這裡採用的就是這種方式,位於函式外面的宣告稱為外部宣告。對於只有一個主函式的程式來說放在外面和裡面沒有區別,但是如果有多個函式,外部宣告可以被其後面的任何函式使用,