win32組合語言程式設計(1) 基本概念

來源:互聯網
上載者:User

第一個win32組譯工具  基本概念

        WIN32 程式運行在保護模式下的,Windows 把每一個 Win32 應用程式放到分開的虛擬位址空間中去運行,也就是說每一個應用程式都擁有其相互獨立的 4GB 地址空間,作業系統將會在應用程式運行時完成 4GB 的虛擬位址和實體記憶體地址間的轉換,和 16 位 Windows 下的把代碼分成 DATA,CODE 等段的記憶體模式不同,WIN32 只有一種記憶體模式,即 FLAT 模式,所有的 WIN32 的應用程式運行在一個連續、平坦、巨大的 4GB 的空間中。這同時也意味著您無須和段寄存器打交道,您可以用任意的段寄存器定址任意的地址空間,這使得用32位組合語言和用C語言一樣方便。

       在Win32下編程,有許多重要的規則需要遵守。有一條很重要的是:Windows 在內部頻繁使用 ESI,EDI,EBP,EBX 寄存器,而且並不去檢測這些寄存器的值是否被更改,這樣當您要使用這些寄存器時必須先儲存它們的值,待用完後再恢複它們,一個最顯著的應用例子就是 Windows 的 CallBack 函數中。

.386        ;告訴編譯器我們的程式是使用80386指令集編寫的 也可以用.486 .586 不過386最安全。
.MODEL Flat, STDCALL ;指定記憶體模式 ,參數傳遞模式和調用函數時由誰來恢複堆棧(調用者還是函數)
.DATA ;注意win32沒有段(sectionment)的概念,不過可以把程式分成不同的分段 只有兩種data和code
    <Your initialized data> ;data分段分3種 .data已初始化的資料 
     ......
.DATA?; 未初始化的資料
   <Your uninitialized data>
   ......
.CONST; 常量定義
   <Your constants>
   ......
.CODE ;代碼分段
   <label> ;是用來唯一標識您的代碼範圍的標籤,兩個標籤必須相同,應用程式的所有可執行代碼必修在兩個標籤之間。
    <Your code>
   .....
    end <label>

分段並不是象在 Dos 下一樣,為不同的段分別指出不同的段寄存器,因為 Windows 下只有一個 4GB 的段,Windows 程式中的分段表現在當程式裝載時,賦予不同的分段不同的屬性,比如說當你的程式載入時,對於 Ring3 程式來說,.code 段是不可寫的,而 .data 段是可寫的,如果你嘗試象在 Dos 下一樣寫自己的代碼部分,你會得到一個藍屏錯誤

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.