# E07: bits ###### tags: `sysprog2018` :::info 主講人: [jserv](http://wiki.csie.ncku.edu.tw/User/jserv) / 課程討論區: [2018 年系統軟體課程](https://www.facebook.com/groups/system.software2018/) :mega: 返回「[進階電腦系統理論與實作](http://wiki.csie.ncku.edu.tw/sysprog/schedule)」課程進度表 ::: ## 預期目標 * 深度學習 [CS:APP](https://hackmd.io/c/S1vGugaDQ) 第 2 章和對應的補充教材 * 跨越理論與實務的鴻溝 ## 在 Ubuntu Linux x86 64-bit 安裝 32-bit 開發套件 ```shell $ sudo apt update $ sudo apt install libc6-dev:i386 gcc:i386 ``` ## 詳細閱讀 CMU CS:APP Data Lab 要求 * [Data Lab: Manipulating Bits](http://csapp.cs.cmu.edu/3e/datalab.pdf) - 忽略 `2 Logistics`, `datalab-handout.tar`, `dlc`, `driver.pl`, 和 `8 The "Beat the Prof" Contest` 相關內容 - 專注於修改 `bits.c` 即可 * 取得成功大學修改過的版本 [datalab](https://github.com/sysprog21/datalab) ```shell $ git clone https://github.com/sysprog21/datalab $ cd datalab $ make check ``` * 參考輸出: (一開始什麼事都沒做,當然零分) ``` ERROR: Test twosComp2SignMag(-2147483647[0x80000001]) failed... ...Gives 42[0x2a]. Should be -1[0xffffffff] ERROR: Test upperBits(0[0x0]) failed... ...Gives 42[0x2a]. Should be 0[0x0] Total points: 0/228 ``` ## 作業要求 * 自 GitHub 上 fork [datalab](https://github.com/sysprog21/datalab),依據 [Data Lab: Manipulating Bits](http://csapp.cs.cmu.edu/3e/datalab.pdf),補完欠缺的程式碼,並且通過自動測試 * 確保儘可能少的指令,可用 `$ gcc -S bits.c` 輸出組合語言並觀察 `bits.s` 的程式碼裡頭的 x86 (IA32) 指令 * 避免用分支 (branch),設計時間複雜度為 $O(1)$ 的實作 * 選出其中 7 個位元操作的函式,詳細解釋其原理,需要比照 [clz 應用](https://hackmd.io/s/Bk-uxCYxz) 和 [bit-reverse](https://hackmd.io/s/ByzoiggIb) 的分析方式,==舉出真實世界中的應用案例== (最好在 GitHub 找出程式碼),解說應搭配有效的測試程式碼 * 探討讓 [datalab](https://github.com/sysprog21/datalab) 得以 64-bit friendly 的提案,並舉出實際程式碼修改 ## 繳交方式 * 編輯 [Homework 5 作業區共筆](https://hackmd.io/s/S1CRTc8jX),將你的觀察、上述要求的解說、應用場合探討,以及各式效能改善過程,善用 gnuplot 製圖,紀錄於新建立的共筆 ## 截止日期 * Oct 31, 2018 (含) 之前進行,不該截止日前一天才動手 * 越早在 GitHub 上有動態、越早接受 code review,評分越高 ## 參考資訊 * [深入理解計算機系統(CS:APP) - Data Lab 詳解](https://www.viseator.com/2017/06/18/CS_APP_DataLab/) * [CSAPP:datalab](https://www.jianshu.com/p/caf552ea3322)