照慣例,先推薦一首我很喜歡的歌。
首先,這篇文章的補充內容,
為上一篇的筆記的部分修正與實驗心得。
請務必先看過上一篇虛鹿的組語概述,
並對我舉例的Hello World程式有一定認知,
再來觀看本文的內容。
~~~~~~~~ 分界線 ~~~~~~
[補充1.]:關於暫存器更詳細的介紹
所謂的通用暫存器,
是可以在4個間允許混用的,
然而這點僅限於資料的暫存與暫存器間移動。
而關於這部分,
會呼叫Dos Function 的部分則不適用!!
如果有認真看過上一篇的hello world的人,
想必也都了解了這三行的意思:
lea dx, msg (把msg變數的地址放入dx)
mov ah, 09h (呼叫print功能)
int 21h (執行剛剛呼叫的功能)
然而,
這裡的「dx暫存器是被固定的」!!
Dos Function 09h 的print功能,
在設計上就是預設印出dx暫存器中的東東,
如果使用其他的暫存器,
則會噴出一大堆亂碼。
擁有類似概念的,
包含使用ah暫存器選擇Dos Function的手法,
如果使用了除了ah外的任意暫存器(如: al),
則無法成功使用呼叫的系統功能。
除了上述所提的常見情況之外,
一般來說混用暫存器是不會影響程式功能的。
來~
讓本鹿幫諸君複習通用暫存器的各個功用:
讓本鹿幫諸君複習通用暫存器的各個功用:
(然而這比較像是推薦的用法)
—————————————————
通用暫存器:(Common Purpose Register)
Ax、Bx、Cx、Dx
Ax: accumulator register (主要處理運算)
Bx: base register (陣列)
Cx: counter register (計數器、類似loop處理)
Dx: data register (接收、存放資料)
—————————————————
至於段暫存器呢,
他們各自都有各自負責處理的資料型態,
不但不可直接用mov去賦值,
且他們也是「絕對不可以混用」的呦!!
否則你丟進去的資料會直接爆★炸★。
讓窩舉個例子吧,
如果你把:
mov ax, @data
mov ds, ax
之中的”mov ds, ax”改為”mov es, ax”,
把非對應的暫存器指向data segment,
那麼最終的輸出結果就會變得….有點奇怪(?
就如各位所見,
除了應有的”Hello World”之外,
還會附贈的一堆詭異的亂碼,
而正是因為如此,所以不建議混用。
這邊,
也幫諸君複習各個段暫存器ㄉ詳細的功用:
—————————————————
段暫存器:(Segment Register) [Can’t be modified directly !]
Cs: Code segment Register => point to the segment of running program.
Ds: Data segment Register => point to the segment of data used by the running program.
Es: Extra segment Register => 備胎
Ss: Stack segment Register => point to stack segment
—————————————————
暫存器的部分就先討論到這裡,
其餘的就請自己去查查Google吧!\(≧▽≦)/
~~~~~~~~ 分界線 ~~~~~~~
[補充2.]:上次介紹的Hello World是被複雜化的
由於我本身也是邊學邊介紹,
而虛鹿我呀~其實幾天前還不會Assembly ,
所以透過大量的資料去補充缺漏的知識。
然而沒想到的是,
該文章的作者的語法其實並非Tasm。
或許是因為語法相近所以同樣也能執行,
而被我誤判為Tasm。
於~是~呢~
我在學會了TASM的基礎概念後,
我在學會了TASM的基礎概念後,
重新設計了一個只有18行的Hello World,
如下:
[#]Hello World TASM Ver:
.MODEL small ;宣告記憶體模型
.STACK 100h ;宣告Stack的大小
.DATA
msg db “Hello World$”
.CODE
Start:
mov ax, @data ;把 data segment 放入ax
mov ds, ax
mov dx, OFFSET msg ;這句等同 ”lea dx, msg”
mov ah, 09h
int 21h
mov ah, 4ch
int 21h
End Start
~~~~~~~~ 分界線 ~~~~~~~~
[補充3]:TASM程式skeleton
一個標準TASM程式碼該有的框架:
.MODEL small
.STACK 100h
.Code
Start:
End Start
~~~~~~~~ 分界線 ~~~~~~~~
[補充4]:如果不 mov ds, ax 的話(?
Ds放的是data segment的物理地址,
如果不指出,則程式會出錯,
但不致於無法執行:
~~~~~~~~ 分界線 ~~~~~~~~
UMU !!
諸君是不是也有點看得懂組語了呢?
一週速成基本的組合語言居然不是夢的說,
那麼下次就能來自製Assembly病毒啦!\(≧▽≦)/
如果沒意外的話,
諸君應該都具備了必要ㄉ基礎知識了…..吧(?
嗯~?看來是時候該來爆破可愛ㄉ電腦啦~