分析一個奇怪的程序
1. 分析下面的程序馏慨,在運行前思考:這個程序可以正確返回嗎?
在程序運行前姑隅,我個人的思考結(jié)果是不會返回写隶,好像進入了死循環(huán)(說明我在看第九章的時候不仔細(─.─||))
2. 運行后再思考:為什么是這種結(jié)果?
先說結(jié)論:運行后讲仰,程序可以正確返回
代碼講解:
mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
- 以上代碼的作用就是將 “標號s2” 處的數(shù)據(jù)(即機器指令) 復制到 “標號s” 處
- 從下圖可以看出慕趴,“標號s2” 處的機器指令為 EBF6,因此當上面的那幾句代碼執(zhí)行完后鄙陡,“標號s” 處的機器指令為 EBF6
- 因為“標號s2”處的匯編指令為 jmp short s冕房,所以這是一個 “依據(jù)位移進行轉(zhuǎn)移的 jmp 指令”,所對應的機器碼中包含的是轉(zhuǎn)移的位移趁矾,并不是轉(zhuǎn)移的目的地址
- 不要因為“標號s2”處的匯編指令為 jmp short s耙册,就想當然的認為將 jmp short s 復制到了 “標號s” 處,這種想法是錯誤的
- 可以看到下圖是在調(diào)試的時候用 debug 去調(diào)試的愈魏,展示“機器指令”和“匯編指令”是用 U 命令去轉(zhuǎn)換的觅玻,本質(zhì)上計算機只能存儲二進制數(shù)據(jù),所以操作的也是二進制數(shù)據(jù)培漏,即 CPU 操作的是二進制數(shù)據(jù) EBF6
- CPU 在執(zhí)行 EBF6 的時候溪厘,根據(jù)什么修改的 IP寄存器?使其指向目標指令呢牌柄?就是根據(jù)指令中的 F6 (提示:F6 是補碼)畸悬,即 CPU 執(zhí)行 EBF6 時,當前的 (IP) 加上 F6珊佣,就得出了新的 (IP)蹋宦,也就完成了新的指向
6.1 標號s2 處匯編指令的講解
實驗8 標號s2 處匯編指令的講解6.2 標號s 處匯編指令的講解
實驗8 標號s 處匯編指令的講解- 6.3 如果對于代碼還有疑問,請看 《匯編語言 (第3版)》王爽著咒锻,第 179 頁冷冗,關(guān)于 CPU 執(zhí)行機器指令時,是如何修改 IP 寄存器的惑艇。
實驗8 調(diào)試過程