ARM彙編與C混合編程

来源:http://www.cnblogs.com/xiaojiang1025/archive/2016/11/15/6064253.html
-Advertisement-
Play Games

GNU內聯彙編 內聯彙編 即在C中直接使用彙編語句進行編程,使程式可以在C程式中實現C語言不能完成的一些工作,例如,在下麵幾種情況中必須使用內聯彙編或嵌入型彙編 1. 程式中使用飽和算術運算(Saturating Arithmetic) 2. 程式需要對協處理器進行操作 3. 在C程式中完成對程式狀 ...


GNU內聯彙編

內聯彙編即在C中直接使用彙編語句進行編程,使程式可以在C程式中實現C語言不能完成的一些工作,例如,在下麵幾種情況中必須使用內聯彙編或嵌入型彙編

  1. 程式中使用飽和算術運算(Saturating Arithmetic)
  2. 程式需要對協處理器進行操作
  3. 在C程式中完成對程式狀態寄存器的操作
__asm__ __volatile__("asm code":output:input:changed registers);

Note:

  1. 使用__asm____volatile__表示編譯器將不檢查後面的內容,而是直接交給彙編器。
  2. 如果希望變壓器你優化,__volatile__可以不加
  3. 沒有asm code也不能省略""
  4. 沒有前面的和中間的部分,不可以相應的省略:
  5. 沒有changed 部分,必須相應的省略:
  6. 最後的;不能省略,對於C語言來說這是一條語句
  7. 彙編代碼必須放在一個字元串內,且字元串中間不能直接按回車換行,可以寫成多個字元串,註意中間不能有任何符號,這樣就會將兩個字元串合併為一個
  8. 指令之間必須要換行,還可以使用\t使指令在彙編中保持整齊

asm code

"mov r0, r0\n\t"
"mov r1,r1\n\t"
"mov r2,r2"

output(asm->C)

:"constraint" (variable)

"constraint"用於定義variable的存放位置:
r表示使用任何可用的寄存器
m表示使用變數的記憶體地址
+可讀可寫
=只寫
&表示該輸出操作數不能使用輸入部分使用過的寄存器,只能用"+&""=&"的方式使用

input(C->asm)

:"constraint" (variable/immediate)

"constraint"用於定義variable的存放位置:
r表示使用任何可用的寄存器(立即數和變數都可以)
m表示使用變數的記憶體地址
i表示使用立即數

例子

int a=100,b=200;
int result;
__asm__ __volatile__(
    "mov %0,%3\n\t"             //%0是一個占位符,表示result,之後的類推
    "ldr r0,%1\n\t"
    "ldr r1,%2\n\t"
    "str r0,%2\n\t"
    "str %1,%1\n\t"
    :"=r"(result),"+m"(a),"+m"(b)   
    :"i"(123)
);

ATPCS

  1. 子程式間通過寄存器R4~R11來傳遞參數,如果參數多於四個,則多出的部分用堆棧傳遞,被調用的子程式在返回前無須恢復寄存器R0~R3的內容
  2. 在子程式中,使用寄存器R4~R11來保存局部變數,如果在子程式中使用到了R4~R11中的某些寄存器,子程式進入時必須保存這些寄存器的值,在返回前必須恢復這些寄存器的值;對於子程式中沒有用到的寄存器則不必進行這些操作,在Thumb程式中,通常只能使用寄存器R4~R7來保存局部變數
  3. R12用作子程式間scrtach寄存器(用於保存SP,在函數返回時使用該寄存器出棧),記作ip
  4. R13用作數據棧指針,記作sp
  5. R14用作連接寄存器,記作lr
  6. R15記作程式寄存器,記作pc

相互調用

C和彙編相互調用要特別註意遵守相應的ATPCS規則

C調用彙編

//.c
#include <stdio.h>
extern void strcopy(char* des, const char* src);
int main(){
    const char* srcstr = "src string";
    char desstr[]="des string";
    strcopy(desstr, srcstr);
    return 0;
}
;.asm
.global strcopy
strcopy:                ;R0指向目的字元串
                        ;R1指向源字元串
    LDRB R2, [R1], #1   ;載入位元組並更新源字元串指針地址
    STRB R2, [R0], #1   ;存儲季節並更新目的字元串指針地址
    CMP  R2, #0         ;判斷是否為字元串結尾
    BNE strcopy         ;如果不是,程式跳轉到strcopy繼續迴圈
    MOV pc, ir          ;程式返回

彙編調用C

//.c
int fcn(int a, int b , int c, int d, int e){
    return a+b+c+d+e;
}
;.asm
;假設程式進入f時,R0中的值為i
;int f(int i){return fcn(i, 2*i, 3*i, 4*i, 5*i);}
.text
.global _start
_start:
    STR lr, [sp, #-4]!  ;保存返回地址lr
    ADD R1, R0, R0      ;計算2*i(第2個參數)
    ADD R2, R1, R0      ;計算3*i(第3個參數)
    ADD R3, R1, R2      ;計算5*i
    STR R3, [SP, #-4]!  ;第5個參數通過堆棧傳遞
    ADD R3, R1, R1      ;計算4*i(第4個參數)
    BL fcn              ;調用C程式
    ADD sp, sp, #4      ;從堆棧中刪除第五個參數
    .end

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在傳統模式中,開發團隊在開發環境中完成軟體開發,自己做了一遍單元測試, 測試通過,ᨀ交到代碼版本管理庫。運維把應用部署到測 試環境, QA 進行測試,沒問題後通知部署人員發佈到生產環境。 在上述過程中涉及到至少三個環境:開發、測試和生產。現實情況是,開發自測 沒問題,但到了測試或者生產環境程式無法運 ...
  • 常識 兩條匯流排線路:串列數據匯流排SDA,串列時鐘匯流排SCL 每個連接到匯流排的器件都有唯一的地址供其他設備定址 每個連接到匯流排的器件都可以作為發送器和接收器 是多主機匯流排,如果兩個或更多主機同時初始化,數據傳輸可以通過重提檢測和仲裁防止數據被破壞 串列的8bit雙向數據傳輸位速率在標準模式下可達100 ...
  • 一、簡述前言: 1、本案例是基於 VMware Workstation Pro(專業版)12 上創建一個MAC操作系統(版本 :OSX10_11),下麵的步驟基本上和安裝其他類型的虛擬機沒有什麼區別。 2、安裝所需: ① VMware Workstation 安裝虛擬機的軟體,儘量使用高版本的,避免 ...
  • 在mac終端運行 sudo npm install -g bower (安裝之前你要確定你已經成功安裝了node 和 git) 然後會報錯 like this: ...
  • linux三劍客awk、sed、grep 1、awk主要用來做分列、匹配、計算的工作 2、sed主要用來做替換的(流處理) 3、grep主要用來過濾出需要的文本 awk(預設的分隔符為空格)awk -F ":" '/bonzi/{if (NR==2) print $0}'(一般模式) -F 設置分隔 ...
  • 概述 在這裡以x86的處理器為例 機器在啟動的時候會執行 第一條指令 。這條指令會去執行 bios ,將控制權交給bios。 bios完成硬體的質檢,然後將bootloader從硬碟讀到記憶體中,執行 bootloader ,並將控制權交給bootloader bootloader負責使能保護模式、建 ...
  • CetnOs基本優化 1、添加一個普通用戶(註意:用localhost不行,會產生錯誤),利用sudo授權完成一系列的工作,不要使用root用戶 方法一: 添加用戶名(Alex): [root@promote ~]# useradd Alex 設置密碼: [root@promote ~]# pass ...
  • /etc目錄 包含很多文件.許多網路配置文件也在/etc 中. /etc/rc or/etc/rc.d or/etc/rc*.d 啟動、或改變運行級時運行的scripts或scripts的目錄. /etc/passwd 用戶資料庫,其中的域給出了用戶名、真實姓名、家目錄、加密的口令和用戶的其他信息. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...