匯編語言入門教程_第1頁
匯編語言入門教程_第2頁
匯編語言入門教程_第3頁
免費預覽已結(jié)束,剩余19頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、.匯編語言入門教程2007-04-29 22:04對初學者而言,匯編的許多命令太復雜,往往學習很長時間也寫不出一個漂漂亮亮的程序,以致阻礙了我們學習匯編的興趣,不少人就此放棄。所以我個人看法學匯編,不一定要寫程序,寫程序確實不是匯編的強項,大家不妨玩玩DEBUG,有時CRACK出一個小軟件比完成一個程序更有成就感就像學電腦先玩游戲一樣。某些高深的指令事實上只對有經(jīng)歷的匯編程序員有用,對我們而言,太過高深了。為了使學習匯編語言有個好的開場,你必須要先排除那些華美復雜的命令,將注意力集中在最重要的幾個指令上CMP LOOP MOV JNZ。但是想在啰里吧嗦的教科書中完成上述目標,談何容易,所以本人

2、整理了這篇超濃縮用WINZIP、WINRAR依次壓迫,嘿嘿!教程。大言不慚的說,看通本文,你完全可以“不經(jīng)意間在前輩或是后生賣弄一下DEBUG,很有成就感的,試試看!那么這個接下來呢. Here we go!閱讀時看不懂不要緊,下文必有分解 因為匯編是通過CPU和內(nèi)存跟硬件對話的,所以我們不得不先了解一下CPU和內(nèi)存:關(guān)于數(shù)的進制問題在此不提 是可以執(zhí)行電腦所有算術(shù)邏輯運算與根本 I/O 控制功能的一塊芯片。一種匯編語言只能用于特定的CPU。也就是說,不同的CPU其匯編語言的指令語法亦不一樣。個人電腦由1981年推出至今,其CPU開展過程為:8086802868038680486PENTIUM

3、 ,還有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不過多了些指令如多能奔騰的MMX指令集、增大了存放器如386的32位EAX、增多了存放器如486的FS。為確保匯編程序可以適用于各種機型,所以推薦使用8086匯編語言,其兼容性最正確。本文所提均為8086匯編語言。存放器Register是CPU內(nèi)部的元件,所以在存放器之間的數(shù)據(jù)傳送非???。用途:1.可將存放器內(nèi)的數(shù)據(jù)執(zhí)行算術(shù)及邏輯運算。2.存于存放器內(nèi)的地址可用來指向內(nèi)存的某個位置,即尋址。3.可以用來讀寫數(shù)據(jù)到電腦的周邊設(shè)備。8086 有8個8位數(shù)據(jù)存放器,這些8位存放器可分別組成16位存放器:&:累加存放器,常用于運算;

4、&:基址存放器,常用于地址索引;&:計數(shù)存放器,常用于計數(shù);&DL:數(shù)據(jù)存放器,常用于數(shù)據(jù)傳遞。為了運用所有的內(nèi)存空間,8086設(shè)定了四個段存放器,專門用來保存段地址:Code Segment:代碼段存放器;Data Segment:數(shù)據(jù)段存放器;Stack Segment:堆棧段存放器;Extra Segment:附加段存放器。當一個程序要執(zhí)行時,就要決定程序代碼、數(shù)據(jù)和堆棧各要用到內(nèi)存的哪些位置,通過設(shè)定段存放器 CS,DS,SS 來指向這些起始位置。通常是將DS固定,而根據(jù)需要修改CS。所以,程序可以在可尋址空間小于64K的情況下被寫成任意大小。 所以,程序和其數(shù)

5、據(jù)組合起來的大小,限制在DS 所指的64K內(nèi),這就是文件不得大于64K的原因。8086以內(nèi)存做為戰(zhàn)場,用存放器做為軍事基地,以加速工作。除了前面所提的存放器外,還有一些特殊功能的存放器:IPIntruction Pointer:指令指針存放器,與CS配合使用,可跟蹤程序的執(zhí)行過程;SPStack Pointer:堆棧指針,與SS配合使用,可指向目前的堆棧位置。BPBase Pointer:基址指針存放器,可用作SS的一個相對基址位置;SISource Index:源變址存放器可用來存放相對于DS段之源變址指針;DIDestination Index:目的變址存放器,可用來存放相對于 ES 段之

6、目的變址指針。還有一個標志存放器FRFlag Register,有九個有意義的標志,將在下文用到時詳細說明。 內(nèi)存是電腦運作中的關(guān)鍵局部,也是電腦在工作中儲存信息的地方。內(nèi)存組織有許多可存放數(shù)值的儲存位置,叫“地址。8086地址總線有20位,所以CPU擁有達1M的尋址空間,這也是DOS的有效控制X圍,而8086能做的運算僅限于處理16位數(shù)據(jù),即只有0到64K,所以,必須用分段尋址才能控制整個內(nèi)存地址。完整的20位地址可分成兩部份:1.段基址(Segment):16位二進制數(shù)后面加上四個二進制,即一個16進制,變成20位二進制數(shù),可設(shè)定1M中任何一個64K段,通常記做16位二進制數(shù);2.偏移量(

7、Offset):直接使用16位二進制數(shù),指向段基址中的任何一個地址。如:2222段基址:3333偏移量,其實際的20位地址值為:25553。除了上述營養(yǎng)要充分吸收外,你還要知道什么是DOS、BIOS功能調(diào)用,簡單的說,功能調(diào)用類似于WIN95 API,相當于子程序。匯編寫程序已經(jīng)夠要命了,如果不用MS、IBM的子程序,這日子真是沒法過了關(guān)于功能調(diào)用詳見"電腦愛好者"98年11期。 編寫匯編語言有兩種主要的方法:1.使用MASM或TASM等編譯器;2.使用除錯程序DEBUG.。DEBUG其實并不能算是一個編譯器,它的主要用途在于除錯,即修正匯編程序中的錯誤。不過,也可以用來寫

8、短的匯編程序,尤其對初學者而言,DEBUG 更是最正確的入門工具。因為DEBUG操作容易:只要鍵入DEBUG回車,A回車即可進展匯編,過程簡單,而使用編譯器時,必須用到文本編輯器、編譯器本身、LINK以及EXE2BIN等程序,其中每一個程序都必須用到一系列相當復雜的命令才能工作,而且用編譯器處理源程序,必須參加許多與指令語句無關(guān)的指示性語句,以供編譯器識別,使用 DEBUG 可以防止一開場就碰到許多難以理解的程序行。DEBUG 除了能夠匯編程序之外,還可用來檢查和修改內(nèi)存位置、載入儲存和執(zhí)行程序、以及檢查和修改存放器,換句話說,DEBUG是為了讓我們接觸硬件而設(shè)計的。8086常用指令用法將在每

9、個匯編程序中講解,限于篇幅,不可能將所有指令列出。 DEBUG的的A命令可以匯編出簡單的文件,所以DEBUG編寫的程序一定要由地址 100h文件要求開場才合法。FOLLOW ME,SETP BY SETP步步回車: 輸入 A100 ; 從DS:100開場匯編 2.輸入 MOV DL,1 ; 將數(shù)值 01h 裝入 DL 存放器 3.輸入 MOV AH,2 ; 將數(shù)值 02h 裝入 DL 存放器 4.輸入 INT 21 ; 調(diào)用DOS 21號中斷2號功能,用來逐個顯示裝入DL的字符 5.輸入 INT 20 ; 調(diào)用DOS 20號中斷,終止程序,將控制權(quán)交回給 DEBUG 6.請按 Enter 鍵

10、7.現(xiàn)在已將匯編語言程序放入內(nèi)存中了,輸入 G(運行) 8.出現(xiàn)結(jié)果:輸出一個符號。 輸出結(jié)果其實不是它,因WORD97無法顯示原結(jié)果,故找一贗品將就著。 Program terminated normally 我們可以用命令將十六進制的機器碼反匯編Unassemble成匯編指令。你將發(fā)現(xiàn)每一行右邊的匯編指令就是被匯編成相應的機器碼,而8086實際上就是以機器碼來執(zhí)行程序。 1.輸入 U100,106 1FED:0100 B201 MOV DL,01 1FED:0102 B402 MOV AH,02 1FED:0104 CD21 INT 21 1FED:0106 CD20 INT 20 DEB

11、UG可以用命令來查看、改變存放器內(nèi)容。CS:IP存放器,保存了將執(zhí)行指令地址。 1.輸入R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV UP EI PL NZ NA PO NC 1FED:0100 B201 MOV DL,01 當程序由DS:100開場執(zhí)行,那么終止程序時,DEBUG會自動將IP內(nèi)容重新設(shè)定為100。當你要將此程序做成一個獨立的可執(zhí)行文件,那么可以用命令對該程序命名。但一定要為文件,否那么無法以DEBUG載入。

12、 輸入N SMILE. ;我們得告訴DEBUG程序長度:程序從100開場到106,故占用7 字節(jié)。我們利用BX存放長度值高位局部,而以CX存放低位局部。 2.輸入RBX ;查看 BX 存放器的內(nèi)容,本程序只有7個字節(jié),故本步可省略 3.輸入 RCX ;查看 CX 存放器的內(nèi)容 4.輸入 7 ;程序的字節(jié)數(shù) 5.輸入 W ;用命令將該程序?qū)懭隬rite磁盤中 修行至此,我們便可以真正接觸8086匯編指令了。 當我們寫匯編語言程序的時候,通常不會直接將機器碼放入內(nèi)存中,而是打入一串助記符號Mnemonic Symbols,這些符號比十六進制機器碼更容易記住,此之謂匯編指令。助記符號,告訴CPU應執(zhí)

13、行何種運算。 也就是說,助憶符號所構(gòu)成的匯編語言是為人設(shè)計的,而機器語言是對PC設(shè)計的。 現(xiàn)在,我們再來剖析一個可以將所有ASCII碼顯示出來的程序。 1. 輸入 DEBUG 2. 輸入 A100 3輸入 MOV CX,0100 ;裝入循環(huán)次數(shù) MOV DL,00 ;裝入第一個ASCII碼,隨后每次循環(huán)裝入新碼 MOV AH,02 INT 21 INC DL ;INC:遞增指令,每次將數(shù)據(jù)存放器 DL 內(nèi)的數(shù)值加 1 LOOP 0105 ;LOOP:循環(huán)指令,每執(zhí)行一次LOOP,CX值減1,并跳 到循環(huán)的起始地址105,直到CX為0,循環(huán)停頓 INT 20 4.輸入 G即可顯示所有ASCII碼

14、 當我們想任意顯示字符串,如:UNDERSTAND.,那么可以使用DOS21H號中斷9H號功能。輸入下行程序,存盤并執(zhí)行看看: 1.輸入 A100 MOV DX,109 ;DS:DX 字符串的起始地址 MOV AH,9 ;DOS的09h功能調(diào)用 INT 21 ;字符串輸出 INT 20 DB 'UNDERSTAND.$';定義字符串 在匯編語言中,有兩種不同的指令:1.正規(guī)指令:如 MOV 等,是屬于CPU的指令,用來告訴CPU在程序執(zhí)行時應做些什么,所以它會以運算碼OP-code的方式存入內(nèi)存中;2.偽指令:如DB等,是屬于DEBUG等編譯器的指令,用來告訴編譯器在編譯時應做

15、些什么。DBDefine Byte指令用來告訴DEBUG 將單引號內(nèi)的所有ASCII 碼放入內(nèi)存中。使用 9H 功能的字符串必須以$結(jié)尾。用命令可用來查看DB偽指令將那些內(nèi)容放入內(nèi)存。 6.輸入 D100 1975:0100 BA 09 01 B4 09 CD 21 CD-20 75 6E 64 65 72 73 74 .!. underst 1975:0110 61 6E 64 24 8B 46 F8 89-45 04 8B 46 34 00 64 19 and$.F.E.F4.d. 1975:0120 89 45 02 33 C0 5E 5F C9-C3 00 C8 04 00 00 57

16、 56 .E.3._.WV 1975:0130 6B F8 0E 81 C7 FE 53 8B-DF 8B C2 E8 32 FE 0B C0 k.S.2. 1975:0140 74 05 33 C0 99 EB 17 8B-45 0C E8 D4 97 8B F0 89 t.3.E. 1975:0150 56 FE 0B D0 74 EC 8B 45-08 03 C6 8B 56 FE 5E 5F V.t.E.V._ 1975:0160 C9 C3 C8 02 00 00 6B D8-0E 81 C3 FE 53 89 5E FE .k.S. 1975:0170 8B C2 E8 FB FD

17、 0B C0 75-09 8B 5E FE 8B 47 0C E8 .u.G. 現(xiàn)在,我們來剖析另一個程序:由鍵盤輸入任意字符串,然后顯示出來。db 20指示DEBUG保存20h個未用的內(nèi)存空間供緩沖區(qū)使用。 輸入A100 MOV DX,0116 ;DS:DX 緩沖區(qū)地址,由DB偽指令確定緩沖區(qū)地址 MOV AH,0A ;0Ah 號功能調(diào)用 INT 21 ;鍵盤輸入緩沖區(qū) MOV DL,0A ;由于功能Ah在每個字符串最后加一個歸位碼0Dh由 Enter MOV AH,02 ;產(chǎn)生,使光標自動回到輸入行的最前端,為了使新輸出的 INT 21 ;字符串不會蓋掉原來輸入的字符串,所以利用功能2h加

18、一 ;個換行碼(OAh),使得光標移到下一行的的最前端。 MOV DX,0118 ;裝入字符串的起始位置 MOV AH,09 ;9h功能遇到$符號才會停頓輸出,故字符串最后必須加上 INT 21 ;$,否那么9h功能會繼續(xù)將內(nèi)存中的無用數(shù)據(jù)胡亂顯示出來 INT 20 DB 20 ;定義緩沖區(qū) 送你一句話:學匯編切忌心浮氣燥。 客套話就不講了。工欲善其事,必先利其器。與其說DEBUG 是編譯器,倒不如說它是“直譯器,DEBUG的A命令只可將一行匯編指令轉(zhuǎn)成機器語言,且立刻執(zhí)行。真正編譯器MASM的運作是利用文本編輯器EDIT等將匯編指令建成一個獨立且附加名為.ASM的文本文件,稱源程序。它是MA

19、SM 程序的輸入局部。MASM將輸入的ASM文件,編譯成.OBJ文件,稱為目標程序。OBJ文件僅包含有關(guān)程序各部份要載入何處及如何與其他程序合并的信息,無法直接載入內(nèi)存執(zhí)行。鏈結(jié)程序LINK那么可將OBJ文件轉(zhuǎn)換成可載入內(nèi)存執(zhí)行EXEcute的EXE文件。還可以用EXE2BIN,將符合條件的EXE文件轉(zhuǎn)成文件 文件不但占用的內(nèi)存最少,而且運行速度最快。 下面我們用MASM寫一個與用DEBUG寫的第一個程序功能一樣的程序。 用EDIT編輯一個SMILE.ASM的源程序文件。 源程序 DEBUG 程序 prognam segment assume cs:prognam org 100h A100

20、mov dl,1 mov dl,1 mov ah,2 mov ah,2 int 21h int 21 int 20h int 20 prognam ends end 比擬一下:1.因為MASM會將所有的數(shù)值假設(shè)為十進制,而DEBUG那么只使用十六進制,所以在源程序中,我們必須在有關(guān)數(shù)字后加上代表進制的字母,如H代表十六進制,D代表十進制。假設(shè)是以字母開頭的十六進制數(shù)字,還必須在字母前加個0,以表示它是數(shù),如0AH。2.源程序增加五行表達:prognam segment 與 prognam ends 是成對的,用來告訴 MASM 及LINK,此程序?qū)⒎旁谝粋€稱為PROGNAM(PROGram N

21、AMe)的程序段內(nèi),其中段名PROGNAM可以任取,但其位置必須固定。assume cs:prognam 必須在程序的開頭,用來告訴編譯器此程序所在段的位置放在CS存放器中。end用來告訴MASM,程序到此完畢, ORG 100H作用相當于DEBUG的A100,從偏移量100開場匯編。 文件的所有源程序都必須包含這五行,且必須依一樣的次序及位置出現(xiàn),這點東西記下就行,千篇一律。接著,我們用MASM編譯SMILE.ASM。 輸入 MASM SMILE 不用打入附加名.ASM。 Microsoft (R) Macro Assembler Version 5.10 Copyright (C) Mic

22、rosoft Corp 1981, 1988. All rights reserved. Object filename SMILE.OBJ: 是否改動輸出OBJ文件名,如不改就ENTER Source listing NUL.LST: 是否需要列表文件LST,不需要就ENTER Cross-reference NUL.CRF: 是否需要對照文件CRF,不需要那么ENTER 50162 + 403867 Bytes symbol space free 0 Warning Errors 警告錯誤,表示編譯器對某些語句不理解,通常是輸入錯誤。 0 Severe Errors 嚴重錯誤,會造成程序無

23、法執(zhí)行,通常是語法構(gòu)造錯誤。 如果沒有一個錯誤存在,即可生成OBJ文件。OBJ中包含的是編譯后的二進制結(jié)果,它還無法被 DOS載入內(nèi)存中加以執(zhí)行,必須加以鏈結(jié)Linking。以LINK將OBJ文件SMILE.OBJ鏈結(jié)成 EXE 文件SMILE.EXE時,。 1.輸入 LINK SMILE 不用附加名OBJ Microsoft (R) Overlay Linker Version 3.64 Copyright (C) Microsoft Corp 1981, 1988. All rights reserved. Run File SMILE.EXE: 是否改動輸出EXE文件名,如不改就ENTE

24、R List File NUL.MAP: 是否需要列表文件MAP,不需要那么ENTER Libraries .LIB: 是否需要庫文件,要就鍵入文件名,不要那么ENTER LINK : warning L4021: no stack segment 由于文件不使用堆棧段,所以錯誤信息 "no stack segment"并不影響程序正常執(zhí)行 至此已經(jīng)生成EXE文件,我們還須使用EXE2BIN 將EXE文件SMILE.EXE,轉(zhuǎn)換成文件SMILE.。輸入EXE2BIN SMILE產(chǎn)生 BIN 文件SMILE.BIN。其實 BIN 文件與 文件是完全一樣的,但由于DOS只認、E

25、XE及BAT文件,所以BIN文件無法被正確執(zhí)行,改名或直接輸入 EXE2BIN SMILE SMILE.即可?,F(xiàn)在,磁盤上應該有 SMILE. 文件了,你只要在提示符號C:>下,直接輸入文件名稱 SMILE ,就可以執(zhí)行這個程序了。prognam segment ;定義段 assume cs:prognam ;把上面定義段的段基址放入 CS mov cx,100h ; 裝入循環(huán)次數(shù) mov dl,0 ; 裝入第一個ASCII碼,隨后每次循環(huán)裝入新碼next: mov ah,2int 21hinc dl ;INC:遞增指令,每次將數(shù)據(jù)存放器 DL 內(nèi)的數(shù)值加 1loop next ; 循環(huán)

26、指令,執(zhí)行一次,CX減1,直到CX為0,循環(huán)停頓int 20hprognam ends ;段終止end ;匯編終止在匯編語言的源程序中,每一個程序行都包含三項元素 start: mov dl,1 ;裝入第一個ASCII碼,隨后每次循環(huán)裝入新碼 標識符 表達式 注解 在原始文件中加上注解可使程序更易理解,便于以后參考。每行注解以“;與程序行別離。編譯器對注解不予理會,注解的數(shù)據(jù)不會出現(xiàn)在OBJ、EXE或文件中。由于我們在寫源程序時,并不知道每一程序行的地址,所以必須以符號名稱來代表相對地址,稱為“標識符。我們通常在適當行的適當位置上,鍵入標識符。標識符label最長可達31 個字節(jié),因此我們在程

27、序中,盡量以簡潔的文字做為標識符?,F(xiàn)在,你可以將此ASCII.ASM 文件編譯成 ASCII. 了。1.MASM ASCII,2.LINK ASCII,3.EXE2BIN ASCII ASCII.。 注意:當你以編譯器匯編你設(shè)計的程序時,常會發(fā)生打字錯誤、標識符名稱拼錯、十六進制數(shù)少了、邏輯錯誤等。匯編老手常給新人的忠告是:最好料到自己所寫的程序一定會有些錯誤別人告訴我的;如果第一次執(zhí)行程序后,就得到期望的結(jié)果,你最好還是在檢查一遍,因為它可能是錯的。原那么上,只要大體的邏輯架構(gòu)正確,查找程序中錯誤的過程,與寫程序本身相比甚至更有意思。寫大程序時,最好能分成許多模塊,如此可使程序本身的目的較單

28、純,易于撰寫與查錯,另外也可讓程序中不同部份之間的界限較清楚,節(jié)省編譯的時間。如果讀程序有讀不懂的地方最好用紙筆記下有關(guān)存放器、內(nèi)存等內(nèi)容,在紙上慢慢比劃,就豁然開朗了。 下面我們將寫一個能從鍵盤取得一個十進制的數(shù)值,并將其轉(zhuǎn)換成十六進制數(shù)值而顯示于屏幕上的“大程序。前言:要讓8086執(zhí)行這樣的功能,我們必須先將此問題分解成一連串的步驟,稱為程序規(guī)劃。首先,以流程圖的方式,來確保整個程序在邏輯上沒有問題不用說了吧!什么語言都要有此步驟。這種模塊化的規(guī)劃方式,稱之為“由上而下的程序規(guī)劃。而在真正寫程序時,卻是從最小的單位模塊子程序開場,當每個模塊都完成之后,再合并成大程序;這種大處著眼,小處著手

29、的方式稱為“由下而上的程序設(shè)計。 我們的第一個模塊是BINIHEX,其主要用途是從8086的BX存放器中取出二進制數(shù),并以十六進制方式顯示在屏幕上。注意:子程序如不能獨立運行,實屬正常。 binihex segment assume cs:binihex mov ch,4 ;記錄轉(zhuǎn)換后的十六進制位數(shù)四位 rotate: mov cl,4 ;利用CL當計數(shù)器,記錄存放器數(shù)位移動次數(shù) rol bx,cl ;循環(huán)存放器BX的內(nèi)容,以便依序處理4個十六進制數(shù) mov al,bl ;把bx低八位bl內(nèi)數(shù)據(jù)轉(zhuǎn)移至al and al,0fh ;把無用位清零 add al,30h ;把AL內(nèi)數(shù)據(jù)加30H,并存

30、入al cmp al,3ah ;與3ah比擬 jl printit ;小于3ah那么轉(zhuǎn)移 add al,7h ;把AL內(nèi)數(shù)據(jù)加30H,并存入al printit:mov dl,al ;把ASCII碼裝入DL mov ah,2 int 21h dec ch ;ch減一,減到零時,零標志置1 jnz rotate ;JNZ:當零標志未置1,那么跳到指定地址。即:不等,那么轉(zhuǎn)移 int 20h ;從子程序退回主程序 binihex ends end 利用循環(huán)左移指令ROL循環(huán)存放器BX(BX內(nèi)容將由第二個子程序提供)的內(nèi)容,以便依序處理4個十六進制數(shù):1. 利用CL當計數(shù)器,記錄存放器移位的次數(shù)。2

31、.將BX的第一個十六進制值移到最右邊。利用 AND 邏輯“與運算:對應位都為時,其結(jié)果為,其余情況為零把不要的部份清零,得到結(jié)果:先將BL值存入AL中,再利用AND以0Fh00001111將AL的左邊四位清零。由于到的ASCII碼為30h到39h,而到之ASCII碼為41h到46h,連續(xù)了7h,所以得到結(jié)果:假設(shè)AL之內(nèi)容小于3Ah,那么AL值只加30h,否那么AL再加7h。ADD指令會將兩個表達式相加,其結(jié)果存于左邊表達式內(nèi)。標志存放器Flag Register是一個單獨的十六位存放器,有9個標志位,某些匯編指令大部份是涉及比擬、算術(shù)或邏輯運算的指令執(zhí)行時,會將相關(guān)標志位置1或清0, 常碰到

32、的標志位有零標志ZF、符號標志SF、溢出標志OF和進位標志CF。 標志位保存了某個指令執(zhí)行后對它的影響,可用其他相關(guān)指令,查出標志的狀態(tài),根據(jù)狀態(tài)產(chǎn)生動作。CMP指令很像減法,是將兩個表達式的值相減,但存放器或內(nèi)存的內(nèi)容并未改變,只是相對的標志位發(fā)生改變而已:假設(shè) AL 值小于 3Ah,那么正負號標志位會置0,反之那么置1。 JL指令可解釋為:小于就轉(zhuǎn)移到指定位置,大于、等于那么向下執(zhí)行。CMP和JG 、JL等條件轉(zhuǎn)移指令一起使用,可以形成程序的分支構(gòu)造,是寫匯編程序常用技巧。 第二個模塊DECIBIN 用來接收鍵盤打入的十進制數(shù),并將它轉(zhuǎn)換成二進制數(shù)放于BX 存放器中,供模塊1 BINIHE

33、X使用。 decibin segment assume cs:decibin mov bx,0 ;BX清零 newchar:mov ah,1 ; int 21h ;讀一個鍵盤輸入符號入al,并顯示 sub al,30h ;al減去30H,結(jié)果存于al中,完成ASCII碼轉(zhuǎn)二進制碼 jl exit ;小于零那么轉(zhuǎn)移 cmp al,9d jg exit ;左>右那么轉(zhuǎn)移 cbw ;8位al轉(zhuǎn)換成16位ax xchg ax,bx ;互換ax和bx內(nèi)數(shù)據(jù) mov cx,10d ;十進制數(shù)10入cx mul cx ;表達式的值與ax內(nèi)容相乘,并將結(jié)果存于ax xchg ax,bx add bx,a

34、x jmp newchar ;無條件轉(zhuǎn)移 exit: int 20 ;回主程序 decibin ends end CBW 實際結(jié)果是:假設(shè)AL中的值為正,那么AH填入00h;反之,那么AH填入FFh。XCHG常用于需要暫時保存某個存放器中的內(nèi)容時。 當然,還得一個子程序CRLF使后顯示的十六進制數(shù)不會蓋掉先輸入的十進制數(shù)。 crlf segment assume cs:crlf mov dl,0dh ;回車的ASCII碼0DH入DL mov ah,2 int 21h mov dl,0ah ;換行的ASSII碼0AH入AH mov ah,2 int 21h int 20 ;回主程序 crlf e

35、nds end 現(xiàn)在我們就可以將BINIHEX、DECIBIN及CRLF等模塊合并成一個大程序了。首先,我們要將這三個模塊子程序略加改動。然后,再寫一段程序來調(diào)用每一個子程序。 crlf proc near; mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h ret crlf endp 類似SEGMENT與ENDS的偽指令,PROC與ENDP也是成對出現(xiàn),用來識別并定義一個程序。其實,PROC 真正的作用只是告訴編譯器:所調(diào)用的程序是屬于近程NEAR或遠程FAR。 一般的程序是由 DEBUG 直接調(diào)用的,所以用 INT 20 返回,

36、用 CALL 指令所調(diào)用的程序那么改用返回指令RET,RET會把控制權(quán)轉(zhuǎn)移到棧頂所指的地址,而該地址是由調(diào)用此程序的 CALL指令所放入的。 各模塊都搞定了,然后我們把子程序組合起來就大功告成 decihex segment ;主程序 assume cs:decihex org 100h mov cx,4 ;循環(huán)次數(shù)入cx;由于子程序要用到cx,故子程序要將cx入棧 repeat: call decibin;調(diào)用十進制轉(zhuǎn)二進制子程序 call crlf ;調(diào)用添加回、換行符子程序 call binihex ;調(diào)用二進制轉(zhuǎn)十六進制并顯示子程序 call crlf loop repeat ;循環(huán)4

37、次,可連續(xù)運算4次 mov ah,4ch ; 調(diào)用DOS21號中斷4c號功能,退出程序,作用跟INT 20H int 21H ; 一樣,但適用面更廣,INT20H退不出時,試一下它 decibin proc near push cx ;將cx壓入堆棧,; exit: pop cx ;將cx復原; retdecibin endp binihex proc near push cx pop cx retbinihex endp crlf proc near push cx pop cx retcrlf endpdecihex ends end CALL指令用來調(diào)用子程序,并將控制權(quán)轉(zhuǎn)移到子程序地址,同時將CALL的下行一指令地址定為返回

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論