幾天看了孫原等幾位仁兄關於組合語言的幾篇文章,頗感興趣。於是查了查98版的MSDN中,其中也有幾篇關於內聯彙編的基礎,索引字是asm。講得不算太難,於是試著將其內容寫下來了,特此貼來。
一、內聯彙編簡述
Visual C++ 6.0編譯器下,內聯彙編可以使用所有的Intel486處理器指令集。而且可以對目標處理器建立起偽指令來實現附加指令功能。內聯彙編可以使用MASM編譯器所允許的運算式,其中的一些運算式可以通過操作符和運算元的組合,對單精值進行運算.
雖然內聯彙編可以訪問C\C++中的資料變數以及類對象,但它不可能通過MASM指令和操作符來定義資料及對象。尤其你還不能使用DB, DW, DD, DQ, DT和DF等定義指令以及DUP和This操作符。彙編中的結構記錄也不是可用的。內聯彙編也不支援directives STRUC, RECORD, WIDTH, 和 MASK指令。不過,在內聯彙編可以使用到一個_emit巨集指令,它類似於MASM中的DB指令,它可以在本地區內定義出一個位元組型,雖然它每次只能定義一個位元組出來,但還是可以用它來定義出一個字串,請看樣本:
#define randasm __asm _emit 0x4A __asm _emit 0x43 __asm _emit 0x4B
…
__asm
{
randasm
}
雖然內聯彙編不支援MASM中的很多指令,但它支援EVEN 和 ALIGN指令。它們被用於那些需要使用align labels來指定分界線的彙編指令。
內聯彙編不可以是一個宏組譯工具,你不可以使用MASM中的宏定義指令以及宏操作符。但內聯彙編是可以使用C\C++中的預理指令來定義宏。
在處理段時,你只能使用寄存器,而不是通過名字,因為在內聯彙編中這是非法的。而且段必須顯式地使用寄存器,如: ES:[BX]
在內聯彙編使用操作符LENGTH, SIZE, 和 TYPE可以來對變數以及類型進行長度的測量,你可以使用它們來求得C\C++中的變數及類型的長度:
*LENGTH操作符可以返回在一個變數數組中的元素個數,如果返回為1則代表這不是一個變數數組。
*SIZE操作符可以求得一個變數及類型的總長度。這個值也可以由LENGTH與TYPE積來求得。
*TYPE操作符可以求得一個變數及類型的長度,與SIZE不同的是,如果變數名是一個數組的話,則返加這個數組中單個元素的長度。
具體情況請看下錶:
| __asm |
C |
Size |
| LENGTH arr |
sizeof(arr)/sizeof(arr[0]) |
8 |
| SIZE arr |
sizeof(arr) |
16 |
| TYPE arr |
sizeof(arr[0]) |
2 |
包含著內聯彙編的程式可以使用/Zi選項編譯,從而來進行代碼級的調試工作。這樣,你就可以同時在C\C++程式段與內聯彙編段中設定斷點,如果你使用/Fas選項允許混合彙編與C\C++來源程式調試方式,那麼你就可以看到混合著彙編與來源程式的代碼集合。
Visual C++編譯器允許你在內聯組譯工具中使用Intel處理器的MMX指令集。不過如果使用MMX指令集編譯器會發生警告。更多的資訊請查看MSDN的Web網站。