?? e路陽光 - 編程專區(qū) - 匯編語言超濃縮教程 天天好心情!.htm
字號:
<TR>
<TD><IMG
src="E路陽光 - 編程專區(qū) - 匯編語言超濃縮教程 天天好心情!.files/ball.gif">
存款 <FONT color=blue>500000
</FONT>枚</TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=1
cellPadding=2 width="100%" align=center border=1>
<TBODY>
<TR>
<TD><IMG
src="E路陽光 - 編程專區(qū) - 匯編語言超濃縮教程 天天好心情!.files/ball.gif">
財(cái)富 <FONT color=blue>富可敵國
</FONT></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=1
cellPadding=2 width="100%" align=center border=1>
<TBODY>
<TR>
<TD><IMG
src="E路陽光 - 編程專區(qū) - 匯編語言超濃縮教程 天天好心情!.files/ball.gif">
性別 <FONT color=blue>男
</FONT></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=1
cellPadding=2 width="100%" align=center border=1>
<TBODY>
<TR>
<TD><IMG
src="E路陽光 - 編程專區(qū) - 匯編語言超濃縮教程 天天好心情!.files/ball.gif">
注冊 2004-4-7</TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=1
cellPadding=2 width="100%" align=center border=1>
<TBODY>
<TR>
<TD><IMG
src="E路陽光 - 編程專區(qū) - 匯編語言超濃縮教程 天天好心情!.files/ball.gif">
來自 黑龍江</TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=1
cellPadding=2 width="100%" align=center border=1>
<TBODY>
<TR>
<TD><IMG
src="E路陽光 - 編程專區(qū) - 匯編語言超濃縮教程 天天好心情!.files/ball.gif">
狀態(tài) 離線 </TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD></TD></TR></TBODY></TABLE></SPAN></TD>
<TD height="100%">
<TABLE style="TABLE-LAYOUT: fixed; WORD-WRAP: break-word"
height="100%" cellSpacing=0 cellPadding=0 width="100%"
border=0>
<TBODY>
<TR>
<TD vAlign=top><SPAN class=bold><SPAN
class=smalltxt>匯編語言超濃縮教程<BR><BR></SPAN></SPAN>Preface:<BR>“
哎喲,哥們兒,還搗鼓匯編呢...... Content:<BR><BR><BR>
“
哎喲,哥們兒,還搗鼓匯編呢?那東西沒用,兄弟用VB"釣"一個API就夠你忙活個十天半月的,還不一定搞出來。”此君之言倒也不虛,那吾等還有無必要研他一究呢?(廢話,當(dāng)然有啦!要不然你寫這篇文章干嘛。)別急,別急,讓我把這個中原委慢慢道來:一、所有電腦語言寫出的程序運(yùn)行時(shí)在內(nèi)存中都以機(jī)器碼方式存儲,機(jī)器碼可以被比較準(zhǔn)確的翻譯成匯編語言,這是因?yàn)閰R編語言兼容性最好,故幾乎所有跟蹤、調(diào)試工具(包括WIN95/98下)都是以匯編示人的,如果閣下對CRACK頗感興趣……;二、匯編直接與硬件打交道,如果你想搞通程序在執(zhí)行時(shí)在電腦中的來龍去脈,也就是搞清電腦每個組成部分究竟在干什么、究竟怎么干?一個真正的硬件發(fā)燒友,不懂這些可不行。三、如今玩DOS的多是“高手”,如能像吾一樣混入(我不是高手)“高手”內(nèi)部,不僅可以從“高手”朋友那兒套些黑客級“機(jī)密”,還可以自詡“高手”盡情享受強(qiáng)烈的虛榮感--#$%&amp;
“醒醒!”
<BR> 對初學(xué)者而言,匯編的許多命令太復(fù)雜,往往學(xué)習(xí)很長時(shí)間也寫不出一個漂漂亮亮的程序,以致妨礙了我們學(xué)習(xí)匯編的興趣,不少人就此放棄。所以我個人看法學(xué)匯編,不一定要寫程序,寫程序確實(shí)不是匯編的強(qiáng)項(xiàng),大家不妨玩玩DEBUG,有時(shí)CRACK出一個小軟件比完成一個程序更有成就感(就像學(xué)電腦先玩游戲一樣)。某些高深的指令事實(shí)上只對有經(jīng)驗(yàn)的匯編程序員有用,對我們而言,太過高深了。為了使學(xué)習(xí)匯編語言有個好的開始,你必須要先排除那些華麗復(fù)雜的命令,將注意力集中在最重要的幾個指令上(CMP
LOOP MOV
JNZ……)。但是想在啰里吧嗦的教科書中完成上述目標(biāo),談何容易,所以本人整理了這篇超濃縮(用WINZIP、WINRAR…依次壓迫,嘿嘿!)教程。大言不慚的說,看通本文,你完全可以“不經(jīng)意”間在前輩或是后生賣弄一下DEBUG,很有成就感的,試試看!那么――這個接下來呢?――
Here we
go!(閱讀時(shí)看不懂不要緊,下文必有分解)<BR> 因?yàn)閰R編是通過CPU和內(nèi)存跟硬件對話的,所以我們不得不先了解一下CPU和內(nèi)存:(關(guān)于數(shù)的進(jìn)制問題在此不提)<BR> CPU是可以執(zhí)行電腦所有算術(shù)╱邏輯運(yùn)算與基本
I/O
控制功能的一塊芯片。一種匯編語言只能用于特定的CPU。也就是說,不同的CPU其匯編語言的指令語法亦不相同。個人電腦由1981年推出至今,其CPU發(fā)展過程為:8086→80286→80386→80486→PENTIUM
→……,還有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不過多了些指令(如多能奔騰的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。為確保匯編程序可以適用于各種機(jī)型,所以推薦使用8086匯編語言,其兼容性最佳。本文所提均為8086匯編語言。寄存器(Register)是CPU內(nèi)部的元件,所以在寄存器之間的數(shù)據(jù)傳送非常快。用途:1.可將寄存器內(nèi)的數(shù)據(jù)執(zhí)行算術(shù)及邏輯運(yùn)算。2.存于寄存器內(nèi)的地址可用來指向內(nèi)存的某個位置,即尋址。3.可以用來讀寫數(shù)據(jù)到電腦的周邊設(shè)備。8086
有8個8位數(shù)據(jù)寄存器,這些8位寄存器可分別組成16位寄存器:AH&amp;AL=AX:累加寄存器,常用于運(yùn)算;BH&amp;BL=BX:基址寄存器,常用于地址索引;CH&amp;CL=CX:計(jì)數(shù)寄存器,常用于計(jì)數(shù);DH&amp;DL=DX:數(shù)據(jù)寄存器,常用于數(shù)據(jù)傳遞。為了運(yùn)用所有的內(nèi)存空間,8086設(shè)定了四個段寄存器,專門用來保存段地址:CS(Code
Segment):代碼段寄存器;DS(Data Segment):數(shù)據(jù)段寄存器;SS(Stack
Segment):堆棧段寄存器;ES(Extra
Segment):附加段寄存器。當(dāng)一個程序要執(zhí)行時(shí),就要決定程序代碼、數(shù)據(jù)和堆棧各要用到內(nèi)存的哪些位置,通過設(shè)定段寄存器
CS,DS,SS
來指向這些起始位置。通常是將DS固定,而根據(jù)需要修改CS。所以,程序可以在可尋址空間小于64K的情況下被寫成任意大小。
所以,程序和其數(shù)據(jù)組合起來的大小,限制在DS
所指的64K內(nèi),這就是COM文件不得大于64K的原因。8086以內(nèi)存做為戰(zhàn)場,用寄存器做為軍事基地,以加速工作。除了前面所提的寄存器外,還有一些特殊功能的寄存器:IP(Intruction
Pointer):指令指針寄存器,與CS配合使用,可跟蹤程序的執(zhí)行過程;SP(Stack
Pointer):堆棧指針,與SS配合使用,可指向目前的堆棧位置。BP(Base
Pointer):基址指針寄存器,可用作SS的一個相對基址位置;SI(Source
Index):源變址寄存器可用來存放相對于DS段之源變址指針;DI(Destination
Index):目的變址寄存器,可用來存放相對于 ES 段之目的變址指針。還有一個標(biāo)志寄存器FR(Flag
Register),有九個有意義的標(biāo)志,將在下文用到時(shí)詳細(xì)說明。<BR> 內(nèi)存是電腦運(yùn)作中的關(guān)鍵部分,也是電腦在工作中儲存信息的地方。內(nèi)存組織有許多可存放數(shù)值的儲存位置,叫“地址”。8086地址總線有20位,所以CPU擁有達(dá)1M的尋址空間,這也是DOS的有效控制范圍,而8086能做的運(yùn)算僅限于處理16位數(shù)據(jù),即只有0到64K,所以,必須用分段尋址才能控制整個內(nèi)存地址。完整的20位地址可分成兩部份:1.段基址(Segment):16位二進(jìn)制數(shù)后面加上四個二進(jìn)制0,即一個16進(jìn)制0,變成20位二進(jìn)制數(shù),可設(shè)定1M中任何一個64K段,通常記做16位二進(jìn)制數(shù);2.偏移量(Offset):直接使用16位二進(jìn)制數(shù),指向段基址中的任何一個地址。如:2222(段基址):3333(偏移量),其實(shí)際的20位地址值為:25553。除了上述營養(yǎng)要充分吸收外,你還要知道什么是DOS、BIOS功能調(diào)用,簡單的說,功能調(diào)用類似于WIN95
API,相當(dāng)于子程序。匯編寫程序已經(jīng)夠要命了,如果不用MS、IBM的子程序,這日子真是沒法過了(關(guān)于功能調(diào)用詳見《電腦愛好者》98年11期)。<BR> 編寫匯編語言有兩種主要的方法:1.使用MASM或TASM等編譯器;2.使用除錯程序DEBUG.COM。DEBUG其實(shí)并不能算是一個編譯器,它的主要用途在于除錯,即修正匯編程序中的錯誤。不過,也可以用來寫短的匯編程序,尤其對初學(xué)者而言,DEBUG
更是最佳的入門工具。因?yàn)镈EBUG操作容易:只要鍵入DEBUG回車,A回車即可進(jìn)行匯編,過程簡單,而使用編譯器時(shí),必須用到文本編輯器、編譯器本身、LINK以及EXE2BIN等程序,其中每一個程序都必須用到一系列相當(dāng)復(fù)雜的命令才能工作,而且用編譯器處理源程序,必須加入許多與指令語句無關(guān)的指示性語句,以供編譯器識別,使用
DEBUG 可以避免一開始就碰到許多難以理解的程序行。DEBUG
除了能夠匯編程序之外,還可用來檢查和修改內(nèi)存位置、載入儲存和執(zhí)行程序、以及檢查和修改寄存器,換句話說,DEBUG是為了讓我們接觸硬件而設(shè)計(jì)的。(8086常用指令用法將在每個匯編程序中講解,限于篇幅,不可能將所有指令列出)。<BR> DEBUG的的A命令可以匯編出簡單的COM文件,所以DEBUG編寫的程序一定要由地址
100h(COM文件要求)開始才合法。FOLLOW ME,SETP BY SETP(步步回車):<BR> 輸入
A100 ; 從DS:100開始匯編<BR> 2.輸入 MOV DL,1 ; 將數(shù)值 01h 裝入 DL
寄存器<BR> 3.輸入 MOV AH,2 ; 將數(shù)值 02h 裝入 DL 寄存器<BR> 4.輸入 INT
21 ; 調(diào)用DOS 21號中斷2號功能,用來逐個顯示裝入DL的字符<BR> 5.輸入 INT 20 ;
調(diào)用DOS 20號中斷,終止程序,將控制權(quán)交回給 DEBUG<BR> 6.請按 Enter
鍵<BR> 7.現(xiàn)在已將匯編語言程序放入內(nèi)存中了,輸入
G(運(yùn)行)<BR> 8.出現(xiàn)結(jié)果:輸出一個符號。<BR> ㄖ
←輸出結(jié)果其實(shí)不是它,因WORD97無法顯示原結(jié)果,故找一贗品將就著。<BR> Program
terminated
normally<BR> 我們可以用U命令將十六進(jìn)制的機(jī)器碼反匯編(Unassemble)成匯編指令。你將發(fā)現(xiàn)每一行右邊的匯編指令就是被匯編成相應(yīng)的機(jī)器碼,而8086實(shí)際上就是以機(jī)器碼來執(zhí)行程序。<BR> 1.輸入
U100,106<BR> 1FED:0100 B201 MOV DL,01<BR> 1FED:0102
B402 MOV AH,02<BR> 1FED:0104 CD21 INT 21<BR> 1FED:0106
CD20 INT
20<BR> DEBUG可以用R命令來查看、改變寄存器內(nèi)容。CS:IP寄存器,保存了將執(zhí)行指令地址。<BR> 1.輸入R<BR> AX=0000
BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000
DI=0000<BR> DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV
UP EI PL NZ NA PO NC<BR> 1FED:0100 B201 MOV
DL,01<BR> 當(dāng)程序由DS:100開始執(zhí)行,那么終止程序時(shí),DEBUG會自動將IP內(nèi)容重新設(shè)定為100。當(dāng)你要將此程序做成一個獨(dú)立的可執(zhí)行文件,則可以用N命令對該程序命名。但一定要為COM文件,否則無法以DEBUG載入。<BR> 輸入N
SMILE.COM
;我們得告訴DEBUG程序長度:程序從100開始到106,故占用7<BR> ;字節(jié)。我們利用BX存放長度值高位部分,而以CX存放低位部分。<BR> 2.輸入RBX
;查看 BX 寄存器的內(nèi)容,本程序只有7個字節(jié),故本步可省略<BR> 3.輸入 RCX ;查看 CX
寄存器的內(nèi)容<BR> 4.輸入 7 ;程序的字節(jié)數(shù)<BR> 5.輸入 W
;用W命令將該程序?qū)懭耄╓rite)磁盤中<BR> 修行至此,我們便可以真正接觸8086匯編指令了。
當(dāng)我們寫匯編語言程序的時(shí)候,通常不會直接將機(jī)器碼放入內(nèi)存中,而是打入一串助記符號(Mnemonic
Symbols),這些符號比十六進(jìn)制機(jī)器碼更容易記住,此之謂匯編指令。助記符號,告訴CPU應(yīng)執(zhí)行何種運(yùn)算。
也就是說,助憶符號所構(gòu)成的匯編語言是為人設(shè)計(jì)的,而機(jī)器語言是對PC設(shè)計(jì)的。
<BR> 現(xiàn)在,我們再來剖析一個可以將所有ASCII碼顯示出來的程序。<BR> 1. 輸入
DEBUG<BR> 2. 輸入 A100<BR> 3.輸入 MOV CX,0100
;裝入循環(huán)次數(shù)<BR> MOV DL,00 ;裝入第一個ASCII碼,隨后每次循環(huán)裝入新碼<BR> MOV
AH,02<BR> INT 21<BR> INC DL ;INC:遞增指令,每次將數(shù)據(jù)寄存器 DL
內(nèi)的數(shù)值加 1<BR> LOOP 0105
;LOOP:循環(huán)指令,每執(zhí)行一次LOOP,CX值減1,并跳<BR> ;到循環(huán)的起始地址105,直到CX為0,循環(huán)停止<BR> INT
20<BR> 4.輸入
G即可顯示所有ASCII碼<BR> <BR> 當(dāng)我們想任意顯示字符串,如:UNDERSTAND?,則可以使用DOS21H號中斷9H號功能。輸入下行程序,存盤并執(zhí)行看看:<BR> 1.輸入
A100<BR> MOV DX,109 ;DS:DX = 字符串的起始地址<BR> MOV AH,9
;DOS的09h功能調(diào)用<BR> INT 21 ;字符串輸出<BR> INT 20<BR> DB
'UNDERSTAND?$';定義字符串 <BR> 在匯編語言中,有兩種不同的指令:1.正規(guī)指令:如 MOV
等,是屬于CPU的指令,用來告訴CPU在程序執(zhí)行時(shí)應(yīng)做些什么,所以它會以運(yùn)算碼(OP-code)的方式存入內(nèi)存中;2.偽指令:如DB等,是屬于DEBUG等編譯器的指令,用來告訴編譯器在編譯時(shí)應(yīng)做些什么。DB(Define
Byte)指令用來告訴DEBUG 將單引號內(nèi)的所有ASCII 碼放入內(nèi)存中。使用 9H
功能的字符串必須以$結(jié)尾。用D命令可用來查看DB偽指令將那些內(nèi)容放入內(nèi)存。<BR> 6.輸入
D100<BR> 1975:0100 BA 09 01 B4 09 CD 21 CD-20 75 6E 64
65 72 73 74 ......!. underst<BR> 1975:0110 61 6E 64 24
8B 46 F8 89-45 04 8B 46 34 00 64 19
and$.F..E..F4.d.<BR> 1975:0120 89 45 02 33 C0 5E 5F
C9-C3 00 C8 04 00 00 57 56
.E.3.^_.......WV<BR> 1975:0130 6B F8 0E 81 C7 FE 53
8B-DF 8B C2 E8 32 FE 0B C0
k.....S.....2...<BR> 1975:0140 74 05 33 C0 99 EB 17
8B-45 0C E8 D4 97 8B F0 89
t.3.....E.......<BR> 1975:0150 56 FE 0B D0 74 EC 8B
45-08 03 C6 8B 56 FE 5E 5F
V...t..E....V.^_<BR> 1975:0160 C9 C3 C8 02 00 00 6B
D8-0E 81 C3 FE 53 89 5E FE
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -