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