在C 語言中,表達式是最重要的組成部分之一,幾乎
所有的代碼都由表達式構成。表達式的使用如此廣泛,讀
者也許會產生這樣的疑問,像+ 、- 、3 、/ 、& & 這樣簡單
的運算也會出現問題嗎? 程序員在編寫表達式時,往往帶
有一些不良的習慣。即使是編寫很簡單的表達式,這些不
良習慣也可能造成隱患,這個小小的隱患甚至可能引起整
個系統的崩潰。實際上,在程序調試過程中,表達式中存
在的大部分隱患皆來源于程序員的主觀臆測,即認為表達
式應該是按自己認為的方式執行,但結果可能完全相反。
這是因為程序設計語言或編譯器的某些內在機制并不如
我們所想的那樣。所有的編譯器都遵從這一假定:程序員
都是“神”,他們既了解編程語言的各種特性,也了解編譯
器本身一些鮮為人知的處理原則。當然, 程序員不是
“神”。因此,程序員在編寫程序的過程中需要小心地避免
編譯器“設置”的各種陷阱,而問題是有些時候很難預測下
一步是否會踏上一個陷阱
標簽:
表達式
語言
分
代碼
上傳時間:
2015-09-08
上傳用戶:jennyzai
該程序模擬UNIX中save與resume函數,并介紹在VC中如何使用匯編進行機器級的操作.
主函數很簡單首先引入兩個外部函數,extern "C"表示按傳統C命名習慣.函數save將程序指針保存在(*s)中并返回0,為什么有
if(save(&sp)){...}
if后的語句看起來永遠都不會被執行,但是運行結果表明它被執行了.這個問題同UNIX中處理機調度函數(switch)的那個if語句(第一句)一樣.
程序執行完save(&sp)后得到因為條件為假而執行else語句,卻在判斷之前將程序指針保存在sp中了.
else語句中的resume(&sp),該函數很狡猾將堆棧中的返回地址改變了,改到了sp所指出,即將程序指針改到了執行條件判斷前.resume返回1,條件滿足,執行if語句.
save函數堆棧:
eip ebp+8
s ebp+4
ebp ebp+0
resume函數堆棧與save的相同.
新建一個win32的工程,將unixc.cpp和unix.obj加入過程即可.
unix.obj是用masm6.11生成的:ml /c /coff unix.asm,生成coff格式的obj而不是omf格式.
標簽:
save
resume
extern
函數
上傳時間:
2015-09-10
上傳用戶:變形金剛