看板 NCTU-Teacher 關於我們 聯絡資訊
※ [本文轉錄自 neoneon 信箱] 作者: neon.bbs@bbs.cs.nctu.edu.tw ("愛宕有機奈米負離子貓") 標題: [心得] 陳永昇 - 組合語言與系統程式 時間: Sun Jul 10 09:31:09 2016 作者: shaform (回不去的旅程) 看板: NCTU-Teacher 標題: [心得] 陳永昇 - 組合語言與系統程式 時間: 2011/07/23 Sat 06:52:59 網誌好讀版: http://wp.me/sJ4X-assembly ----------------------------------------------- ⊕課名⊕ 組合語言與系統程式 ▲教授▲ 陳永昇 ★修課年度★(請加註開課單位 如:大三通識、XX系選修、XX所) 99下 資工系 £教了什麼£(課程大概內容。或是額外學會了什麼東西。) 組合語言的部份使用的是 《Assembly Language for x86 Processors》, 6th http://kipirvine.com/asm/ 教了以下章節 1. Basic Concepts 2. x86 Processor Architecture 3. Assembly Language Fundamentals 4. Data Transfers, Addressing, and Arithmetic 5. Procedures 6. Conditional Processing 7. Integer Arithmetic 8. Advanced Procedures 9. Strings and Arrays 10. Structures and Macros 13. High-Level Language Interface 14. 16-Bit MS-DOS Programming 17. Expert MS-DOS Programming Table of Contents: http://goo.gl/td857 系統程式的部份使用的是 《System Software: An Introduction to Systems Programming》, 3rd 教了以下章節 1. Background 2. Assemblers 3. Loaders and Linkers 8. Software Engineering Issues Table of Contents: http://goo.gl/UDVmu 額外有出了一份寫 DOS 病毒的作業,可以學習一些感染 EXE 檔的技巧。 本門課的組語主要是用 MASM 組譯器的格式,同時也會運用到教科書中的諸多 routines 由於老師並不會特別教導組譯環境的設置,同學需自行閱讀教科書及作者網站 一種環境設置的方法和其他一些跟這門課相關的議題: 〈組合語言與系統程式〉 http://wp.me/s1t0PL-asm ◆上課方式◆(投影片、團體討論、老師教學風格) 使用投影片上課,大抵上上課氣氛很自由,不會有什麼壓力。 這門課的配分是這樣的: 60% 4次組語作業 25% SIC/XE 組繹器(可用任意語言寫) 15% 期末考 沒有期中考, 此外,有一個期中組語上機考,是考較為簡單組語程式題目, 也可攜帶參考資料和作業原始碼,但若未通過則4次組語作業不能算分。 由配分可見它是以實作為主的課程,本文也以介紹作業為主, 老師上課情形期待其他心得分享。 每份作業都需 demo(包含期末 project 在暑假 demo) 是在 demo 時從 E3 上下載之前上傳的程式碼, 由於並不會事先公佈所有的測資,所以要細心一點。 組語作業如果有多做功能可以主動向助教提出,可以得到不等的額外加分。 另外,事後會公佈全班的 code 供大家學習參考。 上到最後一堂課時會有一張特別的投影片, 師:「永生難忘」 ▼考試作業▼ 作業通常會在上課公佈,晚一點則會公佈在 E3,死限通常在星期日的夜晚。 第一個作業是三個組語小程式: (1) 輸入兩個32-bit正整數,輸出其最小公倍數。 (2) 輸入一個日期,輸出那天星期幾。 (3) 輸入一個正整數,輸出所有比它小的質數。 第二個作業 用組語寫一個 finite-state machine 可以解析一行輸入的組合語言 (MASM 格式),如: Input=> L1: sub ecx, var ; substract ecx by var Result=> LABEL L1 INSTRUCTION sub REGISTER ecx IDENTIFIER var COMMENT substract ecx by var 如果有錯誤輸入,該錯誤 token 輸出 unknown 但其後的正確 token 仍需正確辨識 不需判斷 grammar 錯誤,如 mul 應該只能接受一個 operand: Input=> mul eax, 5 Result=> INSTRUCTION mul REGISTER eax INTEGER 5 #禁止使用 .IF .WHILE 等 directives 第三個作業 寫一個計算機,可以計算輸入運算式結果: 支援 + - * / ( ) 如 2+4-6*2 = -6 輸入運算式最長為100字,數字長度最長也是100位 (需使用大數運算) ref. http://goo.gl/H3BH9 第四個作業是 16-bit DOS programming (1) 寫一個 TSR 鋼琴程式,鍵盤需可正常輸入, 但按下按鍵會發出聲音。 (2) bonus(這題本來不是 bonus,後來更改評分) 寫一個 TSR 病毒程式,執行後會常駐於系統中, 在你開啟另一個 exe 檔時感染該執行檔,使其執行被插入的程式碼 (如列印一行字)但仍保持原有的功能。 期末 Project,期限在期末考後的一個星期後。 如《System Software: An Introduction to Systems Programming》一書的格式 撰寫一個 SIC/XE 組譯器可以產生 relocatable object program 60% 支援所有 addressing modes, 教到的 assembler directives, 以及以下除外的指令 浮點數運算、SW register 相關指令,SIO, TIO, HIO,LPS, STI, SVC,SSK 40% Literals Symbol-defining statements Expressions Program Blocks and Control Sections ref. http://goo.gl/fFIMW 上機考有三題: (1) 印出 Pascal's triangle (ref. http://goo.gl/ffPA ) (2) 給一個長度4字串,輸出任一重排後字串 (3) 給兩個最多40位(?)的二進位數字,輸出相減後結果。 # 若轉換為正常表示法長度最多用兩個 32-bit DWORD 即可儲存,再用 sbb 計算 # 或者可用類似大數運算的變體) 不需全部解出也算通過。 期末考的題目主要配分是系統程式占的較重,所以不要只看組語的部份。 仔細觀察可以發現,題目大多為課本習題, 特別是系統程式的部份。 這次的組語大多為選擇題,系統程式相對較難。 老師會給考古題,不過有重疊的題數大概只有一兩題。 ¥其他¥(是否注重出席率or嚴禁遲到?需要的基礎?) 不點名,但是有來上課的話可以提早得知作業。 作業投影片通常在宣佈後一星期放上E3。 此外,死限延期或其他特殊事項也是只有在上課時公佈, 或者在上課時提早公佈。 分數方面,根據前人的經驗,只要作業都滿分, 就算期末考六十幾分也能得到99,有付出就有收穫。 ¢最後想說的話¢ 想要預習或自修的話,《Assembly Language for x86 Processors》這本書每章背後 都有程式練習題,筆者做過幾章,覺得挺有幫助, 感覺跟程式語言有關的課練習都是十分重要。 組語的教學也可以參考 小木偶的網頁 http://goo.gl/4XYfq 系統程式部份可以邊寫組譯器邊看,這樣會有更深的理解。 自己修這門課花了很多心思在作業上,不知不覺就會忘了讀系統程式。 這門課的系統程式部份實際上佔分滿多的。 另外,沒有期中考確實讓期中的壓力減輕不少。 對筆者而言,組譯器的撰寫顯得有些匆忙,逼近期末考周時, 因為要準備考試,沒時間寫期末 Project。 即使考完期末考,最後一個星期忙著搬宿舍,能寫的時間不是很有彈性, 不得已得花很長得時間連續不斷寫 Project,寫到最後動力遞減,很容易想放棄。 現在想起來,我認為最好可以一開學就開始寫 SIC/XE 組譯器, 一方面可以邊寫邊看課本來準備期末考, 二方面透過時段的切割可以避免學期末擠在一起時的壓力。 況且其實一開學就會說期末 project 是什麼了 就算最後發現要求不太一樣,也依然有理解系統程式課程的好處。 &References& x86 Assembly http://goo.gl/TNiIw Prime number http://goo.gl/31Y2W Calculating the day of the week http://goo.gl/1AcvC Lexical analysis http://goo.gl/5BQmz Writing a simple expression evaluator http://goo.gl/SjjwZ Evaluate mathematical expressions http://goo.gl/Y4up7 Reverse Polish notation http://goo.gl/xt1gQ Watching the Keyboard Scan Codes http://goo.gl/1Yb02 Keyboard Scan Codes http://goo.gl/O3HSf Making Music using the PC Speaker http://goo.gl/OUb54 Make sound from the speaker using assembly http://goo.gl/pdUwo Guide To EXE Infection http://goo.gl/8yc2O An Introduction to Nonoverwriting Virii http://goo.gl/hsqUn Dark Angel's Phunky Virus Writing Guide http://goo.gl/UkbvL SIC/XE Assembler http://goo.gl/fFIMW http://goo.gl/smYBu http://goo.gl/Xjg8U Introduction to Systems Software http://goo.gl/l3STH -- ▄▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄ <telnet://bbs.cs.nctu.edu.tw> █▄▄▄▄█ █ ▄▄▄▄▄█ Player: shaform ▄█▄▄▄▄█ ▄▄▄█ █▄▄▄▄▄ From: linux1.cs.nctu.edu.tw ☆ 次世代BS2 ☆ 可申請個人板 150MB 相簿 http://pic.bs2.to 交大資訊人 250MB super9817020:推薦永生難忘 (有神快拜 07/23 07:54 c871111116:大推永昇啊 07/23 08:41 darkgerm:成績終於出來了....等了好久,等等來發~ 07/23 09:02 yan:因為睡過頭忘了去考期末考 最後成績低空飛過 好險~ 07/23 11:11 baby03201:推大神心得 :) 07/23 11:18 dandy:推薦這篇文章 07/23 11:28 freeman921:成績終於公佈了喔  哈哈= = 07/23 15:03 b6683421:推薦這篇文章 07/23 15:28 legend0416:推薦這篇文章 07/24 14:54 CMturtle:推薦這篇文章 07/24 15:05 francis87192:推薦這篇文章 07/24 16:30 peanut:推薦這篇文章 07/24 18:32 deepwoody:大神shaform <(_ _)> 07/25 12:41 zzzace2007:推薦這篇文章 07/30 11:13 Jalex:推薦這篇文章 07/31 09:28 sunnyboy:推薦這篇文章 08/05 02:04 作者從 linux1.cs.nctu.edu.tw 修改文章於 2013/01/01 Tue 14:20:16 ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: neoneon (106.105.175.48), 07/12/2016 00:52:35