內嵌彙編例子

2021-10-20 22:39:18 字數 2257 閱讀 4503

語法解釋

__asm__ __violate__ ("movl %1,%0" : "=r" (result) : "m" (input));
movl %1,%0"是指令模板;"%0"和"%1"代表指令的運算元,稱為佔位符,

本例中只有兩個:"result"和"input",他們按照出現的順序分 別與指令運算元"%0","%1"對應;

注意對應順序:第乙個c 表示式對應"%0";第二個表示式對應"%1",依次類推,運算元至多有10 個,分別用"%0","%1"...."%9"表示。

"result"前面的限制字串是"=r",其中"="表示"result"是輸出運算元

"r" 表示需要將"result"與某個通用暫存器相關聯,先將運算元的值讀入暫存器,然後在指令中使用相應暫存器,當然指令執行 完後需要將暫存器中的值存入變數"result",從表面上看好像是指令直接對"result"進行操作,實際上gcc做了隱式處理,這樣我們可以少寫一 些指令。"input"前面的"m"表示該表示式需要先放入記憶體,然後在指令中使用參加運算。

asm ( assembler template         /* 彙編語句 */

: output operands /* 輸出暫存器 */

: input operands /* 輸入暫存器 */

: list of clobbered registers //會被修改的暫存器

);// 先輸入 再彙編指令 再輸出

int result = 50;

int input = 20;

int num =0;

// 從右邊複製到左邊

__asm__ __volatile__ ("movl %1,%0" : "=r" (result),"=r"(num) : "m" (input),"r"(result));

cout << "result := " << result << endl;

cout << "input := " << input << endl;

cout << "num := " << num << endl;

result := 50

input := 20

num := 50

int c = 15;

int exchange_value = 5;

int compare_value = 10;

int num = 25;;

int num1 = 30;;

int * dest = #

__asm__ volatile ( "lock cmpxchgl %1,(%3)" // 彙編語句

: "=b" (exchange_value) // 輸出暫存器

: "r" (c),"a" (num)/*eax*/,"r" (dest)

: "cc", "memory"); //會被修改的暫存器

cmpxchg source, destination
如果destination和eax/ax/al相等,把source載入到destination;

否則,把destination載入到eax/ax/al中

如果a的值num==*dest,則把c的值賦給*dest

列印dest := 15

int c = 15;

int exchange_value = 5;

int compare_value = 10;

int num = 25;;

int num1 = 30;;

int * dest = #

__asm__ volatile ( "lock cmpxchgl %1,(%3)" // 彙編語句

: "=b" (exchange_value) // 輸出暫存器

: "r" (c),"a" (num1)/*eax*/,"r" (dest)

: "cc", "memory"); //會被修改的暫存器

如果a的值num!=*dest,則*dest不會賦值

列印dest := 25

VB內嵌彙編

vb簡單易用,但功能有時候受限制。vc,delphi可以直接在程式中寫彙編 可惱的是,vb不行。我看過網上也有關於vb嵌入彙編的,不過有些方法,過於複雜,而且也沒相應 的介紹。我這裡提供一種方法,也許大家以後可能有用!基本思路 彙編 可以存在乙個byte型別的陣列中,然後,通過某種手段,把系統控制權...

關於內嵌彙編

最近才發現原來noi不給用內嵌彙編 那麼這篇文章除了平常做做oj以外就沒什麼意義了 參考自 嗯 搞oi久了應該都會碰到這麼一種問題 爆棧 當然,手寫棧是最普遍的一種解決方法 比如noi2011 day2 t1,ms是臨時換的一道水題,只要會手寫棧就可以水過 pascal黨是很舒服的,因為可以在 中手...

GCC內嵌彙編

gcc內嵌彙編 限制字元 限制字元有很多種,有些是與特定體系結構相關,此處僅列出常用的限定字元和i386中可能用到的一些常用的限定符。它們的作用是指示編譯器如何處理其後的c語言變數與指令運算元之間的關係,例如是將變數放在暫存器中還是放在記憶體中等,下表列出了常用的限定字母。b 將輸入變數放入ebx ...