實驗結論
(1)書上任務1的填空:
首先,使用 e 命令將記憶體單元 0021:0 ~0021:7 連續 8 個位元組資料修改為 30h, 31h, 32h, 33h,34h,35h,36h,37h
然後用a命令輸入程式段
然後蠢蠢的我檢查了一下cs和ip的值,結果發現就是該程式段的起始位址,emmmm……好吧,貌似程式段的起始位址就是當前cs和ip的指向(忘卻了=。=)
然後使用t命令單步執行我們的程式段
(小端法,所以實際存放的為6462h和6c6ah)
經檢驗,實驗結果和之前填空的結果一致,perfect!
(2)用a命令輸入程式段,然後用e命令修改從2000:0開始的16個記憶體單元的值,再使用d命令檢視修改結果,然後用r命令檢視各暫存器的初始值
然後我們用t命令進行單步執行,並且每執行完一步就使用d命令檢視一次2000:0~2000:f的值
前三行的彙編指令的功能分別為:將2000h送入ax暫存器;將ax的值送入ss棧段位址暫存器;將10h送入sp棧偏移位址暫存器。ss:sp指向棧頂,即初始棧頂為2000:10,棧底為初始棧頂-2即2000:e。
可以發現,在執行完ss,ax後,2000:0~2000:f內的值發生了變化,且下一步執行的**變成了ax,3123,但是sp的值變成了10,說明sp,10悄悄地被執行了。繼續觀察我們可以發現2000:a的值變成了ip的值,2000:c中的值變成了cs的值(雖然也和ds和es的值相同,但結合我目前的知識,認為cs和ip是相匹配的,姑且認為是cs的值),2000:6的值變成了ax的值(後面將ax的值變為了3123後2000:6的值也變成了3123所以我認為這裡的值即是ax的值)。也就是說,ax,cs,ip的值,在該棧中都有儲存,這樣做的目的是什麼,根據我目前掌握的知識還不得而知,還需要進行進一步的學習才能知曉。我上網查詢了資料「 為什麼,在講內中斷這章時,你就明白了。t命令實際是引發了單步中斷,執行中斷例程時,cpu會將一些中斷例程使用的的暫存器變數自動壓棧到棧中,此例中就包括了上述的暫存器變數的值。」
執行完push,ax後可以看到,ax中的值即3123入棧,此時棧頂和棧底相同為2000:e,因為有資料入棧,可以看到,前面的資料被往前「頂」了兩個單元,然後3366入棧,前面的資料又被向前「頂」了兩個單元,顯然這兩個入棧操作後,ss:sp都正確指向了棧頂。
執行完畢
總結與體會
了解了棧的機制,對於資料的入棧和出棧有了一定的實踐上的認識,初步認識和了解了ss和sp暫存器,但是對於棧的基本操作中的一些細節還不是很明了,比如中斷啥的,還需要通過進一步的學習來了解
實驗報告 2
編寫基於物件的程式。資料成員包括長寬高,體積,要求用成員函式實現下面的功能 1 由鍵盤輸入3個長方柱的長 length 寬 width 高 high 2 計算長方柱的體積 volume 和表面積 areas 3 輸入這3個長方柱的體積和表面積。html view plain copy print?i...
實驗報告2
1 用floyd演算法求解下圖各個頂點的最短距離。寫出floyd演算法的偽 和給出距離矩陣 頂點之間的最短距離矩陣 2 對於下圖使用dijkstra演算法求由頂點a到頂點h的最短路徑。1 用d v w 記錄每一對頂點的最短距離。依次掃瞄每乙個點,並以其為基點再遍歷所有每一對頂點d的值,看看是否可用過...
實驗五實驗報告
系統架構圖 首先我在我的電腦裡建立了有名稱要求的資料夾,然後開啟android studio clone了我們的小組專案。此處因為已經clone過了,所以無法再把這個專案clone進去 進行編譯,執行,測試均正常 我在遊戲主介面載入了乙個toast,點選可以短暫地顯示我的學號資訊 首先在封面檔案裡我...