Tiptop維護工作上,與其說是寫程式,倒不如說是維護程式,就像大家了解的,常常只是修正程式,
修正自己的錯誤,前人的錯誤。tiptop的除錯工具,是r.d2, 在終端版本下,或r.d2+在Activex版本下。最近在和同事教育訓練,大概他也知筆者不具程式開發能力,只具備除錯能力,同仁幫我教育訓練時,也只講r.d2使用。這養成了壞習慣,在學GCC時,筆者喜歡用GDB來偵錯,常常不是偵錯,畢竟Hello World沒什麼好偵錯的,就是想看程式怎麼跑。而JavaScript在firefox及chrome下的cosole偵錯模式,更令人覺得不可思議,在html文本裏的片斷JavaScript, 也是可以中斷的,而且看不到程式進入點的main,但是程式就是會停駐在中斷點上,
而FreeDos(MSDos)下的Debug,更是讓我感動,晚了二十年的感動。
筆者太容易感動了嗎?現在聽到人說linux(Ubuntu)真好用,筆者其實不太感動,
在每年必參加的coscuphttp://coscup.org/2012/zh-tw/開源人年會上,
看不到一台筆電上是裝Windows,那才稍微感動一下。就像微軟techdays看到win8以下的windows, 以為win8己經開賣了的錯覺一樣。
1。Dos下的debug可以寫程式,而且不是直譯也不是編譯,就是程式。
2。它讓筆者稍微入門了組合語言。
3。可以一步一步往下執行,也可以退回之前任何位置,再執行
4。其他功能還會陸續發掘…
回到昨天的程式:
C:\>debug
-a 100
08FA:0100 jmp 111
08FA:0102
-e 102 'Hello World!',0D,0A,'$'
-a 111
08FA:0111 mov dx,102
08FA:0114 mov ah, 09
08FA:0116 int 21
08FA:0118 int 20
08FA:011A
-h 011a 0100
021A 001A
-n hello.com
-rcx
CX 0000 :001a
-w
Writing 001A bytes
-q
-(減號)是debug的提示符號。
a 100,是經典的com執行檔格式,從a(address) 位址100開始,
jmp 111留下111-100的空間,來放**'Hello World!',0D,0A,'$'** ,
頗為激賞的一個地方,如果你是寫code的話,一行一行寫,debug的位址會一直增加。
可以了解每一段code佔了多少空間。
mov dx,102,把這段字放到暫存器dx裏,
連續的mov ah, 09,int 21,如果說中斷服務太難接受,
那就是print, printf 的效果,把dx裏的字串印出來。
h 011a 0100, 計算這段code佔了多少空間,
我看到時,很…很…很激動,這些年來,筆者從來不知道,自已寫的hello world程式,到底佔了多少空間??這裏給出了數字,雖然我沒深究單位,仍然很感動。
n hello.com 是取檔名。
rcx
CX 0000 :001a 把剛才得到的計數器,寫入暫存器cx。
w才真的存檔成功。
沒有編譯(F9, ctrl+F9,build, compile), 也不像javascript要個瀏覽器做載具,
就成了一個小程式。當然這可能要歸功於dos是一簡單的作業系統。
小結:小木偶前輩的經典,第0章http://home.educities.edu.tw/wanker742126/asm/ch00.html,第1章http://home.educities.edu.tw/wanker742126/asm/ch01.html,筆者拜讀了幾次,陣亡了好幾次。
偶然發現,加拿大的女教授,http://www.youtube.com/user/profSchramm,
錄了用debug的組合語言教學,筆者覺得還不錯。這裏再說一些話,
cx是計數器,以debug的用法,拿來存放程式的執行步數,這讓筆者印象深刻。
之後就不會再說,為什麼ax, bx, dx常把資料搬來搬去,或加減乘除,cx較少這樣用。
debug下有一參數,r, 是看所有暫存器,
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=08FA ES=08FA SS=08FA CS=08FA IP=0100 NV UP EI NG NZ NA PE NC
08FA:0100 C3 RET
因為這個圖示法,筆者了解了SP,IP的用法。
期待明天的見面。
感想:任何高級語言,其實常用的保留字沒幾個,而組合語言保留字爆多的,筆者常常被這些陌生用語,提前陣亡,才會想到可以避免這樣的學習方式:別一次吞進太多。
cx是計數器,以debug的用法,拿來存放程式的執行步數
精確點說
應該是程式的「bytes」數
因為不是所有指令都是one byte