第九章實驗8

2021-05-03 21:55:42 字數 609 閱讀 6818

題目:分析下面的程式,在執行前思考:這個程式可以返回嗎?執行後分析:為什麼會是這個結果?

解答:這個程式實在是讓我頭疼了一天,百思不得其解,8~11行**是把jmp short s1這條指令複製到s處的兩個nop處,這裡我是知道的。但是問題就是出在這裡,我老是認為當程式執行到s0:jmp short s後,當他跳轉到s處時,他就應該要執行跳轉到s1處。但是這樣的話肯定不對的,上論壇轉了一圈,還是沒看出大概,還是稀里糊塗的。後來終於知道:這個程式的關鍵還是在複製jmp short s1這條指令這裡 。因為指令有其對應的機器碼,通過除錯程式可以知道jmp short s1它的機器碼是eb f6h(是用補碼表示的,換算後就是-10。至於為什麼偏移量是10?請先看下面的機器碼:

實際上是這樣的:偏移量是從s2:jmp short s1這條指令後的nop指令處即0b85:0022到s1:mov ax,0000處即0b85:0018,兩者之間的差值就是10,所以偏移量就是10了),其實是把ebf6複製到了s的兩個nop處(剛好兩個位元組)。所以當程式執行到s0:jmp short s跳轉到s處後,他只是把ip的值減去了10,而mov ax,4c00h到原來的兩個nop處剛好是10,所以程式就賺到了mov ax,4c00h處執行,然後程式正常返回。

除錯過程:

第九章實驗

實驗目的和要求 1 掌握格式化的輸入輸出方法。2 熟悉系統提供的輸入操作函式。3 掌握磁碟檔案的輸入輸出方法。實驗內容 1 程式sy9 1.cpp用以列印表中的資料,但程式中存在邏輯錯誤。上機除錯後寫出正確的 include includeusing namespace std int main c...

第九章實驗

一 實驗目的和要求 1.掌握格式化的輸入輸出方法。2.熟悉系統提供的輸入操作函式。3.掌握磁碟檔案的輸入輸出方法。二 實驗內容 1.程式sy9 1.cpp用以列印表中的資料,但程式中存在邏輯錯誤。上機除錯後寫出正確的 cpp view plain copy include include using...

第九章 實驗

實驗目的和要求 1 掌握格式化的輸入輸出方法。2 熟悉系統提供的輸入操作函式。3 掌握磁碟檔案的輸入輸出方法。實驗內容 1 程式sy9 1.cpp用以列印表中的資料,但程式中存在邏輯錯誤。上機除錯後寫出正確的 include include using namespace std int main ...