清華大學馮博琴微機原理第4章匯編語言程序設計課件_第1頁
清華大學馮博琴微機原理第4章匯編語言程序設計課件_第2頁
清華大學馮博琴微機原理第4章匯編語言程序設計課件_第3頁
清華大學馮博琴微機原理第4章匯編語言程序設計課件_第4頁
清華大學馮博琴微機原理第4章匯編語言程序設計課件_第5頁
已閱讀5頁,還剩120頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章匯編語言程序設計.ASM.OBJ.EXE編譯連接編譯程序:

MASM.EXE連接程序:

LINK.EXE用戶編寫程序,程序在計算機中運行,計算機的控制由操作系統(tǒng)交給用戶程序,運行用戶程序,當用戶程序運行結束后,應再將控制權交回操作系統(tǒng),所以,在程序中應該有返回DOS的指令。在計算機中,返回DOS的指令是操作系統(tǒng)中的一個子程序,用戶使用時應調用這個子程序。系統(tǒng)占用INT20H

程序段前綴用戶數(shù)據(jù)區(qū)用戶堆棧區(qū)用戶代碼段…………系統(tǒng)和ROM占用無論用戶程序有幾段,也無論這些段的排列順序如何,用戶程序的代碼前一定有100個字節(jié)的程序段前綴(ProgramSegmentPrefix,簡稱PSP),PSP給出了用戶的可執(zhí)行文件(.EXE)的若干控制信息。其中PSP的開始處(第1,2字節(jié))有一條中斷指令INT20H的代碼,這條指令的功能是結束用戶程序,返回操作系統(tǒng)。在用戶程序執(zhí)行完以后,通過執(zhí)行該條指令就可以返回DOS。如何使用戶程序執(zhí)行完后返回來執(zhí)行這條指令?系統(tǒng)占用INT20H

程序段前綴用戶數(shù)據(jù)區(qū)用戶堆棧區(qū)用戶代碼段……RET系統(tǒng)和ROM占用DS,ESSSCS首先將用戶程序定義為一個遠過程,當可執(zhí)行文件裝入內存后,DS,ES兩個段寄存器被CPU自動設置為指向PSP的首址,所以一般程序的開始指令為:

PUSHDSXORAX,AXPUSHAX即將DS的內容和0000H壓入堆棧,程序結束時的最后一條語句為RET,就把壓入堆棧的PSP段的段基址和偏移量0000H彈出并送入CS和IP,轉而執(zhí)行返回DOS的指令INT20H。00H00HPSPLPSPH堆棧情況返回操作系統(tǒng)的另一個辦法是用系統(tǒng)調用中斷指令:INT21H,在用戶程序結束時,用下面兩條指令:

MOVAH,4CHINT21H這兩條指令經(jīng)常用在短的程序段中,即用戶程序并不是一個完整的匯編程序,而只是由一些指令組成的、沒有堆棧區(qū)或數(shù)據(jù)區(qū)的程序段。偽指令:偽指令不是處理器運行的指令,而是程序員給匯編程序下達的命令。是在編譯源程序期間由匯編程序執(zhí)行的命令。因為程序要分段放在內存內,編譯程序必須要知道每段的起始位置,為CPU的段寄存器分配地址;如果程序中有變量,還要定義變量空間,存放數(shù)據(jù)、結果;知道源程序的開始、結束標志……偽指令語句:在匯編時不產(chǎn)生二進制代碼,僅為編譯程序提供匯編時所需要的信息的語句。一、段定義一般的源程序分為4個段:代碼段Code、數(shù)據(jù)段Data、堆棧段Stack、附加段Extra。各個段從段定義語句開始,到段結束語句ENDS結束。段名

SEGMENT

定位類型組合類型類別……段體……段名

ENDS用戶指定可任選定義段名必須是合法是標識符。定位類型:內存可以看成是一本書,將其分成頁,段,字,和字節(jié)每256個地址為一頁(PAGE),每頁的起始地址為二進制:************0000000016進制:***00H第一頁(256個地址)第二頁(256個地址)00000H000FFH00100H00200H001FFH每2個地址為一個字(WORD),每個字的起始地址為偶數(shù);最基本的類型是字節(jié)(BYTE),字節(jié)只包含一個地址,可以是內存的任何空間。定位類型表示所定義的段存放在內存空間時,段首地址對內存空間的要求,即段起始點是放在一頁的起點上(PAGE)還是一段的起點上(PARA)等,如果不定義定位類型,編譯程序將默認其為段類型,即將段首地址放在從****0H開始的內存空間BYTE:

表示本段起始單元可以從任一地址開始;WORD:

表示本段起始單元從一個偶地址開始;PARA:

表示本段起始單元從一個段的邊界開始(默認);PAGE:

表示本段起始單元從一個頁的邊界開始。組合類型組合類型是告訴編譯程序,所定義的段與其他段的關系,即將該段存放內存時,是否將該段與其他段在物理上或邏輯上放在一起。常常一個匯編程序可以有很多代碼段、數(shù)據(jù)段或堆棧段,這時,就要綜合考慮各段的組合類型。NONE:

表示本段與其他段不發(fā)生任何關系,該段有自己的基地址,是默認的組合關系。PUBLIC:在滿足定位類型的前提下與其他模塊的同名段連接在一起,形成一個新的邏輯段,共用一個段基址。MEMORY:

表示本段在存儲器中應定位在所有其他段的最高地址。AT<表達式>:表示本段從表達式指定的地址處開始裝入,這樣,在程序中用戶就可以直接定義段地址,這種方式不適用于代碼段。類別:是用單引號括起來的字符串,連接時,LINK程序把類別相同的段放在連續(xù)的存儲區(qū)中(可以不同名)。類別名可以任意,但一般為‘CODE’,’STACK’,‘DATA’等,表明該段的類型例如:定義堆棧段如下:STSEGMENTPARASTACK‘STACK’DB100DUP(?)STENDS段名組合類型類別定位類型堆棧長度段結束通過定義,自動初始化了SS和SP。………………SS:0000HSS:0063HSS:0064H100字節(jié)SP連接兩個匯編語言目標程序時,它們的數(shù)據(jù)段同名,組合類型為PUBLIC,定位類型為PARA。連接后第一個目標程序的數(shù)據(jù)段的起始物理地址是01010H,長度為17AH,則第二個目標程序數(shù)據(jù)段的起始物理地址為多少?01010H+17AH=0118AH因為第二個數(shù)據(jù)段的定位類型為PARA,故應從節(jié)(段)的邊界開始,01190H因為組合類型為PUBLIC,所以共用一個段基址,在內存中順序存放。二、過程定義過程的含義和子程序是一樣的,一個碼段中可以包含一個或多個過程。碼段名SEGMENT過程名1PROCFAR

……RET過程名1ENDP過程名2PROCNEAR

……RET過程名2ENDP…………碼段名ENDSFAR:

該過程為遠過程,調用該過程時為段間調用,即CS和IP均要重新賦值;NEAR:

該過程為近過程,調用該過程時為段內調用,只賦值IP。(默認)過程名1

PROCFAR……RET過程名1

ENDP過程名是合法的標識符;一個程序的主過程(起始指令所在的過程)應是FAR過程,因為該過程是DOS調用的。過程中應有RET指令,以便返回到調用處。過程可以嵌套調用,但不可以嵌套定義。過程開始過程結束例:延時100ms的子程序,編程如下:DELAY

PROC

MOVBL,10AGAIN:MOVCX,2801HWAIT:LOOPWAITDECBLJNZAGAIN

RETDELAY

ENDP系統(tǒng)和ROM占用用戶代碼段…………用戶堆棧區(qū)用戶數(shù)據(jù)區(qū)程序段前綴系統(tǒng)占用00000HDS,ES100個字節(jié)SS用戶程序空間FFFFFHCS正確的DS地址MOVAX,數(shù)據(jù)段名MOVDS,AX四、結束語句ENDENDS:

段結束ENDP:過程結束END:

整個匯編源程序結束(不配對使用)匯編程序在編譯時遇到END,便得知源程序已經(jīng)結束。END表達式表達式為可執(zhí)行程序運行的起始位置,一般為主過程名。五、ORGORG表達式指定了在其后的指令或數(shù)據(jù)存放的偏移地址。ORG0100HMOVAX,0表明該指令放在碼段,其偏移地址為0100H。碼段的首地址從CS:0000H處開始。PUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AX標準程序前奏,一般寫在代碼段開始第二節(jié)數(shù)據(jù)定義一、常量、變量及標識符常量:二進制(B),八進制(Q),十六進制(H),十進制(D)(默認)10001100100B244Q64H‘AB’變量:代表存放在某些存儲單元的數(shù)據(jù),這些數(shù)據(jù)在程序的運行期間隨時可以修改。在程序中以變量名的形式出現(xiàn)。定義變量:給變量分配存儲單元,為這個單元起名字(變量名),可以同時將這些存儲單元預置初值。每個變量都有三個屬性段屬性(SEG)

變量所在的存儲單元的段基址偏移量屬性(OFFSET)

變量所在的存儲單元距段起點的字節(jié)數(shù)類型屬性(TYPE)

一個單位變量占用存儲單元的字節(jié)數(shù),分為:

DB(1個字節(jié))DW(2個字節(jié))DD(4個字節(jié))DQ(8個字節(jié))DT(10個字節(jié))

DATASETMENTXDB5,4YDW40HZDD2030HDATAENDS05H04H40H00H30H20H00H00HDS:0000HXYZX,Y,Z分別都有三個屬性:段基址,偏移量,類型值這三個屬性都有固定的值。標識符:給指令或某一存儲單元地址所起的名字標識符由下列字符組成:字母:A~Z,a~z;數(shù)字:0~9;特殊字符:?.@_$數(shù)字不能作標識符的第一個字符,標識符最長為31個字符。標識符后面跟冒號時,表示標號,代表該行指令的起始地址,標號可以被轉移、調用指令直接引用標識符后面不帶冒號時,表示變量。標號:代碼段中某一條指令的地址。標號有3個屬性:段屬性(SEG)

該條指令所在段的段基址偏移量屬性(OFFSET)

該指令的偏移地址(距段起點的字節(jié)數(shù))距離屬性表示該標號是作為段內還是段間被調用或轉移的,該屬性有兩個值:NEAR(FFFFH,-1):

本標號只能被標號所在段的轉移或調用指令所訪問(段內轉移),標號后有冒號;FAR(FFFEH,-2):

本標號可被其他段(不是標號所在段)的轉移或調用指令訪問(段間轉移)。標號名LABELFAR二、數(shù)據(jù)定義偽操作DB:定義字節(jié),其后的每個操作數(shù)占有一個字節(jié)單元,連續(xù)存放;BUFFERDB2,3,505H03H02HBUFFERDW:定義字,其后的每個操作數(shù)占有兩個字節(jié);BUFDW2,3,505H00H00H03H00H02HBUFDD:定義雙字,其后每個操作數(shù)占4個字節(jié);若僅保留單元,不初始化,用?代替初值;若數(shù)據(jù)重復,用nDUP()代替,n為重復次數(shù)。STRINGDB‘HELLO!’ARRAYDB100DUP(?)6個字節(jié)的存儲單元,內為各字符對應的ASCII碼,字符串用單引號標識保留100個字節(jié),首地址為ARRAY,不初始化,即100個字節(jié)內均為隨機值DATA1DB100DUP(‘AB’)初始化200個字節(jié),內有100個41H,42H使用匯編語言定義的偽操作命令是:VALDB93DUP(5,2DUP(1,2DUP(3),4))則在VAL存儲區(qū)前10個字節(jié)單元的數(shù)據(jù)是:5,1,3,3,4,1,3,3,4,5若定義DB1,2,5DUP(0,1,2DUP(3)),則在存儲區(qū)前7個單元的數(shù)據(jù)是:1,2,0,1,3,3,0三、等值偽操作名字EQU表達式名字=表達式給名字定義一個值或其他符號名或一條可執(zhí)行語句,在匯編時,凡是出現(xiàn)該名字的地方就用定義的數(shù)據(jù)替代。用EQU賦值的名字不能重新賦值,但可用PURGE釋放后重新定義。TIMES

EQU50BUFDBTIMESDUP(?)等效于:BUFDB50DUP(?)ALPHAEQU256BETA=ALPHA-2DATASEGMENTADW3BDW4LEQUB-ADATAENDS03H00H04H00HDS:0000H數(shù)據(jù)段L為常量,不占空間,值為2變量在數(shù)據(jù)段出現(xiàn),一般為偏移量,在程序段出現(xiàn),為存儲空間的內容。MOVAX,AMOVBX,BADDAX,BX;AX:3;BX:4;AX:7DATASEGMENTADW3,7BDW14LEQUBXDWBYEQUB-ADATAENDS03H00H07H00H0EH00H04H00HDS:0000H數(shù)據(jù)段;L:B;Y:0004HMOVAX,LMOVAX,XMOVAX,AMOVAX,A+2MOVBX,Y;AX:000EH;AX:0004H;AX:0003H;AX:0007HMOVAX,B;X:0004H;BX:0004H第三節(jié)匯編語言運算符匯編語言運算符:是編譯程序在編譯時計算的,與運算指令不同,指令是在程序運行時計算的。一、算術運算符+,-,*,/,MOD,SHL,SHRMOVAX,A+B二、邏輯運算符AND,OR,XOR,NOTCEQUB-AANDAX,CANDOFH三、關系運算符EQ,NE,LT,GT,LE,GElessthan,greatthan

結果產(chǎn)生一個邏輯值,真為0FFFFH,假為0000HMOVAX,((choiceLT20)AND5)OR((choiceGE20)AND6)注意:算術運算符總可以用于數(shù)字操作,其結果也是數(shù)字的。當應用于存儲器操作數(shù)時,只有+,-運算符有意義;邏輯運算符的操作數(shù)也必須是數(shù)字,存儲器操作數(shù)不能進行邏輯運算;關系運算符連接的兩個操作數(shù),必須都是數(shù)字的或是在同一段內的存儲器地址。四、值返回符1)$運算符$:當前地址偏移量的值BLOCKDB‘HELLO!’NUMEQU$-BLOCKHELLO!BLOCK$;NUM為6STR1DW‘AB’STR2DB16DUP(?)CNTEQU$-STR1……MOVCX,CNTMOVAX,STR1HLTSTR1STR2BA;CX為18;AX為4142H$ABSTR1DW4142HSTR1DB41H,42HDATASEGMENTNAEQU15NBEQU10NCDB2DUP(4,2DUP(5,2))CNTDB$-NCCWTDW$-CNTNDDWNCDATAENDS設數(shù)據(jù)段定義如下:從DS:0000H開始至CNT單元之前存放的數(shù)據(jù)依次為:________;ND單元中的值為_________;CWT單元中的值為________;CNT單元中的值為_____。4,5,2,5,2,4,5,2,5,20000H10AH04H05H02H05H02H04H05H02H05H02H0AH01H00H00H00HSEG和OFFSETSEG:求標號或變量的段基址OFFSET:求標號或變量的距段首址的偏移量DATASEGMENTADB12BDW23,25DATAENDS……MOVBX,OFFSETBMOVAX,SEGBLEABX,B;BX:0001H;AX:DS值;BX:0001H與MOVBX,OFFSETBDATASEGMENTTABLEDW10,20,30,40,50ENTRYDW3DATAENDS……MOVBX,OFFSETTABLEADDBX,ENTRYMOVAX,[BX]0AH00H14H00H1EH00H28H00H32H00H03H00H;0000H;BX:3;AX:1E00HBX3)TYPE標號或符號的類型值對變量:表示變量的字節(jié)數(shù)

DB1,DW2,DD4對標號:表示過程或指令地址的調用類型

(NEAR)-1或(FAR)-2DATASEGMENTADB12BDW23,25DATAENDS……MOVAX,TYPEAMOVBX,TYPEB;AX:0001H;BX:0002H4)LENGTH和SIZELENGTH:對DUP情況下,變量的項數(shù)或元素個數(shù),

在其他情況下該項屬性為1;SIZE:對操作數(shù)分配的字節(jié)數(shù)。

SIZE=LENGTH×TYPEADB‘1234’BDW5DUP(2,3DUP(0))CDW‘AB’,‘C’,‘D’L1:MOVAL,TYPEBMOVBL,LENGTHBMOVAH,SIZEAMOVBH,SIZECMOVCL,TYPEL1MOVCH,SIZEB;AL:2;BL:5;AH:1;BH:2;CL:0FFH;CH:0AHCDW‘ABE’,‘C’,‘D’正確與否?對于下面的數(shù)據(jù)定義,各條MOV指令單獨執(zhí)行后,請?zhí)畛溆嘘P寄存器的內容:

TABLE1DB?TABLE2DW20DUP(?)TABLE3DB‘ABCD’……MOVAX,TYPETABLE1MOVBX,TYPETABLE2MOVCX,LENGTHTABLE2MOVDX,SIZETABLE2MOVSI,LENGTHTABLE3;AX:1;BX:2;CX:20;DX:40;SI:15)HIGH和LOWHIGH:

對操作數(shù)取高字節(jié);LOW:

對操作數(shù)取低字節(jié)。NUMEQU0CDEFH……MOVAH,HIGHNUMMOVAL,LOWNUM;AH:0CDH;AL:0EFH五、屬性運算符用來給指令中的操作數(shù)指定一個臨時的屬性,而暫時忽略操作數(shù)定義時的屬性。1)PTR定義操作數(shù)為新的類型新類型PTR操作數(shù)操作數(shù)可以是存儲器的地址或標號名F1DW1234HF2DB23H,56H,18H……MOVAL,BYTEPTRF1MOVAX,WORDPTRF2;AL:34H;AX:5623H18H56H23H12H34HF2F1DAT1DB12H,34HDAT2DB56H,78H……MOVAX,WORDPTRDAT1CMPAX,WORDPTRDAT2JAL1MOVBX,WORDPTRDAT2MOVWORDPTRDAT2,AXMOVWORDPTRDAT1,BXL1:HLTDAT1單元的值是:__________;AX:3412H;7856H56H2)THIS指定新類型像PTR一樣可用來建立一個特殊類型的存儲器地址操作數(shù),而沒有為它分配存儲器。新的存儲器操作數(shù)的段和偏移量部分就是下一個能分配的存儲單元的段和偏移量。F1EQUTHISBYTEF2DW4321H,2255H……MOVAL,F1MOVAX,F2THIS類型名22H55H43H21HF2F1;AL:21H;AX:4321HF1和F2具有相同的段基地址和偏移地址,但類型不同。3)段超越強迫當前指令的操作數(shù)按指定的段基地址尋址。MOVAX,ES:[BX]4)SHORT用于無條件轉移指令JMP,通知編譯器,轉移的目標地址在-128~+127之間。JMP標號;是三字節(jié)指令JMPSHORT標號;是兩字節(jié)指令第四節(jié)匯編語言程序匯編語言編寫的程序也跟高級語言類似,程序結構分三種:順序、分支、循環(huán);較復雜的程序也應該是由眾多子程序組成的,每個子程序是一個過程,在程序中被顯式地調用。變量等數(shù)據(jù)部分被定義在數(shù)據(jù)段,所有程序都要顯式地定義堆棧段。匯編程序的每一條指令都與機器語言一一對應,因此,匯編生成的可執(zhí)行文件代碼少,適合于實時控制,但由于語法成分很少,不適合于復雜的算法、運算。匯編程序主要的調試環(huán)境是DOS系統(tǒng)下的DEBUG程序。程序設計步驟1.分析問題2.建立數(shù)學模型3.確定算法4.繪制程序流程圖5.內存分配(指令或偽指令)6.編制程序7.程序調試順序結構程序例:自然數(shù)0~9的平方表,存在內存TABLE開始的連續(xù)10個單元中,現(xiàn)XAD單元存有任意一自然數(shù)(0X<10),查表求X的平方,存入YAD單元中。解:X2

的值的地址:

TABLE表的首地址+X0000H00001H10002H40003H90004H160005H250006H360007H490008H640009H81DATASEGMENT

數(shù)據(jù)段內容DATAENDS

CODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFARPUSHDS;將DS入棧

MOVAX,0000H;AX置零

PUSHAX;將0入棧

主程序RETSTARTENDPCODEENDSENDDATASEGMENTTABLEDB0,1,4,9,16,25,36,49,64,81XADDB8YADDB?DATAENDS

0000H00001H10002H40003H90004H160005H250006H360007H490008H640009H81000AH8000BH?0000H00001H10002H40003H90004H160005H250006H360007H490008H640009H81000AH8000BHMOVAX,DATAMOVDS,AX;初始化DSLEABX,TABLE;表的首址送BXMOVAH,0;AH送0

MOVAL,XAD;將X送ALADDBX,AX;求X平方值的地址MOVAL,[BX];X平方值送ALMOVYAD,ALBXBX=BX+AX64如何用查表指令(XLAT)完成?例:編程求函數(shù)y=((a+b)*c-d)/e,其中a、b、c、d、e依次存放在VARA、VARB、VARC、VARD、VARE單元,結果存放在VARY單元。解:首先定義存儲單元,然后在主程序中依次實現(xiàn)……VARAVARBVARCVARDVAREVARY……DATASEGMENTVARADB6VARBDB7VARCDB8VARDDB9VAREDB10VARYDB?DATAENDS

……VARA6VARB7VARC8VARD9VARE10VARY?……MOVAL,VARAADDAL,

VARB;a+b->ALIMULVARC

;(a+b)*c->AXMOVBH,0MOVBL,VARD;d->BXSUBAX,BX;(a+b)*c-d->AXIDIVVAREMOVVARY,AX……VARA6VARB7VARC8VARD9VARE10VARY?……;AX:09H,DX:05H分支結構程序設計可以有兩種形式,如圖所示,它們分別相當于高級語言程序中的IF-THEN-ELSE語句和CASE語句,它們適用于要根據(jù)不同條件做不同處理的情況。實現(xiàn)方法:在產(chǎn)生分支之前,通常用比較、測試的辦法在標志寄存器中設置相應的標志位,然后再選用適當?shù)臈l件轉移指令,以實現(xiàn)不同情況的分支轉移。例:符號函數(shù):(-128≤X≤+127)設任意給定的X存放在XX單元,計算出函數(shù)Y值要求存放在YY單元。例:符號函數(shù):DATA SEGMENT

XX DB 0F0HYY DB ?DATA ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATASTART PROC FAR PUSH DSSUB AX,AX PUSH AXMOV AX,DATA MOV DS,AX

MOV AL,XX CMP AL,0 JGE BIGR MOV AL,0FFH MOV YY,AL;AL=-1 RET BIGR: JE EQUL MOV AL,1;AL=1EQUL: MOV YY,AL

RET START ENDP CODE ENDS END START實現(xiàn)方法:用地址表法。思路:將各分支程序的入口地址依次羅列形成一個地址表,讓BX指向地址表的首地址,從鍵盤接收或其他方式獲取要轉到的分支號,再讓BX與分支號進行運算,使BX指向對應分支入口地址,最后即可使用JMPWORDPTR[BX]

或JMPDWORDPTR[BX]

指令實現(xiàn)所要轉到的分支例:根據(jù)AL(1~8)中的值,轉移到不同分支(R1~R8)。解:1、建立分支地址表DATASEGMENTBRTAB DWR11,R12 DWR21,R22 DWR31,R32 …… DWR81,R82DATAENDS

分支1偏移地址R11分支1段地址R12分支2偏移地址R21分支2段地址R22分支3偏移地址R31分支3段地址R32…………分支8偏移地址R81分支8段地址R82解:2、實現(xiàn)分支轉移方法1:

LEABX,BRTABGTB: RCRAL,1 JC GETAD ADDBX,4 JMPGTBGETAD:

JMPDWORDPTR[BX]

分支1偏移地址R11分支1段地址R12分支2偏移地址R21分支2段地址R22分支3偏移地址R31分支3段地址R32…………分支8偏移地址R81分支8段地址R82例:根據(jù)AL(0~7)中的值,轉移到不同分支(R1~R8)。方法2:LEABX,BRTABMOVAH,0MUL04HADDBX,AXJMPDWORDPTR[BX]

分支1偏移地址R11分支1段地址R12分支2偏移地址R21分支2段地址R22分支3偏移地址R31分支3段地址R32…………分支8偏移地址R81分支8段地址R82BX例:根據(jù)AL(0~7)中的值,轉移到不同分支(R1~R8)。解:2、實現(xiàn)分支轉移循環(huán)結構程序設計1.設置循環(huán)的初始狀態(tài)設置循環(huán)次數(shù)的計數(shù)值,以及循環(huán)體正常工作的初始狀態(tài)等2.循環(huán)體由循環(huán)的工作部分及修改部分組成。3.循環(huán)控制部分循環(huán)程序設計的關鍵,每一個循環(huán)程序必須選擇一個循環(huán)控制條件來控制循環(huán)的運行和結束,通常有兩種方法控制循環(huán):用計數(shù)控制循環(huán),用條件控制循環(huán)

LOOPL1=DECCX

JNZL1先判斷條件,然后執(zhí)行循環(huán)體。DO-WHILE結構先執(zhí)行循環(huán)體,然后判斷條件。DO-UNTIL結構特點:至少執(zhí)行一次循環(huán)體。賦初值條件循環(huán)體修改YN開始賦初值循環(huán)體修改條件?NY開始例:顯示以0結尾的字符串。STRDB'Letushaveatry!',0 MOVBX,OFFSETSTRAGAIN: MOVDL,[BX] CMPDL,0 JZ

DONE

;為0結束

MOVAH,2 ;調用DOS功能的2號功能 INT21H;不為0,顯示

INCBX ;指向下一個字符

JMPAGAINDONE: ……例:求S=1+2+3+4+……+100解1:

MOVCX,100 MOVAX,0 MOVBX,1AG: ADDAX,BX INCBX LOOPAG MOVSUM,AX解2:

MOVCX,99 MOVAX,1 MOVBX,2AG: ADDAX,BX INCBX LOOPAG MOVSUM,AX例:從給定串中尋找最大的值,并放到MAX單元.元素放在BUFFER開始的單元中。解:分析:CX:循環(huán)比較次數(shù),循環(huán)次數(shù)=數(shù)據(jù)個數(shù)-1BX:數(shù)據(jù)指針LOOP:循環(huán)控制開始BX元素表首地址CXN-1BXBX+1AL=[BX]?AL、[BX]中的數(shù)交換CXCX-1CX=0?YN暫停YN參考程序:BUFFERDB21,33,45,67,98,10,…COUNTEQU$-BUFFERMAXDB?MOVCX,COUNT-1MOVBX,OFFSETBUFFERMOVAL,[BX]DON:INCBX;指向下一個數(shù)

CMPAL,[BX];AL-[BX]

JAP1;大于轉

MOVAL,[BX];交換

P1:LOOP

DONMOVMAX,AL……BUFFER213345679810COUNT6MAX?例:求N!分析:N等于0:

N!=1N不等于0:N!=N*(N-1)*(N-2)…*3*2*1AX=NBX=N-1AX<=1?AX=1退出AX=AX*BXBX=BX-1BX=0?YYNN程序段:

MOV AX,N CMP AX,1

JA NOZ

MOV AX,1

JMP

OKNOZ:

MOVBX,N-1LP1: MULBX DECBX JNZLP1OK: MOVYY,AXAX=NBX=N-1AX<=1?AX=1退出AX=AX*BXBX=BX-1BX=0?YYNN例:試編制程序把BX寄存器內的二進制數(shù)以十六進制形式在屏幕上顯示出來。分析:1、二進制到十六進制顯示必須轉換成ASCII碼,即0-9、41H-46H(A~F)2、BX寄存器為16位,共有4組4位二進制位,可用一個循環(huán)次數(shù)為4的循環(huán)逐一顯示。3、取出四位二進制位可以用循環(huán)左移指令,再將高四位與0FH相與。

MOVCH,4 LOOP1:MOVCL,4 ROLBX,CL;BX循環(huán)左移四位

MOVAL,BL ANDAL,0FH;取其低四位

ADDAL,30H;轉換為ASCII碼

CMPAL,3AH JL

DISP

;小于10,轉換完畢

ADDAL,7;大于等于10,換到A~FDISP: MOVDL,AL MOVAH,2 INT 21H

;顯示

DECCH ;循環(huán)次數(shù)減一

JNZ

LOOP1

;循環(huán)完成否繼續(xù)循環(huán)

設循環(huán)次數(shù)開始BX循環(huán)左移四位低四位+30H是A~F?+7顯示循環(huán)次數(shù)夠?退出例:設計一個100ms的軟件延時程序。采用多重循環(huán)程序,內循環(huán)完成10ms的延時,外層循環(huán)10次即可。CODE SENGMET ASSUME CS:CODESTART: MOV DL,10DELAY1: MOV CX,2800HDELAY2: LOOPDELAY2 DEC DL JNZ DELAY1

MOV AH,4CH INT 21HCODE ENDS END START以5MHz主頻為例,LOOP指令執(zhí)行需18個時鐘周期。10000*5/18=2800子程序設計子程序:相對主程序而言,是被主程序調用的程序.把功能相對獨立的程序段單獨編寫和調試,作為一個相對獨立的模塊供程序使用,就形成子程序子程序調用示意圖:

主子子子1子2主主主匯編語言中,子程序要用一對過程偽指令PROC和ENDP聲明,格式如下:

過程名

PROC[NEAR/FAR] …… ;過程體 過程名 ENDP可選的參數(shù)指定過程的調用屬性。沒有指定過程屬性,則采用默認屬性NEAR屬性(段內近調用)的過程只能被相同代碼段的其他程序調用FAR屬性(段間遠調用)的過程可以被相同或不同代碼段的程序調用子程序設計利用寄存器傳遞參數(shù)

主程序將參數(shù)保存到寄存器中,子程序通過訪問寄存器來取得變量。

子程序將參數(shù)保存到寄存器中,主程序通過訪問寄存器來取得變量。例:從鍵盤接收一個十進制數(shù),將其以十六進制的形式顯示出來。

分析:1)從鍵盤接收十進制數(shù),鍵盤輸入的是ASCII碼,要先轉換成十六進制30H-39H,如果輸入的不是數(shù)字,還要加以判斷。若輸入的是多位數(shù),也要加以判斷,并累加計算。2)輸入后在下一行顯示十六進制數(shù),應當有回車換行3)將十進制數(shù)轉換成十六進制數(shù)后,再逐一轉換成ASCII碼顯示CODESEGMENTASSUMECD:CODE,DS:DATAMAINPROCFAR

START: PUSH DS MOV AX,0 PUSH AX CALL DECIN

CALL CRLF

CALL BINTODEC

RETMAIN ENDPDECINPROCNEARMOV BX,0NEWCHAR:MOV AH,1;有回顯鍵盤輸入INT 21H;AL=鍵輸入ASCII碼SUB AL,30HJL EXITCMP AL,9JG EXITCBWXCHGAX,BXMOV CX,10MUL CXXCHGAX,BXADD BX,AXJMP NEWCHAREXIT:RETDECINENDPCRLF PROC NEAR MOVDL,0DH;回車ASCII碼

MOVAH,2 INT 21H;顯示回車

MOVDL,0AH;換行ASCII碼

MOVAH,2 INT 21H;顯示換行

RETCRLF ENDPBINTODECPROCNRARMOV CH,4NEXT2:MOV CL,4ROL BX,CLMOV AL,BLAND AL,0FHADD AL,30CMPAL,3AHJL PRINTADD AL,7PRINT:

MOV DL,AL MOV AH,2 INT 21H DEC CH JNZ NEXT2

RETBINTODECENDP例:從鍵盤接受一個十六進制數(shù)(0~0FFFFH,正數(shù)),轉換為十進制數(shù)并在屏幕上顯示出來分析:1)從鍵盤接受十六進制數(shù),用DOS的1號功能調用逐一接收,每接收完一個再接收下一個時應將先前的左移四位。2)接收完畢后最大為65536,顯示時可以將此數(shù)除以10000,1000,100,10,1將商逐一顯示即可。CODESEGMENTASSUMECD:CODE,DS:DATAMAINPROCFAR

START: PUSH DS MOV AX,0 PUSH AX CALL HEXIBIN CALL CRLF CALL BINIDEC

RETMAIN ENDPHEXIBINPROCNEARMOV BX,0NEW:

MOV AH,1INT 21HSUB AL,30HJL EXIT ;CMP AL,10DJL ADD_TOSUB AL,07HCMP AL,0AHJL EXITCMP AL,10HJGE EXITADD_TO:MOV CL,4SHL BX,CLMOV AH,0ADD BX,AXJMP NEWEXIT: RETHEXIBINENDPCRLF PROC NEAR MOV DL,0DH;回車ASCII碼

MOV AH,2 INT 21H;顯示回車

MOV DL,0AH;換行ASCII碼

MOV AH,2 INT 21H;顯示換行

RETCRLF ENDPBINIDECPROC NEARMOV CX,10000DCALL DEC_DIVMOV CX,1000DCALL DEC_DIVMOV CX,100DCALL DEC_DIVMOV CX,10DCALL DEC_DIVMOV CX,1DCALL DEC_DIVRETDEC_DIV PROCNEAR MOV AX,BX MOV DX,0 DIV CX MOV BX,DX MOV DL,AL ADD DL,30H MOV AH,2

INT 21H RETDEC_DIV ENDPBINIDEC ENDP利用共享變量(全局變量)進行參數(shù)傳遞例:子程序設計:冒泡排序規(guī)則:表中相鄰兩元素一一比較,并把大值元素向下交換,直至表尾(大值元素下沉),此時,稱為一次冒泡(程序中一次大循環(huán))。以后重復冒泡排序,直至最小元素冒到表頂為止。分析:假設有N個元素,則需要N-1次冒泡,每次冒泡需要的比較次數(shù)=N-1-J,J為完成的冒泡次數(shù).子程序名:ARRAY子程序功能:冒泡排序入口:TAB=數(shù)據(jù)首址,N=數(shù)據(jù)項數(shù)出口=顯示排好序的字符子程序設計DATASEGMENTTABDB10,23,5,16,9;定義字符串

N=$-TAB

;N在此等于5DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTAR:MOVAX,DATAMOVDS,AX;初始化數(shù)據(jù)段

CALL

ARRAY

;調用子程序

RET

在此定義子程序

CODEENDSENDARRAYPROCNEAR

MOVDL,N-1;外循環(huán)次數(shù)

MOVBX,0UPPER: MOVCX,N-1 SUBCX,BX;內循環(huán)次數(shù)

MOVSI,0

INNER: MOVAL,TAB[SI] INCSI CMPAL,TAB[SI] JBEDON

XCHGAL,TAB[SI] MOVTAB[SI-1],ALDON:

LOOPINNERINCBX DECDLCMPDL,0 JNZ

UPPER

OK:RETARRAYENDP

第五節(jié)DOS功能調用操作系統(tǒng)管理計算機,為用戶提供與CPU對話的接口,也就是提供使用鍵盤和顯示器的通道。操作系統(tǒng)同時管理設備、文件,這樣,用戶不需要具體掌握這些接口的地址,輸入輸出數(shù)據(jù)的格式,直接執(zhí)行操作系統(tǒng)提供的命令就可以了。比如DOS命令:DIR,TYPECOPY等。這是用戶在操作系統(tǒng)層面上的調用。在運行用戶程序時,DOS將操作權交給了用戶程序,用戶就無法再去執(zhí)行DOS的操作命令了,這時,用戶程序需要與鍵盤、顯示器等系統(tǒng)資源打交道該怎么辦?在高級語言中,在這種情況下都是調用編譯系統(tǒng)提供的庫函數(shù),也即編譯系統(tǒng)已把輸入輸出等操作功能做成函數(shù)的形式,用戶只要依據(jù)函數(shù)的格式進行調用即可。在匯編程序中,如果用戶程序要與輸入輸出設備打交道,就要調用現(xiàn)成的程序,這些程序是DOS系統(tǒng)的一部分,隨DOS系統(tǒng)駐留內存,用戶需要按照這些程序要求的接口格式調用。這些完成不同功能的子程序是以中斷服務程序的方式提供的。這些功能按不同的類別分成許多組,分別有不同的中斷入口,在匯編程序中最常用的是INT21H中斷入口,也稱為DOS系統(tǒng)功能調用。這個中斷入口中有90多個小程序,每個小程序都被編上號,固定完成某一種功能,調用時有一定的格式,因為對某一個小程序而言,輸入條件(入口參數(shù))和輸出結果(出口參數(shù))的格式都是固定的。用戶在使用時,既要給出小程序的編號(AH),又要按照其提供的格式進行調用,才能正確完成操作。系統(tǒng)功能調用的小程序有90多個,在這里只介紹與輸入輸出有關的一部分。1)在顯示器上顯示單個字符(2號功能)功能:在屏幕的光標處顯示單個字符入口參數(shù):要顯示字符的ASCII碼放在DL中出口參數(shù):無MOVDL,‘A’MOVAH,2INT21H;提供調用功能號;系統(tǒng)功能調用;在屏幕光標處顯示字符A運行至此,屏幕上當前光標處顯示字符A2)在屏幕上顯示字符串(9號功能)功能:在屏幕上當前光標處輸出存儲在內存數(shù)據(jù)段的一串字符串,該字符串以‘$’結束。入口參數(shù):DS:DX指向欲顯示字符串的首址出口參數(shù):無DATASEGMENTSTRINGDB‘Iamastudent.$’DATAENDS……MOVDX,OFFSETSTRINGMOVAH,9INT21H;指向字符串首址;提供調用功能號;系統(tǒng)功能調用3)帶顯示的鍵盤輸入(1號功能)功能:等待鍵盤輸入,直到按下一個鍵。入口參數(shù):無出口參數(shù):鍵入鍵的ASCII碼放在AL中,并在屏幕上顯示該鍵。MOVAH,1INT21HMOV[2000H],AL……;提供調用功能號;系統(tǒng)功能調用程序運行到此停下,等待用戶鍵盤輸入用戶從鍵盤鍵入的鍵的ASCII碼進入AL中4)不帶顯示的鍵盤輸入(7號功能)功能:等待鍵盤輸入,直到按下一個鍵。入口參數(shù):無出口參數(shù):鍵入鍵的ASCII碼放在AL中,但在屏幕上沒有顯示,常用于輸入密碼。MOVAH,7INT21HMOV[2000H],AL……;提供調用功能號;系統(tǒng)功能調用程序運行到此停下,等待用戶鍵盤輸入用戶從鍵盤鍵入的鍵的ASCII碼進入AL中該功能與1號功能類似,只是輸入的字符不在屏幕上顯示5)字符串輸入(10號功能)功能:等待從鍵盤輸入一串字符到存儲區(qū)的數(shù)據(jù)段,直到按下回車結束輸入。入口參數(shù):DS:DX指向接收字符串的內存地址的首址,該地址的第一個字節(jié)是由用戶設置的可輸入字符串的最大字符數(shù)(含回車)出口參數(shù):存放輸入字符串,存儲區(qū)的第二個字節(jié)是實際輸入的字符數(shù)(不含回車),實際輸入的字符串從該存儲區(qū)的第三個字節(jié)處開始存放。DATASEGMENTBUFDB20,20DUP(?)DATAENDS……LEADX,BUFMOVAH,0AHINT21H14H程序運行到此停下,等待用戶鍵盤輸入若輸入ABCD<CR>后BUFDX04H41H42H43H44H實際字符個數(shù)開始存放6)程序結束,返回DOS(4C號功能)功能:將控制權移交DOS。入口參數(shù):無出口參數(shù):無MOVAH,4CHINT21H在屏幕上顯示W(wǎng)hat’syourname?,用戶輸入自己的名字###后顯示:Welcome###。

DATASEGMENTMEGDB‘What’syourname?’,10,13,’$’MEG1DB'Welcome$'BUFDB30,?,30DUP(0)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AXLEADX,MEGMOVAH,9INT21HLEADX,BUFMOVAH,10INT21HLEADX,MEG1MOVAH,9INT21HXORBH,BHMOVBL,BUF+1MOV[BX+BUF+2],‘$’LEADX,BUF+2MOVAH,9INT21HMOVAH,4CHINT21HMAINENDPCODEENDSENDSTART;輸出字符串;接受姓名;輸出Welcome;輸出姓名;返回DOS輸入緩沖區(qū)以‘$’結尾顯示字符串后,回車,換行INCSICMPAL,0DH___________________________JNELOPMOVAH,4CHINT21HCODEENDSENDSTART下面程序從鍵盤重復接收一字符送BUFF開始的單元,直到接收到回車符0DH為止。DATASEGMENTBUFFDB128DUP(0)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX_______________LOP:_______________INT21HMOV[SI],ALLEASI,BUFFMOVAH,1第六節(jié)宏指令在匯編語言書寫的

溫馨提示

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

評論

0/150

提交評論