該程序模擬UNIX中save與resume函數(shù),并介紹在VC中如何使用匯編進(jìn)行機(jī)器級(jí)的操作.
主函數(shù)很簡(jiǎn)單首先引入兩個(gè)外部函數(shù),extern "C"表示按傳統(tǒng)C命名習(xí)慣.函數(shù)save將程序指針保存在(*s)中并返回0,為什么有
if(save(&sp)){...}
if后的語(yǔ)句看起來永遠(yuǎn)都不會(huì)被執(zhí)行,但是運(yùn)行結(jié)果表明它被執(zhí)行了.這個(gè)問題同UNIX中處理機(jī)調(diào)度函數(shù)(switch)的那個(gè)if語(yǔ)句(第一句)一樣.
程序執(zhí)行完save(&sp)后得到因?yàn)闂l件為假而執(zhí)行else語(yǔ)句,卻在判斷之前將程序指針保存在sp中了.
else語(yǔ)句中的resume(&sp),該函數(shù)很狡猾將堆棧中的返回地址改變了,改到了sp所指出,即將程序指針改到了執(zhí)行條件判斷前.resume返回1,條件滿足,執(zhí)行if語(yǔ)句.
save函數(shù)堆棧:
eip ebp+8
s ebp+4
ebp ebp+0
resume函數(shù)堆棧與save的相同.
新建一個(gè)win32的工程,將unixc.cpp和unix.obj加入過程即可.
unix.obj是用masm6.11生成的:ml /c /coff unix.asm,生成coff格式的obj而不是omf格式.
標(biāo)簽:
save
resume
extern
函數(shù)
上傳時(shí)間:
2015-09-10
上傳用戶:變形金剛