前提說明:為便於驗證實驗結果,對實驗任務一做了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的指令時,下一條指令也緊接著被執行。
用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會將一些中斷例程使用的的暫存器變數自動壓棧到棧中,此例中就包括了上述的暫存器變數的值。
實驗二 用機器指令和彙編指令程式設計
任務一 使用e命令修改0021 0至0021 f資料,修改為30h,31h,32h,33h,34h,35h,36h,37h。修改後的 要正確寫入 mov ax,0021 mov ds,ax mov ax,2200 mox ss,ax mov sp,0100 mov ax,0 ax 3130h add...
組合語言實驗二
預備知識 debug的使用 前面實驗中講了debug一些命令的用法,這裡再補充一些關於debug的知識。1 關於d命令 現在我們知道段位址是存放在暫存器中的,在d命令後面直接給出段位址,是debug提供的一種直觀的操作方式。d命令是由debug執行的,debug在執行d 1000 0這樣的命令時會先...
組合語言實驗二
datas segment 此處輸入資料段 datas ends stacks segment 此處輸入堆疊段 stacks ends codes segment assume cs codes,ds datas,ss stacks start mov ax,datas mov ds,ax 實驗二 ...