作者neoneon (红茶を饮む程度の能力)
看板NCTU-Teacher
标题Fw: [心得] 陈永昇 - 组合语言与系统程式
时间Tue Jul 12 00:52:35 2016
※ [本文转录自 neoneon 信箱]
作者:
[email protected] ("爱宕有机奈米负离子猫")
标题: [心得] 陈永昇 - 组合语言与系统程式
时间: 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