第45节
憶體中的載入情況。

    門又被敲響了,節奏急促。

    陸沉儲存好進度,起身開門。

    門口站著三個人:一臉苦相的孫鵬,眉頭緊鎖的陳浩,還有抱著本厚厚《數學物理方法》的劉宇。

    “沉子,江湖救急!”孫鵬率先擠進來,指著外間一臺中華學習機,“我的坦克大戰,好不容易改了引數,坦克跑得飛快,可一開火就宕機!肯定是哪個資料溢位搞崩了!”

    陳浩則遞過來一張手繪的草圖,上面畫著8086 CPU的方塊圖,用箭頭標註著資料流,旁邊寫著密密麻麻的問題:“你上次說AX、BX這些暫存器像齒輪箱裡的不同齒輪,負責傳遞不同力道的的資料。那如果同時有多個力道要處理,CPU怎麼知道先轉哪個齒輪?還有這個時鐘週期,是不是就像柴油機的曲軸轉一圈,完成一個動作?”

    劉宇沒說話,只是把手裡那本《數學物理方法》翻到某一頁,指著上面一個用級數展開近似計算積分的公式,又指了指裡間那臺蘋果II:“我在想,如果要用計算機數值求解這個積分,是不是得把這個連續過程離散化?離散的步長怎麼取,才能在精度和計算量之間取得平衡?我用BASIC寫了個迴圈試算,但結果不太對,感覺是舍入誤差累積了。”

    陸沉看著眼前三位同學,一個遊戲崩潰,一個刨根問底鑽研硬體原理,一個試圖用計算機解決高階數學問題。

    他忽然覺得這場面有點熟悉,彷彿回到了前世的實驗室,同事們拿著各自的問題來找他討論。

    “一個個來。”陸沉把門完全開啟,讓三人進來。

    裡間空間不大,一下子顯得有點擁擠。

    他先走到孫鵬的機器前。

    孫鵬的坦克大戰是他用BASIC模仿的,圖形極其簡陋,用字元表示坦克和牆壁。

    陸沉調出原始碼,快速瀏覽。

    “你這裡,”陸沉指著一行程式碼,“BULLETX = TANKX + DIRX * 3,子彈初始位置用坦克座標加上方向向量乘以3。你想讓子彈發射位置靠前一點,想法沒錯。但你沒檢查TANKX + DIRX*3會不會超過螢幕邊界。當坦克貼邊時,這個計算值可能為負或超過最大值,導致陣列越界,訪問了不該訪問的記憶體地址,程式就崩了。”

    “邊界檢查……”孫鵬恍然大悟,“我光想著讓坦克跑得快,忘了子彈出生點也可能出界!那怎麼辦?每發一顆子彈都判斷一下?”

    “加個IF語句判斷計算後的座標是否在有效範圍內,如果非法,就修正到邊界值,或者乾脆不允許發射。”陸沉說著,接過鍵盤,快速加了四行條件判斷。

    執行,坦克貼邊開火,子彈穩穩出現在邊界處,不再宕機。

    “神了!”孫鵬一拍大腿,“就這麼簡單?我怎麼就沒想到!”

    “經驗問題。多寫多崩幾次,就有感覺了。”陸沉笑了笑。

    這確實是經驗,前世除錯程式時,邊界條件是最容易出錯的角落之一。

    接著是陳浩。

    陸沉拿過他那張手繪的CPU圖,看了幾眼,發現陳浩的理解已經相當深入,甚至畫出了簡單的資料通路。

    “你的比喻很對,時鐘週期就像曲軸轉一圈,指揮所有齒輪(暫存器、咚闫鳎┩絼幼饕淮巍5獵PU內部不是隻有一個曲軸,它有多級流水線,可以像工廠的流水線一樣,同時處理多條指令的不同階段。”陸沉儘量用陳浩能懂的比喻,“比如第一條指令在取齒輪(取指),第二條指令就可以同時在轉齒輪(譯碼),第三條在咬合齒輪(執行)。這樣總的效率就高了。至於哪個力道優先,由控制器根據指令本身的依賴關係和流水線狀態動態排程,有點像碼頭排程員指揮不同貨船裝卸,要避免擁堵和衝突。”

    為了讓陳浩更直觀地理解流水線,陸沉乾脆在草稿紙上畫了一條簡易的、分為取指-譯碼-執行-訪存-寫回五個階段的流水線圖,用箭頭表示指令流動,並標出可能發生的資料衝突(比如下條指令需要上條指令的結果,但結果還沒寫回)和控制衝突(遇到跳轉指令)。

    這些都是計算機體系結構課程的內容,但他用齒輪卡殼、傳送帶改道這樣接地氣的說法解釋,陳浩聽得眼睛發亮,連連點頭。

    “我好像有點明白了!就是說,CPU不是傻乎乎地幹完一件事再幹下一件,而是像……像幾個老師同時批改不同班級的卷子,雖然每個老師只負責一道題,但整體批改速度飛快!”陳浩興奮地總結。

    “這個比喻好。”陸沉讚道。

    第四十九章:故障

    陳浩的硬體理解力確實不錯。

    最後是劉宇的數學問題。

    陸沉看了看那個積分公式和被積函式,是一個振盪衰減的函式。

    劉宇用BASIC寫了一個矩形法求積分的程式,但結果誤差很大。

    “你的思路是對的,

本章未完,请点击下一页继续阅读>>