匯編語言 實驗1


實驗結論


實驗任務1

  • 完成

實驗任務2

  • PC主板上的ROM中有個一出產日期,在內存FFF00H-FFFFFH的某幾個單元中,使用d命令d fff0:0 ff可以查看(當然只要段地址*16+指針偏移地址==FFF00H-FFFFFH都行)。得到結果如圖所示。該生產日期為dos虛擬的生產日期,1992年1月1日。

  • 嘗試修改ROM內存單元的內容后

    發現修改不成功。

原因:
C0000-FFFFF地址空間屬於8086CPU的ROM空間,而題目所給的FFF00H-FFFFFH位於C0000-FFFFF,故無法修改。(8086CPU的RAM地址空間為00000H-9FFFFH)

實驗任務3

執行-e b800:0 03 04 03 04 03 04 03 04 03 04后,結果如下:

執行-f b800:0f00 0f9f 03 04后,結果如下:

執行-e b800:0f00 00 00 00 00 00 00 00 00 00 00嘗試修改前10個內存單元后:

內存地址為:

實驗任務4

  • 填空
-a
mov ax, 20
mov ds, ax
mov ss, ax
mov sp, 30
push [0] ; 執行后,寄存器(sp) = 002E
push [2]   ; 執行后,寄存器(sp) = 002C
push [4]   ; 執行后,寄存器(sp) = 002A
push [6]   ; 執行后,寄存器(sp) = 0028
pop [6]   ; 執行后,寄存器(sp) = 002A
pop [4]   ; 執行后,寄存器(sp) = 002C
pop [2]   ; 執行后,寄存器(sp) = 002E
pop [0]   ; 執行后,寄存器(sp) = 0030

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

1. 邏輯地址為:SS:SP=20:30;物理地址為:00230H

問題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
查看此時數據空間內的數據是否有變化。給出實驗截圖。


數據發生變化

實驗任務5

問題1:使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?后面的指令 mov
sp, 30 是什么時候執行的?

不是。在執行完mov ss,ax后緊接着執行了mov sp,30,這兩步相當於初始化棧。

問題2:根據匯編指令,前三條指令執行后,00220H ~ 0022fH被設置為棧空間。並且,初始時,已通
過f命令將初始棧空間全部填充為0。觀察單步調試時,棧空間00220H ~ 0022fH內存單元值的變化,特
別是圖示中黃色下划線表示出的數據值。根據實驗觀察,嘗試思考和分析原因。

原因:t指令引發了中斷,中斷過程使用當前棧空間存放cpu關鍵數據;圖中黃色下划線表示的數據是下一步指令所在內存地址。

實驗任務6

  • 程序源代碼
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中查看task6.exe的程序段前綴PSP的截圖:

實驗任務7

  • 給出補全后的完整源碼。說明程序中兩個空填寫的依據。
assume cs:code
code segment
  mov ax, cs     
  mov ds, ax
  mov ax, 0020h
  mov es, ax
  mov bx, 0
  mov cx, 17H    
s: mov al, [bx]
  mov es:[bx], al
  inc bx
  loop s
  mov ax, 4c00h
  int 21h

code ends
end
  1. 第一個空cs代碼實現自復制,所以要將cs中存貯的代碼開始的段地址通過寄存器ax賦值給ds
  2. 第二個空17H,cx的值為程序返回時的偏移地址,int 21h2個字節, mov ax,4c00h3個字節,則前面部分代碼段占17H個字節

  • 在debug中調試,使用g命令將程序執行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命
    令對0:200開始的內存單元反匯編,確認是否把task7.asm中line3-line12的代碼復制到了目標內存
    空間。給出使用g命令運行到指定點和使用u命令反匯編0:200到復制代碼長度這一段內存空間的截圖。

實驗總結

  1. 物理地址=段地址 * 16 + 偏移地址

  2. 棧的存儲方式為先進先出,使用push命令時,首先減少sp的值然后將數據放入棧中,使用pop命令時,先取出數據,然后sp增加。

  3. 在debug調試中,使用t命令單步跟蹤時,ip會先自減2,下一步再執行cs:ip指向的命令


免責聲明!

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



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