程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c語言-求用dos.h下的peek函數讀取bios時鐘的詳解(附源代碼)

c語言-求用dos.h下的peek函數讀取bios時鐘的詳解(附源代碼)

編輯:編程綜合問答
求用dos.h下的peek函數讀取bios時鐘的詳解(附源代碼)

/*源代碼的地址是
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.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved