使用MASM02 - Win32汇编语言010
生活随笔
收集整理的這篇文章主要介紹了
使用MASM02 - Win32汇编语言010
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用MASM02
?讓編程改變世界
Change the world by program
?
模式定義
?3)option語句
如例子中,我們定義了 option casemap:none 的意義是告訴編譯器程序中的變量名和子程序名是否對大小寫敏感。 由于Win32 API 的API函數名稱本質是區分大小寫的,所以必須指定這個選項,否則調用API函數就會出現問題。 ? 段的定義 把上面的Win32的Hello World源程序中的語句歸納精簡一下,再列在下面: [codesyntax lang="asm"] .386 .model flat,stdcall option casemap:none <一些include語句> .data <一些字符串、變量定義> .code<代碼><開始標號><其他語句> end 開始標號 [/codesyntax] ? 模式定義中的模式、選項等定義并不會在編譯好的可執行程序中產生什么東西,它們只是說明。 而真正的數據和代碼是定義在各個段中的,如上面的.data段和.code段,考慮到不同的數據類型,還可以有其他種類的數據段。 ? 下面是包含全部段的源程序結構: [codesyntax lang="asm"] .386 .model flat,stdcall option casemap:none <一些include語句> .stack [堆棧段的大小] .data <一些初始化過的變量定義> .data <一些沒有初始化過的變量定義> .const <一些常量定義> .code<代碼><開始標號><其他語句> end 開始標號 [/codesyntax] ? .stack、.data、.data 、.const和.code是分段偽指令,Win32中實際上只有代碼和數據之分, .data,.data 和.const這些都是指向數據段,.code是指向代碼段。 和DOS匯編不同,Win32匯編不必考慮堆棧,系統會為程序分配一個向下擴展的、足夠大的段作為堆棧段,所以.stack段定義常常被忽略。 ?解決之前提出的問題
? 前面我們不是說過Win32環境下不用段了嗎? 是的,這些“段”,實際上并不是DOS匯編中那種意義的段,而是內存的“分段”。 上一個段的結束就是下一個段的開始,所有的分段,合起來,包括系統使用的地址空間,就組成了整個可以尋址的4GB空間。 我們接著往下看會更加容易理解。 ? Win32匯編的內存管理使用了80386處理器的分頁機制,每個頁(4KB大小)可以自由指定屬性,所以上一個4KB可能是代碼,屬性是可執行但不可寫,下一個4KB就有可能是既可讀也可寫但不可執行的數據。 ? 再下面呢? 有可能是可讀不可寫也不可執行的數據。(主要就看你放的是什么東西……) 嘿嘿,大家是否有點理解了?沒關系,接著往下! ? ? Win32匯編源程序中“分段”的概念實際上是把不同類型的數據或代碼歸類,再放到不同屬性的內存頁(也就是不同的“分段”)中,這中間不涉及使用不同的段選擇器。(僅僅是配合分頁機制搞搗鼓~) 雖然使用和DOS匯編同樣的.code和.data語句來定義,意思可是完全不同了! 至此,相信大家和小甲魚一樣清晰啦,感謝老師,感謝拉登,感謝嫦娥^_^ ?數據段
? .data、.data 和.const定義的是數據段,分別對應不同方式的數據定義,在最后生成的可執行文件中也分別放在不同的節區(Section)中。 (這個在我們講解PE結構的時候會很細致描述) ? 程序中的數據定義一段可以歸納為3類:– 第一類是可讀可寫的已定義變量。
– 第二類是可讀可寫的未定義變量。
– 第三類數據是一些常量。
?可讀可寫的已定義變量
這些數據在源程序中已經被定義了初始值,而且在程序的執行中有可能被更改。 如一些標志等,這些數據必須定義在.data段中,.data段是已初始化數據段。 其中定義的數據是可讀可寫的,在程序裝入完成的時候,這些值就已經在內存中了,.data段存放在可執行文件的_DATA節區內。 ?可讀可寫的未定義變量
這些變量一般是當做緩沖區或者在程序執行后才開始使用的,這些數據可以定義在.data段中,也可以定義在.data 段中。 但一般把它放到.data 段中。 雖然定義在這兩種段中都可以正常使用,但定義在.data 段中不會增大.exe文件的大小。 ? 舉例說明,如果要用到一個100KB的緩沖區,可以在數據段中定義:szBuffer db 100 * 1024 dup ( )
? 如果放在.data段中,編譯器認為這些數據在程序裝入時就必須有效,所以它在生成可執行文件的時候保留了所有的100KB的內容,即使它們是全零! 如果程序其他部分的大小是50KB,那么最后的.exe文件就會是150KB大小,如果緩沖區定義為1MB,那么.exe文件會增大到1050KB。 ? .data 段則不同,其中的內容編譯器會認為程序在開始執行后才會用到,所以在生成可執行文件的時候只保留了大小信息,不會為它浪費磁盤空間。 和上面同樣的情況下,即使緩沖區定義為1MB,可執行文件同樣只有50KB!總之,.data 段是未初始化數據段,其中的數據也是可讀可寫的,但在可執行文件中不占空間,.data 段在可執行文件中存放在_BSS節區中。 ?數據是一些常量
? 如一些要顯示的字符串信息,它們在程序裝入的時候也已經有效,但在整個執行過程中不需要修改,這些數據可以放在.const段中,.const段是常量段,它是可讀不可寫的。 一般為了方便起見,在小程序中常常把常量一起定義到.data段中,而不另外定義一個.const段。 在程序中如果不小心寫了對.const段中的數據做寫操作的指令,會引起保護錯誤,Windows會顯示一個提示框并結束程序。 [buy]?獲得所有教學視頻、課件、源代碼等資源打包?[/buy] [Downlink href='http://urlxf.qq.com/?V3u6Jrq']視頻下載[/Downlink]轉載于:https://www.cnblogs.com/LoveFishC/archive/2011/09/13/3847118.html
總結
以上是生活随笔為你收集整理的使用MASM02 - Win32汇编语言010的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CxImage图像处理类库说明3(转载)
- 下一篇: 【求解】未定义的析构函数