簡單瞭解C語言內嵌彙編

来源:https://www.cnblogs.com/charlieroro/archive/2018/02/28/8482419.html
-Advertisement-
Play Games

最近看自旋鎖的實現,自選鎖的迴圈查找鎖的主要實現類似如下,該實現使用到了內嵌的彙編(摘自sanos內核,源代碼有2處實現,一處使用intel彙編,是沒有問題的,另一處使用內嵌彙編語法,源代碼中為cmpxchgl %2, %0,是錯誤的,應該是cmpxchgl %0, %2) 內嵌彙編有個固定格式,如 ...


最近看自旋鎖的實現,自選鎖的迴圈查找鎖的主要實現類似如下,該實現使用到了內嵌的彙編(摘自sanos內核,源代碼有2處實現,一處使用intel彙編,是沒有問題的,另一處使用內嵌彙編語法,源代碼中為cmpxchgl %2, %0,是錯誤的,應該是cmpxchgl %0, %2)



內嵌彙編有個固定格式,如下:

 

asm ( assembler template         /* 彙編語句 */     : output operands                  /* 輸出 */     : input operands                   /* 輸入 */     : list of clobbered registers          );
cmpxchgl的描述如下: Compares the value in the AL, AX, EAX, or RAX register with the first operand (destination operand). If the twovalues are equal, the second operand (source operand) is loaded into the destination operand. Otherwise, thedestination operand is loaded into the AL, AX, EAX or RAX register. RAX register is available only in 64-bit mode.   (* Accumulator = AL, AX, EAX, or RAX depending on whether a byte, word, doubleword, or quadword comparison is being performed *)
TEMP ← DEST
IF accumulator = TEMP
    THEN
        ZF ← 1;
        DEST ← SRC;
    ELSE
        ZF ← 0;
        accumulator ← TEMP;
        DEST ← TEMP;
FI;

 

  1. cmpxchgl %0, %2為彙編語句,表示對第3個和第1個入參進行操作,即cmpxchgl *dest,exchange;
  2. "=m" (*dest), "=a" (old)為輸出部分,將m記憶體的內容存到*dest中,將a寄存器內容存到old;
  3. "r" (exchange), "m" (*dest), "a" (comperand)); 為輸入部分,將exchange放入r寄存器,將*dest放入m,將comperand放入a寄存器;
使用C語言翻譯如下: int atomic_compare_and_exchange(int *dest, int exchange, int comperand)  {     int old = comperand;     if ( comperand== *dest)     {         *dest = exchange;     }     else     {         old  = *dest;     }     return old; }  

參考:http://blog.chinaunix.net/uid-23955580-id-2945814.html


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

-Advertisement-
Play Games
更多相關文章
  • 前言 學習hadoop的時候難免需要部署一些子伺服器,但是如果在每檯子伺服器上面都去部署的話,那麼上千上萬台將會累垮你,所以這時候scp命令就顯得尤為重要了。 一、關於scp命令 1.1scp命令介紹 scp是secure copy的簡寫,用於在Linux下進行遠程拷貝文件的命令,和它類似的命令有c ...
  • 如果使用 mkimage 生成內核鏡像文件的話,會在內核的前頭加上了 64 bytes 的信息頭,供建立 tag 之用。bootm 命令會首先判斷 bootm xxx 這個指定的地址 xxx 與 a 指定的載入地址是否相同。 如果不同的話會從這個地址開始提取出這個 64 bytes 的頭部,對其進行 ...
  • 許可權認證 cookie VS token 我前公司的應用都是 token 授權的,現公司都是維護一個 session 確認登錄狀態的。那麼我在這掰扯掰扯這兩種許可權認證的方方面面。 工作流程 先說 cookie cookie 登錄是有狀態的,服務端維護一個 session 客戶端維護一個 cookie ...
  • 1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。(1)目錄管理命令——ls:列出指定目錄下的內容格式:ls [OPTION]... [FILE]... -a:顯示所有文件包括隱藏文件 -A:顯示除.和..之外的所有文件 -l,--long:顯示文件的詳細屬性信息 -h:對 ...
  • KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 本文目錄:1. 概述2. VRRP協議3. KeepAlived架構模型4. 安裝KeepAlived5. 配置keepalived的日誌6. keepalived配置文 ...
  • 和MySQL主從複製的原因一樣,Redis雖然讀取寫入的速度都特別快,但是也會產生讀壓力特別大的情況。為了分擔讀壓力,Redis支持主從複製,Redis的主從結構可以採用一主多從或者級聯結構,下圖為級聯結構。 Redis主從複製可以根據是否是全量分為全量同步和增量同步。 1 全量同步 Redis全量 ...
  • linux手冊中有詳細講解使用的介面的用法:http://man7.org/linux/man-pages/man2/semop.2.html 使用場景: master(W) shm1 >slave(R) master(R)< shm2 >slave(W) 使用2對信號量控制2個共用記憶體的讀寫 編譯 ...
  • Apache是世界使用排名第一的Web伺服器軟體。它可以運行在幾乎所有廣泛使用的電腦平臺上,由於其跨平臺和安全性被廣泛使用,是最流行的Web伺服器端軟體之一。快速、可靠並且可通過簡單的API擴充,將Perl/Python等解釋器編譯到伺服器中。 特點: 功能強大、配置簡單、速度快、應用廣泛、性能穩 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...