匯編語言實驗二


實驗前的一些總結:

  • 關於d命令

(1)我們可以用“d 段地址:偏移地址”的格式查看制定內存單元的內容;

(2)在處理d命令時,Debug有將段地址送入段寄存器ds的代碼,CPU在訪問內存單元時就可以從ds中得到段地址;

(3)一些例子:

-r ds
:1000
-d ds:0     ;查看從1000:0開始的內存空間中的內容
  • 在e,a,u命令中使用段寄存器

(1)一些例子:

-r ds
:1000
-e ds:0 11 22 33 44 55 66   ;在1000:0開始的內存區間寫入數據
-u cs:0   ;以匯編指令的形式,顯示當前代碼段中的代碼,0代碼的偏移地址
-r ds
:1000
-a ds:0   ;以匯編指令的形式,向從1000:0開始的內存單元中寫入指令
  • 初步認識中斷機制

    通常來說,用t命令執行一條指令后,會停止執行,但當t命令在執行修改寄存器ss的指令時,下一條指令也緊接着被執行

實驗開始:

  • 使用Debug寫入程序段,逐條執行,體會中斷機制

(1)先修改0021:0~0021:f的值,並用d命令查看是否修改成功

(2)用a命令將程序段寫入內存

(3)先理論分析程序段后填空

(4)然后用t命令逐條執行

小結:

    (1)對程序段的部分解讀:

mov ax,0021
mov ds,ax       ;對段寄存器ds的賦值操作
mov ax,2200
mov ss,ax
mov sp,0100   ;安排了2200:0~2200:00FF為棧空間,初始化了棧頂

(2)在此程序段的運行中,用t命令逐條進行時,“mov sp 0100”看起來貌似並沒有執行,但實際上在運行了“mov ss,ax”之后,ss和sp的值都改變了,所以其實“mov sp 0100”已經執行了。

  •  探究此程序段令2000:0~2000:f中的內容發生變化的原因

(1)用a命令輸入程序段,再用e命令修改2000:0~2000:f的值,用d命令查看是否修改成功

(2)然后先用r命令查看此時各寄存器的值,再用t命令逐條執行,每執行一條指令查看一次2000:0~2000:f中的值

(3)從上圖可以看到此時內存單元中還沒有變化,繼續用t命令逐條執行

(4)從上圖可以看到此時2000:0~2000:f中的值發生了變化,而且20006H對應了此時ax的值,2000AH對應了此時ip的值,2000CH對應了cs的值,繼續用t命令執行

(5)從上圖我們可以發現隨着ax和ip值的變化,此內存單元中也對應發生了變化,繼續用t執行

(6)從上圖我們看到,ip值的變化也使此內存單元對應發生了變化,由於這段空間被定義為棧空間,隨着ax中值的入棧,其他單元的數據往地址減小的方向移動了一個字數據,繼續執行

(7)隨着ax的變化,此內存單元也對應變化了,再繼續執行

(8)從上圖可以看到,隨着ax值的入棧,此內存單元的數據再次往地址減小的方向移動一個字數據

小結:

(1)沒有執行這段程序之前,ss的值為073F,sp的值為00FD,此時棧頂和棧底是ss:sp指向的地址,也就是說,初始的棧頂和棧底都是074EDH

(2)對部分程序段的解讀:

mov ax,2000
mov ss,ax
mov sp,10  ;此處意味着棧空間是從20010H的上一個地址2000FH開始的,這里實際上初始化了棧頂
;此程序段安排了2000:0~2000:F為棧空間

(3)初步分析變化的原因:我認為在2000:0~2000:F被定義為棧空間之后,為了方便執行下一條指令,所以會將ip,cs,ax的值也入棧

實驗體會:

  • 通過本次實驗,我熟悉了mov,add,push,pop等指令的用法,學會了如何去定義一個堆棧,如何初始化棧頂,對堆棧有了更深入的了解。此外我也初步了解了Debug的中斷機制。
  • 對於第二個小實驗,我上網搜索得到網友的一些見解:(目前還是未能深入理解)

(1)執行mov ss,ax 時其后邊的指令將立即被執行(這是MOV SS,**指令特點)。這也是為什么強調mov ss,ax 后邊必須跟上mov sp,10的原因。這么規定是便於控制棧段大小,防止特別是在有子程序調用時出錯。至於這兩條指令執行后靠近棧頂的10個字節中值立即有了變化,是對定義棧段部分運行環境變量進行暫存,靠近棧頂的10個字節中的暫存數據分別是SS、IP、 CS 等的值。

(2)這是由於單步中斷所導致的結果:(至於標志寄存器,cs:ip入棧后其他堆棧內容的改變是中斷處理程序執行過程中改變的)

 


免責聲明!

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



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