每次都忘記, 每次都搞不清楚, 這次我決定記下來並且搞清楚。
gcc 的 inline assembly 有好幾種語法, 有簡單的、有複雜的, 這裡只介紹最複雜的那種 (placeholders : 那個 %0, %1, 完全搞不清楚。), 因為有這種最複雜的語法就可以搞定一切。我用一個對照的語法來說明, 這樣會比較好了解。這邊示範的是 x86 組合語言。
12-15, 26-29 直接拿來比對就知道 placeholders 到底怎麼用。
先把 "d"(data1) -> "r"(data1), "c"(data2) -> "r"(data2),
"=a"(result) -> "=r"(result), 夠簡單吧!
d 表示使用 edx
c 表示使用 ecx
a 表示使用 eax
r 表示使用任何可用的 general-purpose register
所以用 r 可能還是會用到 edx, ecx, eax 的組合, 或是 ebx, edx, eax, 讓 compiler 來煩惱就好。
再來是神奇的 %0, %1, %2
imull %%edx, %%ecx
L29 注解寫著 %1 -> data1, data1 在 15 行是 "d"(data1), d 表示 edx, 所以換掉 %%edx =>
imull %1, %%ecx
"movl %%ecx, %%eax"
參照 line 28, 14 =>
"movl %%ecx, %0"
參照 line 29, 15
依樣畫葫蘆得到
%%ecx -> %2
所以
imull %1, %%ecx
imull %1, %2
"movl %%ecx, %0"
"movl %2, %0"
這就變成 line 26 - 29 的 placeholders 版本。
看看產生的組合語言程式 (inline_asm_placeholders.s line 20, 21), 使用 r 的版本 (placeholders) 只用了 eax, edx, 沒有用到 ecx register。placeholders 的語法還可以最佳化轉譯出來的組合語言程式碼。
ref:
professional assembly language p372 - 374
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s6
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。