
分析一個(gè)奇怪的程序
1. 分析下面的程序,在運(yùn)行前思考:這個(gè)程序可以正確返回嗎?
在程序運(yùn)行前,我個(gè)人的思考結(jié)果是不會(huì)返回,好像進(jìn)入了死循環(huán)(說(shuō)明我在看第九章的時(shí)候不仔細(xì)(─.─||))
2. 運(yùn)行后再思考:為什么是這種結(jié)果?
先說(shuō)結(jié)論:運(yùn)行后,程序可以正確返回
代碼講解:
mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
- 以上代碼的作用就是將 “標(biāo)號(hào)s2” 處的數(shù)據(jù)(即機(jī)器指令) 復(fù)制到 “標(biāo)號(hào)s” 處
- 從下圖可以看出,“標(biāo)號(hào)s2” 處的機(jī)器指令為 EBF6,因此當(dāng)上面的那幾句代碼執(zhí)行完后,“標(biāo)號(hào)s” 處的機(jī)器指令為 EBF6
- 因?yàn)椤皹?biāo)號(hào)s2”處的匯編指令為 jmp short s,所以這是一個(gè) “依據(jù)位移進(jìn)行轉(zhuǎn)移的 jmp 指令”,所對(duì)應(yīng)的機(jī)器碼中包含的是轉(zhuǎn)移的位移,并不是轉(zhuǎn)移的目的地址
- 不要因?yàn)椤皹?biāo)號(hào)s2”處的匯編指令為 jmp short s,就想當(dāng)然的認(rèn)為將 jmp short s 復(fù)制到了 “標(biāo)號(hào)s” 處,這種想法是錯(cuò)誤的
- 可以看到下圖是在調(diào)試的時(shí)候用 debug 去調(diào)試的,展示“機(jī)器指令”和“匯編指令”是用 U 命令去轉(zhuǎn)換的,本質(zhì)上計(jì)算機(jī)只能存儲(chǔ)二進(jìn)制數(shù)據(jù),所以操作的也是二進(jìn)制數(shù)據(jù),即 CPU 操作的是二進(jìn)制數(shù)據(jù) EBF6
- CPU 在執(zhí)行 EBF6 的時(shí)候,根據(jù)什么修改的 IP寄存器?使其指向目標(biāo)指令呢?就是根據(jù)指令中的 F6 (提示:F6 是補(bǔ)碼),即 CPU 執(zhí)行 EBF6 時(shí),當(dāng)前的 (IP) 加上 F6,就得出了新的 (IP),也就完成了新的指向
6.1 標(biāo)號(hào)s2 處匯編指令的講解
實(shí)驗(yàn)8 標(biāo)號(hào)s2 處匯編指令的講解6.2 標(biāo)號(hào)s 處匯編指令的講解
實(shí)驗(yàn)8 標(biāo)號(hào)s 處匯編指令的講解- 6.3 如果對(duì)于代碼還有疑問(wèn),請(qǐng)看 《匯編語(yǔ)言 (第3版)》王爽著,第 179 頁(yè),關(guān)于 CPU 執(zhí)行機(jī)器指令時(shí),是如何修改 IP 寄存器的。

實(shí)驗(yàn)8 調(diào)試過(guò)程

