1. 程式人生 > 其它 >組合語言第一次實驗

組合語言第一次實驗

實驗任務2

8086CPU的C0000~FFFFF 地址空間為只讀儲存器,無法被修改。

實驗任務3

使用e命令,向記憶體單元填寫資料:
-e b800:0 03 04 03 04 03 04 03 04 03 04
使用f命令,向記憶體單元批量填寫資料:
-f b800:0f00 0f9f 03 04 

實驗任務4

填空:

 1 -a
 2 mov ax, 20
 3 mov ds, ax
 4 mov ss, ax
 5 mov sp, 30
 6 push [0] ; 執行後,暫存器(sp) = 002EH
 7 push [2] ; 執行後,暫存器(sp) = 002CH
 8 push [4] ; 執行後,暫存器(sp) = 002AH
9 push [6] ; 執行後,暫存器(sp) = 0028H 10 pop [6] ; 執行後,暫存器(sp) = 002AH 11 pop [4] ; 執行後,暫存器(sp) = 002CH 12 pop [2] ; 執行後,暫存器(sp) = 002EH 13 pop [0] ; 執行後,暫存器(sp) = 0030H

問題1:棧頂的邏輯地址為20:30,實體地址為0230H

問題2:

問題3:

問題4:

實驗任務5

問題1:單步執行mov ss,ax後並沒有暫停。由於此指令修改了段暫存器,之後的一條指令mov sp,30也緊隨著執行了。

問題2:實際棧空間的使用並非簡單的依次壓入資料。並且進行某些操作後,棧中會存放當前指令的段地址和偏移地址。

實驗任務6

實驗原始碼:

彙編及連結:

執行結果:

檢視程式段字首:

驗證得程式段字首前兩個位元組是CD 20。且程式段字首中儲存了程式名。

實驗任務7

 1 assume cs:code
 2 code segment
 3     mov ax, cs
 4     mov ds, ax
 5     mov ax, 0020h
 6     mov es, ax
 7     mov bx, 0
 8     mov cx, 23
 9 s: mov al, [bx]
10     mov es:[bx], al
11     inc bx
12     loop s
13 
14     mov
ax, 4c00h 15 int 21h 16 code ends 17 end

程式將要完成的功能是複製部分自身程式碼至記憶體0:200開始的連續記憶體單元。程式碼實現的功能是將記憶體單元ds:[bx]處開始的資料複製至記憶體單元es:[bx]處。因此第一空填cs,將程式段首地址資訊送入段暫存器ds中;第二空的數字即複製位元組的迴圈次數,使用debug除錯程式知被複制程式碼的長度為23位元組,因此填23。

用g命令執行部分程式碼和使用u命令反彙編0:200處記憶體空間資料:

發現程式確實被複制到了0:200處的記憶體空間。