1. 程式人生 > >組合語言實驗三

組合語言實驗三

(一)將下面的程式儲存為 t1.axm 檔案,將其生成為可執行檔案 t1.exe
assume cs:codesg

codesg segment

    mov  ax,2000H
    mov  ss,ax
    mov  sp,0
    add  sp,10
    pop  ax
    pop  bx
    push ax
    push bx
    pop  ax
    pop  bx

    mov ax,4c00H
    int    21H

codesg ends

end

(1)編輯

(2)編譯

完成對源程式的編輯後,得到一個源程式檔案 c:\ASM\t1.asm。可以對其進行編譯,生成包含機器程式碼的目標檔案

使用匯編編譯器 masm 來完成編譯任務。

(3)連線

可以看到經過編輯、編譯、連線 3 個步驟後,當前資料夾下總共有 3 個檔案,它們分別是:

  • T1.ASM
  • T1.OBJ
  • T1.EXE

其中 T1.EXE 是一個可執行檔案,也就是我們最終想要得到的檔案。

(二)用 Debug 跟蹤 t1.exe 的執行過程,寫出每一步執行後,相關暫存器中的內容和棧頂的內容

下面說一說 DOS 中一個 EXE 檔案被載入進記憶體的過程。

一個程式被載入進記憶體後,作業系統會為我們建立一個程式段字首(PSP),DOS 需要通過 PSP 來和我們的程式進行通訊,其中 PSP 和我們的程式在記憶體中的關係圖大致如下:

程式載入後,DS 中存放著程式所在記憶體區的段地址,由於 PSP 也是程式在記憶體中的一部分,所以 DS = SA。

而 CS 是指向程式的第一條指令,CS = DS + 10H,通過上面動圖裡暫存器的內容也能看出來。DS = 0A67H,CS = 0A77H。

所以我們也可以說,通過 Dubug 命令,將這段程式從可執行檔案中載入記憶體,程式起始地址為 0A67H,第一條指令起始地址為 0A77H,其中 0A67H ~ 0A77H 這段地址存放的是該程式對應的程式段字首(PSP)。

程式從 0A77:0000 開始執行如下:

(三)PSP 的頭兩個位元組是 CD 20,用 Debug 載入 t1.exe,檢視 PSP 中的內容。

0A67:0000 ~ 0A67:0100 這段內容就是程式段字首(PSP)裡的內容。