組合語言第一次實驗
阿新 • • 發佈:2021-10-22
實驗任務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) = 002AH9 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 movax, 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處的記憶體空間。