1. 程式人生 > >匯編語言實驗三

匯編語言實驗三

程序 code 文件夾 和我 加載 asm 裏的 目標 第一條

(一)將下面的程序保存為 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)裏的內容。

匯編語言實驗三