施紈謙
2015-12-31
最終答案
就是以下兩點。而子程序結(jié)尾處通常都要編寫一條RET指令(“返回”指令),也就是當(dāng)初被CALL指令所入棧的下一條指令的所在地址.不管怎么樣,但是其堆棧發(fā)生了一系列變化:(1)將下一條指令的所在地址(即當(dāng)時程序計數(shù)器PC的內(nèi)容)入棧,RET指令后,SP=SP-2,RET指令從棧中取出的一條數(shù)據(jù),(2)并將子程序的起始地址送入PC(于是CPU的下一條指令就會轉(zhuǎn)去執(zhí)行子程序),只需保存IP(pc值)。從上面敘述可以看出:常見的CPU的CALL指令(“調(diào)用”指令)的功能,SP總體看不會變,會壓棧保存斷點,段內(nèi)調(diào)用。因此,為了保護(hù)現(xiàn)場:從棧中取出一條數(shù)據(jù)送入PC。CALL L1調(diào)用子程序即過程調(diào)用,正常情況下,但是如果是段間調(diào)用則需要保存CS和IP那么SP=SP-4,SP=SP+2(段間調(diào)用SP=SP+4)也就是說過程調(diào)用前后從別人回答中摘的,要恢復(fù)現(xiàn)場。SP數(shù)值沒變,在執(zhí)行完RET后,CPU的下一條指令就回去執(zhí)行當(dāng)初的CALL指令的下一條了,即彈出斷點,說明L1的屬性為NEAR,RET指令的功能就是一條