前往
大廳
主題

病毒開發(5) - 組合語言補充與機掰暫存器

虛鹿 | 2022-02-05 22:50:22 | 巴幣 1008 | 人氣 588

照慣例,先推薦一首我很喜歡的歌。

首先,這篇文章的補充內容,
上一篇的筆記的部分修正與實驗心得。
請務必先看過上一篇虛鹿的組語概述
並對我舉例的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的基礎概念後,
重新設計了一個只有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病毒啦!\(≧▽≦)/

如果沒意外的話,
諸君應該都具備了必要ㄉ基礎知識了…..吧(?
嗯~♡看來是時候爆破可愛ㄉ電腦啦~


送禮物贊助創作者 !
0
留言

創作回應

眼睛:OK
手:OK
腦袋:修但幾列
2022-02-05 23:32:02

更多創作