日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Win32基础知识5 - Win32汇编语言006

發(fā)布時間:2025/4/16 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Win32基础知识5 - Win32汇编语言006 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Win32基礎(chǔ)知識5

?

讓編程改變世界

Change the world by program


?

Windows的內(nèi)存安排

? 這節(jié)課我們需要理解三個概念:

每個應(yīng)用程序都有自己的4 GB的尋址空間,就算這個程序只暫 1KB的內(nèi)存;

不同應(yīng)用程序的線性地址空間是隔離的,盡管他們在內(nèi)存中是搞在一起;

時刻要記住,DLL程序是“小三”,因此它們沒有自己“私有”的空間。

? 本節(jié)課我們將圖文并茂地來進(jìn)行原理層面的分析! ?

虛擬內(nèi)存安排:

? Windows 系統(tǒng)一般在硬盤上建立大小為物理內(nèi)存兩倍左右的交換文件用作虛擬內(nèi)存。 利用 80386處理器的內(nèi)存分頁機制,交換文件的尋址上可以很方便地作為物理內(nèi)存使用。 (只需要在真正調(diào)用的時候?qū)⑵渥x入物理內(nèi)存并同時修改線性地址映射到這塊內(nèi)存即可)。 同樣道理,反正是映射一個地址而已,所以被執(zhí)行的程序也可以不必裝入內(nèi)存,只需要在頁表中建立映射關(guān)系,真正運行到這段代碼才調(diào)入內(nèi)存。 ? 眾所周知,Windows 是一個分時的多任務(wù)操作系統(tǒng),CPU時間(就是CPU運行的過程)被分成一個個的時間片后分配給不同程序輪流使用。 在A程序的時間片中,和這個程序執(zhí)行無關(guān)的部分(B和C等其他程序的代碼和數(shù)據(jù))并不需要映射到線性地址中。 ? 附加解析: 內(nèi)存中,所有的程序都搞在一起,關(guān)系十分混亂; CPU只能看到線性地址(假的),每個程序擁有自己的線性地址(小三除外)。 ? [caption id="attachment_665" align="aligncenter" width="679"] 虛擬內(nèi)存安排[/caption] ? ?

總結(jié):WIN32編程中幾個很重要的概念

?

第一點:

每個應(yīng)用程序都有自己的4 GB的尋址空間。 該空間可存放操作系統(tǒng)、系統(tǒng)DLL和用戶DLL的代碼,它們之中有各種函數(shù)供應(yīng)用程序調(diào)用。 再除去其他的一些空間,余下的是應(yīng)用程序的代碼、數(shù)據(jù)和可以分配的地址空間。 ?

第二點:

不同應(yīng)用程序的線性地址空間是隔離的。 雖然它們在物理內(nèi)存中同時存在,但在某個程序所屬的時間片中,其他應(yīng)用程序的代碼和數(shù)據(jù)沒有被映射到可尋址的線性地址中,所以是不可訪問的。 從編程的角度看,程序可以使用4 GB的尋址空間,而且這個空間是“私有”的。 ?

第三點:

DLL程序沒有自己“私有”的空間。 它們總是被映射到其他應(yīng)用程序的地址空間中,當(dāng)做其他應(yīng)用程序的一部分運行。 原因很簡單,如果它不和其他程序同屬一個地址空間,應(yīng)用程序該如何調(diào)用它呢? ?

從WIN32匯編的角度看內(nèi)存尋址

? 如果堅持不到這句話出現(xiàn)的同學(xué)就因為前邊Windows原理太復(fù)雜而放棄的童鞋,小甲魚覺得很可惜…… Win32匯編中的內(nèi)存訪問遠(yuǎn)比DOS下的分段尋址方式簡單,這是為什么呢? 因為Windows是一個多任務(wù)的操作系統(tǒng),最首要的宗旨就是“穩(wěn)定壓倒一切”。 ? 如果把描述符表以及頁表等內(nèi)容交給用戶程序管理是很不安全的。 任何權(quán)限上開放引發(fā)的安全問題都是很嚴(yán)重的,如Windows 9x中的中斷描述符表是可寫的,CIH病毒可利用它將自己的權(quán)限提高到優(yōu)先級0; 而Windows NT下的中斷描述符表是不可寫的,CIH病毒在Windows NT下就無法使用同樣的方法進(jìn)駐內(nèi)存。 ? 關(guān)于CIH病毒可以到魚C論壇“資源分享”版塊下載^_^ ? 正因為如此,Windows操作系統(tǒng)干脆為用戶程序“安排好了一切”。 具體表現(xiàn)在為用戶程序的代碼段、數(shù)據(jù)段和堆棧段全部預(yù)定義好了段描述符。這些段的起始地址為0,限長為ffffffff,所以用它們可以直接尋址全部的4 GB地址空間。 ? 程序開始執(zhí)行的時候,CS,DS,ES和SS都已經(jīng)指向了正確的描述符,在整個程序的生命周期內(nèi),程序員不必改動這些段寄存器,也不必關(guān)心它們的值究竟是多少(實際上是想改也改不了)。 所以對Win32匯編程序來說,整個源程序中竟然可以不用出現(xiàn)段寄存器的身影。 這在DOS匯編編程中是不可想像的。 ?

回顧之前提出的問題:

“為什么在WIN32匯編源代碼中看不到CS,DS,ES,SS等段寄存器的使用?” 答案是:并不是Win32匯編源代碼用不到段寄存器,而是用戶在使用中不必去關(guān)心段寄存器! [buy]?獲得所有教學(xué)視頻、課件、源代碼等資源打包?[/buy] [Downlink href='http://urlxf.qq.com/?Jfyeqe3']視頻下載[/Downlink]

轉(zhuǎn)載于:https://www.cnblogs.com/LoveFishC/archive/2011/08/11/3847114.html

總結(jié)

以上是生活随笔為你收集整理的Win32基础知识5 - Win32汇编语言006的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。