實驗1


;p1.asm
DATA SEGMENT;//定義數據段
    MYWORD DB "hello world!!!!$";//定義字符串數組
DATA ENDS

CODE SEGMENT;//定義代碼段
    ASSUME CS:CODE,DS:DATA;//說明代碼段與數據段
start:
    MOV AX,DATA;//將DATA(數據首地址)->AX寄存器
    MOV DS,AX;//使得DS等於AX
    LEA DX,MYWORD;//使得DX保存MYWORD的首地址
    MOV AH,09h;//AH輸出數組
    INT 21h;//執行AH的09h功能,輸出
    MOV AX,4c00h;//設置寄存器功能
    INT 21h;//調用寄存器功能,結束程序
CODE ENDS

END start;表示在start處執行程序,並結束程序

 

masm命令

 

 

link命令

 

 

 

執行p1.exe

 

 

成功輸出“hello world!!!!”

 

任務二:PC機主板上的ROM中有一個生產時期,在內存FFF00H ~ FFFFFH的某幾個單元中,請找到這個生產時 期,並試圖修改它。

在debug中,使用d命令查看生產日期 使用e命令修改生產時期所在的內存單元,修改后,再次使用d命令查看

 

使用d命令查看生產日期

 

 

 使用e命令修改內存單元

 

 

 並不能修改

這一段內存單元是受保護的

 

任務三:在debug中,使用e命令,向內存單元填寫數據。 -e b800:0 03 04 03 04 03 04 03 04 03 04 從b800:0開始的內存單元開始,依次寫入十六進制數據04 03,重復寫5次。 在debug中,使用f命令,向內存單元批量填寫數據。 -f b800:0f00 0f9f 03 04 把內存單元區間b800:0f00 ~ b800:0f9f連續160個字節,依次重復填充十六進制數據03 04。

 

 

  (這題設計的非常浪漫)

 

 

 

 

(在窗口底下出現了一排愛心)

 

任務四: 已知內存單元00201H ~ 00207H分別存放數據(如下圖所示),00220H ~ 0022fH用作棧空間。 在debug環境中,按順序錄入以下內容,單步跟蹤調試,觀察寄存器和內存空間00200H~00207H,以 及,棧空間00220 ~ 0022fH內容變化情況。記錄實驗結果。回答問題,驗證和你的理論分析結果是否一 致。

push [0] ; 執行后,寄存器(sp) = 28

push [2] ; 執行后,寄存器(sp) = 26

push [4] ; 執行后,寄存器(sp) = 24

push [6] ; 執行后,寄存器(sp) = 22

pop [6] ; 執行后,寄存器(sp) = 24

pop [4] ; 執行后,寄存器(sp) = 26

pop [2] ; 執行后,寄存器(sp) = 28

pop [0] ; 執行后,寄存器(sp) = 30

問題1:題目要求是把00220H ~ 0022fH用作棧空間。指令 mov ss, ax 和 mov sp, 30 執行后, 棧頂的邏輯地址和物理地址分別是?2fh , 0022fh

 

問題2:單步調試到匯編指令 push [6] 執行結束, pop [6] 執行之前,使用 d 20:20 2f 查看此 時棧空間數據,給出實驗截圖。

 

問題3:匯編指令 pop [0] 執行結束后, pop [0] 指令執行結束后,使用d命令 d 20:0 7 查看此 時數據空間內的數據是否有變化。給出實驗截圖。

 

 

 

問題4:如果把最后四條指令改成截圖中的順序, pop [6] 指令執行結束后,使用d命令 d 20:0 7 查看此時數據空間內的數據是否有變化。給出實驗截圖。

 

 

 

任務五:先使用f命令,把00220H ~ 0022fH區間的16個字節內存單元值全部修改為0。並使用d命令查看確認。 然后,使用a命令、r命令、t命令寫入匯編指令並單步調試。 觀察並思考: 問題1:使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?后面的指令 mov sp, 30 是什么時候執行的? 問題2:根據匯編指令,前三條指令執行后,00220H ~ 0022fH被設置為棧空間。並且,初始時,已通 過f命令將初始棧空間全部填充為0。觀察單步調試時,棧空間00220H ~ 0022fH內存單元值的變化,特 別是圖示中黃色下划線表示出的數據值。根據實驗觀察,嘗試思考和分析原因

Debug的T命令在執行修改寄存器SS的指令時,下一條指令也緊接着被執行。

 在執行mov ax,2010之前,CS,IP寄存器的值就先后被壓入了棧中

 

任務六

assume cs:code
code segment
start:
mov cx, 10
mov dl, '0'
s: mov ah, 2
int 21h
add dl, 1
loop s
mov ah, 4ch
int 21h
code ends
end start

使用masm、link,匯編、鏈接,得到可執行文件task5.exe。運行程序。結合程序運行結果,理解程序 功能。

在debug中,使用d命令,查看task5.exe的程序段前綴,觀察這256個字節的內容,驗證前兩個字節是 否是CD 20。

確實是啊

 

 

任務七:(1) 補全程序。說明這樣填寫的依據。 (2) 在debug中調試,使用g命令將程序執行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令 對0:200h開始的內存單元反匯編,確認是否把task7.asm中line3-line12的代碼復制到了目標內存空間。

首先在隨便用一個數,填個空。跑一下程序,可以看到cs=076c也就是代碼段開始的地址;然后到mov ax,4c00h之前的代碼長度是18h個字節

所以最終的代碼補全后是

assume cs:code
code segment
    mov ax, 076ch
    mov ds, ax
    mov ax, 0020h
    mov es, ax
    mov bx, 0
    mov cx, 18h
s:  mov al, [bx]
    mov es:[bx], al
    inc bx
    loop s
    mov ax, 4c00h
    int 21h
code ends
end

在用u命令查看,發現命令確實復制過去了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM