/*源代碼的地址是
http://zhidao.baidu.com/link?url=zOaOjlDZY4sjOIrX2v9JxTKmCt-cVxH2dsFX047_2QhWfFy0beWJAvMZ4XkPgdAb7uPNWLtpumnZBzpsubjHb_
下面的代碼只是其中的一段,是我想問的問題 */
int GetTickCount() { /*讀取BIOS時鐘*/
int ret;
ret = peek(0x0,0x46e); /*實際上讀取了內存0:046e處的內容*/
//問題1:在這篇源代碼中,0x46e這個地址是什麼位置,代表什麼,作者怎麼知道要讀的地址是0x46e的呢
ret <<= 8; /*這個地方是$%#$^$%&^*/
//問題2:這個地方做標注的人也沒有看懂,有沒有能給解釋一下的
ret += peek(0x0,0x46c); /*太多新的東西了,找點書看一看吧*/
//問題3:這個表達式說明的是什麼意思?
return (ret);
這段代碼應該是先從 0x46e處讀出一個字節,然後從0x46c處讀一個字節,然後拼成一個16位的數(系統時間)。
至於為什麼是這兩個特定地址,我猜原因是在dos系統中,那個地方固定地存放系統時間。下面找到的東西證明了我的猜測:
40:6C dword Daily timer counter, equal to zero at midnight;
incremented by INT 8; readt by INT 1A
40:70 byte Clock rollover flag, set when 40:6C exceeds 24hrs
這兩行是從 BIOS Data Area中找到的。注意:
40:6C 換算成線性地址是 (0x40<<16) + 6C = 0x46C
peek的參數 0x0:0x46C 換算成線性地址也是 0x46C
所以,我猜的應該沒錯,也就是說,在DOS系統中,那個位置固定地存放系統時間。
另外:從下面這段話可以看出,peek()函數源於BASIC語言,後來可能被引入C語言,並且它很老了,主流的編譯器也不支持它。我不清楚百度上為什麼有這麼多人問這個問題。
PEEK and POKE was a basic thing. There were a few old C compilers
that added PEEK and POKE intrinsics as extensions. cc65 has peek
and poke macro's in one of the header files and I believe that one of the
C compilers for Radio Shack color computer had PEEK and POKE
intrinsics
AFAIK none of the early main stream compilers supported PEEK and
POKE. I just checked The Small C Handbook by Hendrix and it
doesn't document a PEEK and POKE.