內聯彙編基礎知識

來源:互聯網
上載者:User

幾天看了孫原等幾位仁兄關於組合語言的幾篇文章,頗感興趣。於是查了查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網站。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.