程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> Win32 Asm教程

Win32 Asm教程

編輯:vc教程

這是我的Win32匯編教程。它總是在創建中,我會不停地添加內容。通過上面的next和prev鏈接,你可以轉到後面和前面一頁。

導言

先來對這個教程做個小小的介紹。Win32Asm不是一個非常流行的編程語言,而且只有為數不多(但很好)的教程。大多數教程都集中在編程的win32部分(例如,WinAPI,標准Windows編程技術的使用等),而不是匯編語言本身,例如偽代碼(opcodes),寄存器(registers)的使用等。雖然你能在其他教程中找到這些內容,但那些教程通常是解釋Dos編程的。它當然可以幫你學習匯編語言,但在Windows中編程,你不再需要了解Dos中斷(interrupt)和端口(port)In/Out函數。在Windows中,WindowsAPI提供了你可在你的程序中使用的標准函數,後面還會對此有更多內容。這份教程的目的是在解釋用匯編編Win32程序的同時學習匯編語言本身。

1.0-介紹匯編語言

匯編語言是創造出來代替原始的只能由處理器理解的二進制代碼的。很久以前,尚沒有任何高級語言,程序都是用匯編寫的。匯編代碼直接描述處理器可以執行的代碼,例如:

add eax,edx

add這條指令把兩個值加到一起。eax和edx被稱為寄存器,它們可以在處理器內部保存值。這條代碼被轉換為66 03 c2(16進制)。處理器閱讀這行代碼,並執行它所代表的指令。像C這樣的高級語言把它們自己的語言翻譯為匯編語言,而匯編器又把它轉換為二進制代碼:

C 代碼
a = a + b; >> C編譯器 >> 匯編語言
add eax, edx >>匯編器>> 原始輸出(十六進制)
66 03 C2

(注意該處的匯編語言的代碼被簡化了,實際輸出決定於C代碼的上下文)

1.1-為什麼?(Why?)
既然用匯編寫程序很困難,那麼為什麼你用A匯編而不是C或者別的什麼??-匯編產生的程序更小而且更快。在像如有人工智能一般的非常高級編程語言中,編譯器要產生輸出代碼比起匯編來更困難。雖然編譯器變得越來越好,編譯器仍然必須指出最快(或最小)的方式產生匯編代碼。而且,你自己來寫(匯編)代碼(包括可選的代碼優化)能生成更小更快的代碼。但是,當然,這比使用高級語言難多了。還有另一個與某些使用運行時dll的高級語言不同的地方,它們在大多數時運行良好,但有時由於dll(dll hell)而產生問題,用戶總是要安裝這些Dll。對於Visual C++,這不是一個問題,它們是與Windows一同安裝的。而Visual Basic甚至不把自己的語言轉換為匯編語言(雖然5以及更高的版本進行了一些這樣的轉換,但不完全)。它高度依賴msvbvm50.dll-Visual Baisc虛擬機。由VB產生的exe文件僅僅存在簡單的代碼和許多對這些dll的調用。這就是vb慢的原因。匯編是所有中最快的。它僅僅用系統的dll如Kernel32.dll, User32.dll等。

譯者注:dll hell是指由於dll新的版本被舊的版本給代替了。由於使用了dll新版本的程序仍然調用新的函數,導致了致命的錯誤。

另一個誤解是許多人認為匯編不可能用來編程。當然,它難,但不是不可能。用匯編創建大的工程的確很難,我只是用它來寫小程序,用於需要速度的代碼被寫在能被其他語言導入的dll中。而且,Dos和Windows還有一個很大的區別。Dos程序把中斷當“函數”用。像中斷10用於顯示,中斷13用於文件存儲等。在Windows中,API函數只有名字(比如MessageBox, CreateWindowsEx)。你能導入庫(DLL)並使用其中的函數。這使得用asm寫程序簡單多了。你將在下一章中學習更多關於這方面的知識。

2.0-開始前的准備

介紹已經夠多了,現在讓我們開始吧。要用匯編寫程序,你需要一些工具。下面,你能看到我將在本教程中使用哪些工具。我建議你安裝同樣的工具,因為這樣你能跟著教程試驗文中的例子。我也給出其他的一些選擇,雖然其中的大部分你都可以選擇,但是要警告的是在匯編器(masm,tasm和nasm)中有很大的區別。在這個教程中,將使用masm,因為它有許多很有用的功能(例如invoke),它使得編程更容易。當然,你可以自己選擇你更喜歡的匯編器,但這將使你跟著教程走難一些而且你不得不把教程中的例子進行轉換使它可以在你用的匯編器中運行。

匯編器

我的選擇:Masm(在win32asm包中)

網址:win32asm.cjb.net

描述:一個把偽代碼(opcodes)翻譯為給處理器讀的原始輸出(object文件)的匯編器

相關內容:Masm,宏(macro)匯編器,是一個有很多有用的特色的匯編器。像“invoke”,它可以簡化對API函數的調用並對數據類型進行檢查。你將在本教程的後面學習這些。如果你讀了上面的文字你就知道本教程推薦使用masm。

供選擇:Tasm[dl],nasm[dl]

鏈接器

我的選擇:微軟Incremental鏈接器(link.exe)

網址:win32asm.cjb.net(在win32asm包中)

描述:鏈接器把目標(object)文件和庫文件(用於導入DLL中的函數)“鏈接”到一起輸出最終的可執行文件。

關於:我用Iczelion的Win32asm包中的link.exe。但大多數的鏈接器都可以用。

供選擇:Tasm linker[dl]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved