大話組合語言 1

2021-04-17 14:56:41 字數 3287 閱讀 8744

「 哎喲,哥們兒,還搗鼓彙編呢?那東西沒用,兄弟用vb"釣"乙個api就夠你忙活個十天半月的,還不一定搞出來。」此君之言倒也不虛,那吾等還有無必要研他一究呢?(廢話,當然有啦!要不然你寫這篇文章幹嘛。)別急,別急,讓我把這個中原委慢慢道來:一、所有電腦語言寫出的程式執行時在記憶體中都以機器碼方式儲存,機器碼可以被比較準確的翻譯成組合語言,這是因為組合語言相容性最好,故幾乎所有跟蹤、除錯工具(包括win95/98下)都是以彙編示人的,如果閣下對crack頗感興趣……;二、彙編直接與硬體打交道,如果你想搞通程式在執行時在電腦中的來龍去脈,也就是搞清電腦每個組成部分究竟在幹什麼、究竟怎麼幹?乙個真正的硬體發燒友,不懂這些可不行。三、如今玩dos的多是「高手」,如能像吾一樣混入(我不是高手)「高手」內部,不僅可以從「高手」朋友那兒套些黑客級「機密」,還可以自詡「高手」盡情享受強烈的虛榮感--#$%& 「醒醒!」

對初學者而言,彙編的許多命令太複雜,往往學習很長時間也寫不出乙個漂漂亮亮的程式,以致妨礙了我們學習彙編的興趣,不少人就此放棄。所以我個人看法學彙編,不一定要寫程式,寫程式確實不是彙編的強項,大家不妨玩玩debug,有時crack出乙個小軟體比完成乙個程式更有成就感(就像學電腦先玩遊戲一樣)。某些高深的指令事實上只對有經驗的彙編程式設計師有用,對我們而言,太過高深了。為了使學習組合語言有個好的開始,你必須要先排除那些華麗複雜的命令,將注意力集中在最重要的幾個指令上(cmp loop mov jnz……)。但是想在??鋨舌碌慕炭剖櫓型瓿繕鮮瞿勘輳?負穩菀祝??員救蘇?砈蘇餛??ㄋ醯ㄓ?inzip、winrar…依次壓迫,嘿嘿!)教程。大言不慚的說,看通本文,你完全可以「不經意」間在前輩或是後生賣弄一下debug,很有成就感的,試試看!那麼??這個接下來呢??? here we go!(閱讀時看不懂不要緊,下文必有分解)

因為彙編是通過cpu和記憶體跟硬體對話的,所以我們不得不先了解一下cpu和記憶體:(關於數的進製問題在此不提)

; pviderivememfunc pviderivememfunc = static_cast(pvibasememfunc);

mov    eax, dword ptr _pvibasememfunc$[ebp]

mov    dword ptr _pviderivememfunc$[ebp], eax

直接將變數pvibasememfunc所佔記憶體的前4個位元組(dword)的值付給了變數_pviderivememfunc所佔記憶體的前4個位元組中。

; pvvderivememfunc    pvvderivememfunc = static_cast(pvvbasememfunc);

mov    eax, dword ptr _pvvbasememfunc$[ebp]

mov    dword ptr _pvvderivememfunc$[ebp], eax

直接將變數pvvbasememfunc所佔記憶體的前4個位元組(dword)的值付給了變數pvvderivememfunc所佔記憶體的前4個位元組中。

這裡的彙編**並沒有給我們太多新鮮的內容:將物件的首位址(this指標)存放於暫存器ecx中,接著就將指令轉到變數_pvibasememfunc所佔記憶體的前4個位元組所表示的位址。

到了這裡,我們應該對成員函式指標有了進一步的了解。

由此可以看出,基類的成員函式指標轉化到相應的派生類的成員函式指標,值保持不變。當然這裡的例子繼承關係相對來說比較簡單,如果存在多繼承和虛繼承的情況下,結果可能會複雜的多。

3。函式呼叫

下面的函式呼叫都大同小異,這裡是列出其中的乙個:

; (baseobj.*pvibasememfunc)(10);

mov    esi, esp

push    10                    ; 0000000ah

lea    ecx, dword ptr _baseobj$[ebp]

call    dword ptr _pvibasememfunc$[ebp]

cmp    esi, esp

call    __rtc_checkesp  

記憶體是電腦運作中的關鍵部分,也是電腦在工作中儲存資訊的地方。記憶體組織有許多可存放數值的儲存位置,叫「位址」。8086位址匯流排有20位,所以cpu擁有達1m的定址空間,這也是dos的有效控制範圍,而8086能做的運算僅限於處理16位資料,即只有0到64k,所以,必須用分段定址才能控制整個記憶體位址。完整的20位位址可分成兩部份:1.段基址(segment):16位二進位制數後面加上四個二進位制0,即乙個16進製制0,變成20位二進位制數,可設定1m中任何乙個64k段,通常記做16位二進位制數;2.偏移量(offset):直接使用16位二進位制數,指向段基址中的任何乙個位址。如:2222(段基址):3333(偏移量),其實際的20位位址值為:25553。除了上述營養要充分吸收外,你還要知道什麼是dos、bios功能呼叫,簡單的說,功能呼叫類似於win95 api,相當於子程式。匯編寫程式已經夠要命了,如果不用ms、ibm的子程式,這日子真是沒法過了(關於功能呼叫詳見《電腦愛好者》98年11期)。

編寫組合語言有兩種主要的方法:1.使用ma**或ta**等編譯器;2.使用除錯程式debug.com。debug其實並不能算是乙個編譯器,它的主要用途在於除錯,即修正匯程式設計序中的錯誤。不過,也可以用來寫短的匯程式設計序,尤其對初學者而言,debug 更是最佳的入門工具。因為debug操作容易:只要鍵入debug回車,a回車即可進行彙編,過程簡單,而使用編譯器時,必須用到文字編輯器、編譯器本身、link以及exe2bin等程式,其中每乙個程式都必須用到一系列相當複雜的命令才能工作,而且用編譯器處理源程式,必須加入許多與指令語句無關的指示性語句,以供編譯器識別,使用 debug 可以避免一開始就碰到許多難以理解的程式行。debug 除了能夠匯程式設計序之外,還可用來檢查和修改記憶體位置、載入儲存和執行程式、以及檢查和修改暫存器,換句話說,debug是為了讓我們接觸硬體而設計的。(8086常用指令用法將在每個匯程式設計序中講解,限於篇幅,不可能將所有指令列出)。

debug的的a命令可以彙編出簡單的com檔案,所以debug編寫的程式一定要由位址 100h(com檔案要求)開始才合法。follow me,setp by setp(步步回車):

輸入 a100 ; 從ds:100開始彙編

2.輸入 mov dl,1 ; 將數值 01h 裝入 dl 暫存器

3.輸入 mov ah,2 ; 將數值 02h 裝入 dl 暫存器

4.輸入 int 21 ; 呼叫dos 21號中斷2號功能,用來逐個顯示裝入dl的字元

5.輸入 int 20 ; 呼叫dos 20號中斷,終止程式,將控制權交回繒div> function imgzoom(id)//重新設定大小 防止撐破** else } window.onload = function() { var imgs = $("content").getelementsbytagname("img"); var i=0; for(;i

組合語言 1

程式語言 組合語言 assembly language 是一種用於電子計算機 微處理器 微控制器或其他可程式設計器件的低階語言,亦稱為符號語言。在組合語言中,用助記符 mnemonics 代替機器指令的操作碼,用位址符號 symbol 或標號 label 代替指令或運算元的位址。在不同的裝置中,組合...

組合語言小節(1)

作為一名合格的程式設計師,組合語言的知識是必不可少的。1 intel彙編與at t格式的彙編不同之處也知道也寫,今天看到一條以前沒見過的 變數 符號的位址以 開頭,注意是變數的位址。movl var,ebx 區別 movl var,ebx 2 函式呼叫過程中,關於引數壓棧,和返回後執行指令的位址。偽...

《組合語言》筆記(1)

說好的學彙編開始了。筆記走起 本書的環境都是8086,8086有14個16位暫存器,有20位位址匯流排,定址能力1mb。16位資料匯流排。組合語言主要是一系列彙編指令,彙編指令就是將機器碼變成了人便於記憶的指令,與01相比,mov,loop更直觀。除了彙編指令,組合語言還包括了偽指令 沒有對應的機器...