1. 程式人生 > >《組合語言》實驗二——用機器指令和彙編指令程式設計

《組合語言》實驗二——用機器指令和彙編指令程式設計

實驗任務一:使用debug將下面的程式寫入記憶體,逐條執行,根據指令執行後的實際執行情況填空。

前提說明:為便於驗證實驗結果,對實驗任務一做了2點調整:

①在使用a命令輸入指令除錯前,使用e命令將記憶體單元0021:0~0021:7連續8個位元組資料修改為30H,31H,32H,33H,34H,35H,36H,37H。如下:

②將程式段的第一行 mov ax,ffff修改為 mov ax,0021。如下:

接下來,逐條執行語句,觀察各暫存器的變化。

根據實驗結果,得到:

實驗結果與預期基本一致,不過發現了一個奇怪的現象,在單步除錯的過程中,mov ss,ax的下一步本應是mov sp,0100,但在實際操作時發現,下一步變成了mov ax,[0],而mov sp,0100被自動執行了。通過查閱資料得知,這與CPU的中斷機制

有關,目前只需要知道debug的T命令在執行修改暫存器SS的指令時,下一條指令也緊接著被執行。

實驗任務二:輸入如下七行程式碼,分析2000:0~2000:f中的內容為什麼會改變。

用a命令輸入上述程式碼,並用e命令修改和檢視2000:0~2000:f的內容:

單步除錯,並且每步除錯後都用d命令檢視2000:0~2000:f的值:

 從中可以發現,前3行的作用是把2000:0~2000:f這段空間當作棧段,初始棧底為2000:f,初始棧頂為2000:10。一個奇怪的現象是,在2000:0~2000:f被初始化為0後,後面除了入棧操作對這段空間有修改外,其他的一些操作也對這段空間的內容作了修改,為什麼會這樣呢?注意觀察發現,那些除入棧操作對空間的修改並不是隨意的,而是把某些暫存器如cs,ip,ax的值存入了棧空間。這其中的原因與內中斷有關,t命令實際是引發了單步中斷,執行中斷例程時,CPU會將一些中斷例程使用的的暫存器變數自動壓棧到棧中,此例中就包括了上述的暫存器變數的值。