1. 程式人生 > >匯編知識掃盲之16位匯編跟32位匯編的保護模式以及匯編代碼編寫

匯編知識掃盲之16位匯編跟32位匯編的保護模式以及匯編代碼編寫

ima 邏輯地址 bubuko das www int 字節 以及 pop

       匯編知識掃盲之16位匯編跟32位匯編的保護模式以及匯編代碼編寫

一丶內存尋址模型

  邏輯地址.線程地址.物理地址

了解匯編之前.先了解一下上面這些詞的含義;

  邏輯地址: 這個是郵編一起生成的.邏輯地址一般都是 段加段內偏移組成的.每個進程獨享.

  線性地址: 由分段管理機制.將邏輯地址轉化為線性地址.這個了解即可.學過內核的人看到應該明白.如果沒有學過.簡單濾過即可(32位下邏輯 = 線性)

  物理地址: 通過分頁管理機制(內核中成為PDE PTE等頁目錄 頁表等等)將線性地址轉化為物理地址. 這些了解即可.

下圖說明了上面三個地址的意思:

  技術分享圖片

這張圖學過內核的能看明白. 如果沒學過.那麽了解即可.

二丶實模式分段模型.跟保護模式扁平模型

  如果細說這兩個的區別會很多.不過我們了解下即可.

  實模式分段模型.:   

    有20位地址總線

    每個段的大小是64kb

    16個不同的段.

   CS DS寄存器中保存的是段的起始地址.

上面主要就是說. 我怎麽尋找邏輯地址. 其實就是段 + 偏移的方式.

  16位下. 有 2^16次方尋址. 也就是64kb. 但是增加了4條地址總線.也就是 2^20次方 = 1MB

  那麽為了尋到這1MB的空間. 首先就把1MB空間分成16個不同的段. CS DS存放段的起始地址. 然後加上段內偏移即可尋到.

保護模式扁平模型

  32個地址總線.

引入了GDT LDT等段描述符表

  CS DS不變.

因為32位地址總線可以存儲地址了.所以段寄存器就都為0了.但是是保護模式.所以引入了段選擇子. (涉及到內核知識了) 這些了解即可.

三丶16位代碼編寫.

  16位我們要自己分段.自己寫代碼. 下方代碼是一個16位匯編程序.

data segment                ;定義數據段
str db HelloWorld$        ;以字節方式在數據段中定義字符串
data ends                   ;數據段結束

code segment                
;定義代碼段 assume cs:code ,ds:data ;將CS寄存器跟代碼段相關聯.DS寄存器跟數據段相關聯 start: ;定義標號.代碼開始執行位置. mov ax,data ;將數據段給ax寄存器保存 mov ds,ax ;將ax給DS寄存器保存. lea dx,str ;求得字符串的地址 mov ah,9h ;調用21號功能的9h功能進行打印 int 21h mov ah,4ch ;調用4ch進行退出 int 21h code ends ;代碼段結尾. end start ;結束位置.必須給標誌表示從哪裏開始執行

16位匯編是運行在以前的老機器上的.所以我們需要下載兩個軟件才能進行編譯執行.

一個是MASM5.0 一個是 DOSbox 0.74 下方附上鏈接

鏈接:https://pan.baidu.com/s/1O0-mUWv9fgvkqA_An1W0yA 密碼:xzjd

使用DOSbox0.74 的步驟

1.解壓MASM5.0到你的盤符
2.安裝DosBox0.74
3.打開DosBox0.74
4.在DosBox中使用指令切換到你的MASM盤符
例如:    mount d: d:\MASM5.0
5.切換盤符 D:
6.DIR命令觀看是否設置成功
7.編譯你寫的16位匯編
    masm a.asm
8.編譯之後會生成obj.我們還需要進行連接
    link a.obj
9.連接之後就生成了a.exe了我們可以直接運行
    a.exe
10.如果調試則使用 debug a.exe進行調試.

使用masm編譯的時候.確保asm放在masm目錄下面.

結果演示.

四丶32位匯編代碼編寫.

  32位匯編代碼編寫.可以使用RadAsm編寫.博客中已經寫過.我們主要講解一下在VC中的寫法.

在VC中32位下.可以支持內聯匯編的.

例如:

  

__asm
{
     push eax
     push ebx
     pop eax
     pop ebx  
}

五丶64位匯編寫法  

  64位匯編已經不支持我們使用內聯匯編了.所以我們必須要添加ASM去編寫.

這有一篇好的文章: https://www.mallocfree.com/basic/asm/asm-4-x64.htm

匯編知識掃盲之16位匯編跟32位匯編的保護模式以及匯編代碼編寫