版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
匯編語言指令到機(jī)器指令的示意圖
4.1.1匯編語言源程序的結(jié)構(gòu)數(shù)據(jù)段名SEGMENT ……數(shù)據(jù)段名ENDS附加數(shù)據(jù)段名SEGMENT ……附加數(shù)據(jù)段名ENDS堆棧段名SEGMENT ……堆棧段名ENDS代碼段名SEGMENT ……代碼段名ENDS END每段以SEGMENT語句開始整個(gè)程序以END語句結(jié)束以ENDS語句結(jié)束下面舉例來加以說明:這是一個(gè)兩個(gè)字相加的程序
DSEGSEGMENT
;定義數(shù)據(jù)段
DATA1DW0F865H;定義被加數(shù)
DATA2DW360CH;定義加數(shù)
DSEGENDS
;數(shù)據(jù)段結(jié)束
ESEGSEGMENT
;定義附加段
SUMDW2DUP(?);定義存放結(jié)果區(qū)
ESEGENDS
;附加段結(jié)束
CSEGSEGMENT
;定義代碼段
ASSUMECS:CSEG,DS:DSEG,ES:ESEGSTART:MOVAX,DSEGMOVDS,AX;初始化DSMOVAX,ESEGMOVES,AX;初始化ESLEASI,SUM;存放結(jié)果的偏移地址送SIMOVAX,DATA1;取被加數(shù)
ADDAX,DATA2;兩數(shù)相加
MOVES:[SI],AX;和送附加段的SUM單元中
HLT
CSEGENDS
;代碼段結(jié)束
ENDSTART
;源程序結(jié)束總結(jié):1、標(biāo)號域語句中的標(biāo)號是一個(gè)標(biāo)示符,表示一條指令所在的存儲(chǔ)單元的地址,或叫符號地址。2、操作碼域:所有指令的助記符、偽指令等都在操作碼域。3、操作數(shù)域:操作數(shù)以逗號間隔。操作數(shù)可以是常數(shù)、寄存器、標(biāo)號、變量、表達(dá)式。4、注釋域:說明。4.1.2匯編語言語句類型語句類型:指令性語句、指示性語句指令性語句由指令組成、CPU可以執(zhí)行;指示性語句用來告訴編譯程序MASM如何對源程序進(jìn)行匯編,它不生成目標(biāo)代碼,不由CPU執(zhí)行,所以常稱為偽操作指令;例如:START:MOVAX,DATA DATADB11H,12H,13H標(biāo)號指令的符號地址,后邊通常加上“:”START是指令性語句的標(biāo)號;名字通常表示變量名、段名和過程名,后不加“:”指示性語句中的操作數(shù)可以有多個(gè),相互之間用逗號分開,DATA是指示性語句的名字。4.1.3數(shù)據(jù)項(xiàng)及表達(dá)式操作數(shù)可以是寄存器、存儲(chǔ)器單元或數(shù)據(jù)項(xiàng)。存儲(chǔ)器可以按字節(jié)、字、雙字DoubleWord、四字QuadWord、十字節(jié)操作。而數(shù)據(jù)項(xiàng)又可以是常量、標(biāo)號、變量或表達(dá)式。1、常量:分為數(shù)字常數(shù)和字符串常數(shù)。B:二進(jìn)制D:十進(jìn)制,可以省略H:十六進(jìn)制字符串常數(shù)用‘’單引號括起來,編譯程序?qū)⑵浞g成ASCII碼。
2.標(biāo)號Label指令的標(biāo)號由程序員確定:不能與指令助記符或偽指令重名;不允許由數(shù)字打頭;字符個(gè)數(shù)不超過31個(gè);標(biāo)號代表存放一條指令的存儲(chǔ)單元的地址;標(biāo)號可以作為程序轉(zhuǎn)移、過程調(diào)用、循環(huán)控制等指令的操作數(shù);標(biāo)號有三種屬性:段、偏移量、類型偏移量是一個(gè)16位的無符號數(shù);類型有兩種:近標(biāo)號NEAR(2字節(jié))和遠(yuǎn)標(biāo)號FAR(4字節(jié));
3.變量Variable變量是存儲(chǔ)器中某個(gè)數(shù)據(jù)區(qū)的名字,在指令中可以作為存儲(chǔ)器操作數(shù)使用;變量也具有三種屬性:段、偏移量、類型段值:一般在DS或ES寄存器;變量的類型:有BYTE、WORD、DWORD、QWORD、TBYTE;常用數(shù)據(jù)類型偽指令DB、DW、DD、DQ、DT來定義。例如: NUMDB11H,22H,33H DATA2 DW100H,200H
變量名與標(biāo)號名的區(qū)別:變量名是變量的符號地址,標(biāo)號是指令的符號地址。例如:
MOVAX,VAR1;(VAR1字變量) MOVBL,VAR2;(VAR2字節(jié)變量)
JMPDONE ……DONE: ADDAL,5變量名對應(yīng)數(shù)據(jù)區(qū)的首地址,若數(shù)據(jù)區(qū)有多個(gè)數(shù)據(jù),則在對其他數(shù)據(jù)操作時(shí)需要修改地址:NUMDB11H,23H,33H
MOVAL,NUM+24、表達(dá)式表達(dá)式不是指令,本身不能執(zhí)行。表達(dá)式中的運(yùn)算是在匯編時(shí)完成的,而不是在指令執(zhí)行時(shí)完成的。表達(dá)式常用運(yùn)算符有:算術(shù)運(yùn)算符:+、-、*、/和MOD(取余數(shù))邏輯運(yùn)算符:AND、OR、XOR、NOT關(guān)系運(yùn)算符:EQ(等于)、NE(不等于)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)取值運(yùn)算符:OFFSET、SEG屬性運(yùn)算符:PTR其他運(yùn)算符:[]、:表達(dá)式中的運(yùn)算符1、算術(shù)運(yùn)算符:+、-、*、/、求余(MOD)、它們運(yùn)算的結(jié)果都取整數(shù)。 MOVAL,8+5 MOVAX,NUM+8×22、邏輯運(yùn)算符與AND、或OR、異或XOR、非NOT四種,邏輯運(yùn)算符只能用于數(shù)值表達(dá)式,結(jié)果也是數(shù)值。例:ANDAL,0ADHAND0CCH注意:邏輯運(yùn)算符與邏輯運(yùn)算指令區(qū)別。3、關(guān)系運(yùn)算符相等EQ、不相等NE、小于LT、大于GT、小于等于LE、大于等于GE例:MOVAX,4EQ3 MOVAX,4NE3關(guān)系運(yùn)算符可對兩個(gè)性質(zhì)相同的數(shù)據(jù)進(jìn)行關(guān)系運(yùn)算,如果表達(dá)式成立,則運(yùn)算結(jié)果為真TRUE,輸出結(jié)果為全1;若表達(dá)式不成立,則表示結(jié)果為假FALSE,輸出為全0。匯編之后:MOVAX,0 MOVAX,0FFFFHSEG、OFFSET又稱為數(shù)值返回運(yùn)算符,用以獲取變量或標(biāo)號的屬性。例:MOVAX,SEGBUFFER MOVAX,OFFSETBUFFERPTR是類型運(yùn)算符:
CALLDWORDPTR[BX] MOVAL,BYTEPTR[SI]4、取值運(yùn)算符和類型運(yùn)算符4.2 偽指令偽指令由編譯程序執(zhí)行,不參與程序的運(yùn)行;功能:定義數(shù)據(jù)、分配存儲(chǔ)區(qū)、定義段、定義過程等。常用的偽操作指令:數(shù)據(jù)定義偽指令符號定義偽指令設(shè)定段寄存器偽指令過程定義偽指令宏命令偽指令模塊定義與連接偽指令4.2.1數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令用來定義一個(gè)變量,說明變量的類型,給變量分配存儲(chǔ)空間,并賦初值。一般格式為:
[變量名]偽操作助記符操作數(shù)1[,操作數(shù)2,…]
常用的數(shù)據(jù)定義偽操作有5種:
DB:定義字節(jié)類型的變量如: DELY1 DB 11H,22H,33H,44H DELY2 DB ‘HELLO’
DATA1 DB ?DW:定義字類型的變量
DATA2 DW 100H,200H NUM DW 100×5+88
11H22H33H44H‘H’‘E’‘L’‘L’‘O’...DELY1DELY2DD:定義雙字類型的變量如: DATA3 DD 35F87123HDQ:定義四字類型的變量DT:定義十字節(jié)類型的變量,每個(gè)操作數(shù) 為10個(gè)字節(jié)的壓縮BCD碼;SUMDQ0011223344556677H如果一個(gè)變量的操作數(shù)有多個(gè),而且都一樣;可以使用重復(fù)操作符DUP來定義:
DATA1DB20DUP(?) DATA2DB20DUP(30)
23H71HF8H35H…77H66H55H44H33H22H11H00H…DATA3SUM2、符號定義偽指令符號定義偽指令EQU用于給一個(gè)表達(dá)式賦予一個(gè)名字;指令格式:符號名EQU表達(dá)式例如:DATA EQU 0DH COUNT EQU Ten*2+1024 ADDR EQU ES:[BP+DI+5]注意:若表達(dá)式中有變量,則應(yīng)在EQU命令前定義。例如: P8 EQUDS:[BP+5]注意:不能重復(fù)定義同一個(gè)符號。
=可以對一個(gè)符號重復(fù)定義: FACTOR=10H
… FACTOR=25H3、段定義偽指令segment和ends段定義偽指令,定義源程序中的邏輯段;指令格式:段名SEGMENT[定位類型][組合類型][‘類別’]
……段名ENDS[定位類型]:說明該段對起始地址的要求;有四種選擇PARA,BYTE,WORD,PAGE PARA表示段必須從能被16整除的地址開始;[組合類型]:在具有多個(gè)模塊的程序中,它指示在匯編后進(jìn)行連接時(shí),該段是否和其它的段進(jìn)行組合,如果一個(gè)程序不需要和其他程序組合,也可省略該項(xiàng)。[類別]:用單引號擴(kuò)起來的字符串?!甋TACK’,‘CODE’,‘DATA’具有相同類別的邏輯段裝入連續(xù)的內(nèi)存區(qū);
stack segment parastack‘stack’
…… Stack ends該段是堆棧段,段名為stack;segment指明堆棧段開始;para說明該段必須從能被16整除的地址邊界開始;stack指明組合類型;‘stack’指明類別是堆棧類。注意:同一個(gè)段的起始和結(jié)束必須是同一個(gè)標(biāo)號名。4.2.4設(shè)定段寄存器的偽指令該偽指令的一般格式為:ASSUMECS:CODE,DS:DATA,ES:EDATA,SS:STACKASSUME偽指令說明用SEGMENT偽指令定義的段的段基址要放在那個(gè)段寄存器中;但是段基址裝入段寄存器的操作必須由程序?qū)崿F(xiàn)。
Code segmentparapublic‘code’ assumecs:code,ds:data,es:edata,ss:stackBegin: mov ax,data mov ds,ax mov ax,edata mov es,ax mov ax,stack mov ss,ax
……
4.2.5過程定義偽指令過程也叫子程序,過程名就是子程序的名字,也是子程序入口的符號地址,過程由PROC開始,至ENDP結(jié)束。PROC和ENDP之間的部分是過程體,過程體內(nèi)至少要有一條返回指令RET,以便在過程調(diào)用結(jié)束后返回主程序。過程定義偽指令一般格式:
NAME1 PROCFAR(NEAR) ……
RET NAME1 ENDP例:編寫一個(gè)20ms的延時(shí)子程序DELAY PROC PUSH BX PUSH CX MOVBL,2NEXT: MOV CX,2801W20ms: LOOP W20ms DEC BL JNZ NEXT POP CX POP BX
RETDELAY ENDP4.2.6宏命令偽指令宏命令名 MACRO[形式參數(shù),…]
…… ENDM宏定義和過程定義類似,但宏定義結(jié)束符ENDM前不加宏命令名;例如:DADD MARCOX,Y,Z MOVAX,X ADDAX,Y MOVZ,AX ENDM在源程序中調(diào)用:
DADDDATA1,DATA2,SUM形式參數(shù)宏調(diào)用與過程的區(qū)別:宏命令由宏匯編程序MASM在匯編過程中處理,MASM在每個(gè)宏調(diào)用處,都用其對應(yīng)的宏定義體替換;宏定義簡化了源程序,但不能簡化目標(biāo)程序;不節(jié)省內(nèi)存單元;宏指令執(zhí)行速度快;匯編結(jié)束偽指令格式: END 標(biāo)號例如:……ENDSTART;源程序結(jié)束,程序從START ;處開始執(zhí)行例:求從TABLE開始的10個(gè)無符號數(shù)的和,結(jié)果放在SUM單元中;
DATA SEGMENT TABLE DB12H,23H,34H,45H,56H DB67H,78H,89H,9AH,0FDH SUM DW? DATA ENDS STACK SEGMENT DW50DUP(?) TOP DW? STACK ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEAAX,TOP MOVSP,AX LEA SI,TABLE MOV CX,10 XOR AX,AXNEXT: ADD AL,[SI] ADC AH,0 INC SI LOOPNEXT MOV SUM,AX
MOVAH,4CH INT21H CODE ENDS END START4.3系統(tǒng)功能調(diào)用微機(jī)的操作系統(tǒng)中提供的功能調(diào)用有兩種,一種叫高級調(diào)用;另一種稱為BIOS功能調(diào)用,也叫低級調(diào)用;DOS功能調(diào)用都是利用軟中斷指令I(lǐng)NT21H來實(shí)現(xiàn)的,INT21H包含了90多個(gè)子功能,包括:設(shè)備管理、目錄管理、文件管理和其他功能,用戶可以直接使用。DOS操作系統(tǒng)將所有子功能順序編號,從00~57H。DOS功能調(diào)用DOS系統(tǒng)功能調(diào)用的方法如下:MOVAH,功能號在其它寄存器中放人該功能所要求的入口叁數(shù);INT21H分析出口參數(shù)。1號功能:系統(tǒng)掃描鍵盤,等待從鍵盤輸入一個(gè)字符,將字符送入寄存器AL。如果輸入的是CTRL+BREAK,則退出調(diào)用;否則將輸入的字符存入AL。
MOVAH,1 INT21H功能號1、7、8
[例4-8]從鍵盤輸入一個(gè)“Y”或“N”字符。
……KEY:MOVAH,1;有回顯的鍵盤輸人。功能號1送(AH) INT21H;當(dāng)按下鍵后,返回(AL)=字符的ASCII碼
CMPAL,'Y';比較鍵人的是否是Y JZYES;鍵入字符“Y”則轉(zhuǎn)至Yes語句處
CMPAL,'N';比較健人的是否是N JZNOT;鍵人字符“N”則轉(zhuǎn)至NOT語句處
JMPKEY;鍵入其他字符,轉(zhuǎn)至KEY語句處,繼續(xù)等待鍵人YES: ……NOT: ……0A號功能:輸入字符串此功能要求用戶指定一個(gè)鍵入緩沖區(qū)來存放輸入的字符串,緩沖區(qū)起始偏移地址預(yù)置入DX寄存器。緩沖區(qū)結(jié)構(gòu)如圖,其中第一字節(jié)為用戶定義的緩沖區(qū)長度,第二個(gè)字節(jié)為實(shí)際鍵入的字符數(shù)(不包括回車符),它由0A號功能自動(dòng)填入;從第三個(gè)字節(jié)開始存放鍵入的字符;若實(shí)際鍵入的字符數(shù)(包括回車符)大于用戶定義的緩沖區(qū)長度,則喇叭會(huì)嘟嘟響;緩沖區(qū)長度n實(shí)際字符數(shù)…DX保存輸入的字符
[例4—9]從鍵盤上輸入字符串‘HELLO’,并在串尾加結(jié)束標(biāo)志‘$’。
DATA SEGMENTSTRING DB10,0,10DUP(?);定義緩沖區(qū)
DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX
LEADX,STRING MOVAH,0AH;功能號送AH
INT21H
MOVCL,STRING+1;實(shí)際鍵入的
XORCH,CH ;字符個(gè)數(shù)送CL100$STRING
ADDDX, 2 ADDDX,CX;得到字符串尾地址
MOVBX,DX MOVBYTEPTR[BX],'$';插入串結(jié)束符
MOVAH,4CH INT21HCODE ENDS ENDSTART2、顯示器輸出(2、6、9)用2號功能顯示一個(gè)字符:
…
MOVDL,<要顯示的字符ASCII> MOVAH,2 INT21H
…
… MOVDL,<要顯示的字符> MOVAH,6 INT21H
…用9號功能顯示一個(gè)字符串:該功能要求被顯示的字符串必須以“$”結(jié)束;如果希望光標(biāo)能自動(dòng)換行,則應(yīng)在字符串結(jié)束前加上回車及換行的ASCII碼0DH和0AH;
MOVDX,OFFSETCHARS;字符串起始地址送DXMOVAH,09H;字符串顯示功能
INT21H;用6號功能顯示一個(gè)字符:3.退回到DOS
為了能使程序正常退出并返回DOS,可使用DOS系統(tǒng)功能調(diào)用的4CH號功能。用4CH號功能返回DOS的程序段如下:
…MOVAH,4CH;功能號送AHINT21H;返回DOSMOVAX,4C00HINT21H8086/8088匯編語言程序設(shè)計(jì)一、程序設(shè)計(jì)的基本步驟:分析問題確定算法畫程序流程圖為數(shù)據(jù)和程序代碼分配內(nèi)存單元和寄存器編寫源程序匯編、調(diào)試與修改二、匯編語言源程序基本設(shè)計(jì)方法
1、順序程序設(shè)計(jì)
2、分支程序設(shè)計(jì)
3、循環(huán)程序設(shè)計(jì)
4、子程序設(shè)計(jì)程序設(shè)計(jì)應(yīng)盡量采用結(jié)構(gòu)化、模塊化的設(shè)計(jì)方法。將程序按功能劃分成一個(gè)個(gè)獨(dú)立的模塊,每個(gè)模塊進(jìn)行獨(dú)立的編輯和匯編,生成自己的源文件和目標(biāo)文件,然后通過鏈接形成一個(gè)完整的可執(zhí)行文件。4.4.2順序程序沒有分支、沒有循環(huán)、沒有轉(zhuǎn)移[例4-11]對于三個(gè)8位無符號數(shù)86H、34H和21H,編寫S=86H×34H-21H的程序。取被乘數(shù)求乘積取乘數(shù)取第三個(gè)數(shù)作操作數(shù)做減法結(jié)果送指定處結(jié)束初始化取被乘數(shù)求乘積取乘數(shù)取第三個(gè)數(shù)作操作數(shù)做減法結(jié)果送指定處
NUMDB86H,34H,21HRESULTDW?SI作為數(shù)據(jù)區(qū)的指針;
DI作為結(jié)果指針;DATA SEGMENTNUMDB86H,34H,21H;定義源操作數(shù)RESULTDW?;定義結(jié)果存放單元DATA ENDSCODE SEGMENT
ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEASI,NUM
LEADI,RESULT MOVAL,[SI] MOVBL,[SI+1] MULBL ;求乘積
MOVBL,[SI+2] ;取第三個(gè)數(shù)作操作數(shù)
MOVBH,0 SUBAX,BX MOV[DI],AX ;結(jié)果送RESULT
MOVAH,4CH ;返回DOS INT21H
CODEENDS
ENDSTART[例4—12]內(nèi)存自TABLE開始的連續(xù)16個(gè)單元中存放著0~15的平方值(稱平方表),查表求DATA中任意數(shù)X(0≤X≤15)的平方值,并將結(jié)果放在RESULT中.DSEGSEGMENTTABLEDB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225;定義平方表DATADB?RESULTDB?;定義結(jié)果存放單元DSEGENDSSSEGSEGMENTSTACK'STACK'STA DW100DUP(?);定義堆??臻gSSEGENDS014916…TABLEBX
CSEGSEGMENT
ASSUMECS:CSEG,DS:DSEG,SS:SSEGBEGIN: MOVAX,DSEG ;初始化數(shù)據(jù)段 MOVDS,AX MOVAX,SSEG ;初始化堆棧 MOVSS,AX
LEABX,TABLE ;置數(shù)據(jù)指針 MOVAH,0 MOVAL,DATA ;取待查數(shù)ADDBX,AX ;查表MOVAL,[BX]MOVRESULT,AL ;平方數(shù)存RESULT
MOVAH,4CH INT21H
CSEG ENDS ENDBEGIN4.4.3分支程序設(shè)計(jì)條件1成立?…條件2成立?條件n成立?Pn+1PnP2P1YYYNNN判定條件P1P2YN分支程序的基本結(jié)構(gòu)(a)(b)[例4-13]編寫程序,將數(shù)據(jù)區(qū)中以字節(jié)變量BUFFER為首地址的100個(gè)單元清零。
DATA SEGMENTBUFFERDB100DUP(?)COUNTDB100;定義數(shù)據(jù)緩沖區(qū)長度
DATAENDS
STACKSEGMENT ‘STACK’DW32DUP(?)STACKENDS
CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX;初始化數(shù)據(jù)段 MOV AX,STACK MOV SS,AX;初始化堆棧段MOV CX,COUNT ;置單元長度
LEABX,BUFFERAGAIN:MOV [BX],0;實(shí)現(xiàn)100個(gè)單元清零 INC BX DECCX JNZ AGAIN
MOV AH,4CH INT 21H
CODEENDSENDSTARTDATA SEGMENTBUFFERDB100DUP(?)DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX MOVCX,100 ;置緩沖區(qū)長度
LEABX,BUFFERAGAIN:MOV[BX],0 INCBX
LOOP AGAIN
MOV AH,4CH INT 21HCODEENDS ENDSTART3、循環(huán)程序設(shè)計(jì)1、循環(huán)程序設(shè)計(jì)結(jié)構(gòu)初始化部分工作部分修改部分循環(huán)結(jié)束?結(jié)束部分初始化部分循環(huán)結(jié)束?工作部分修改部分結(jié)束部分先執(zhí)行后判斷先判斷后執(zhí)行循環(huán)控制的方法控制循環(huán)有多種方法:1、計(jì)數(shù)器控制循環(huán);2、條件控制循環(huán);3、邏輯尺控制循環(huán);4、開關(guān)變量控制循環(huán)(分支規(guī)律已知,計(jì)數(shù)次數(shù)或循環(huán)條件已知);[例4-14]在數(shù)據(jù)段DATA1開始的80個(gè)連續(xù)的存儲(chǔ)單元中,存放80位同學(xué)某門課程的考試成績(0~100)。編寫程序統(tǒng)計(jì)成績≥90分的人數(shù),80~89分的人數(shù),70~79分的人數(shù),60~69分以及<60分的人數(shù)。將結(jié)果存放到DATA2開始的存儲(chǔ)單元中。
DATASEGMENTDATA1DB80DUP(?);假定學(xué)生成績已放入這80個(gè)單元中
DATA2DB5DUP(0);統(tǒng)計(jì)結(jié)果的存放單元
DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
MOVCX,80;統(tǒng)計(jì)80個(gè)學(xué)生的成績
LEASI,DATA1 LEADI,DATA2AGAIN:MOVAL,[SI]CMPAL,90;與90比較
JCNEXT1;小于90分,轉(zhuǎn)NEXT1 INCBYTEPTR[DI];否則90分以上的人數(shù)加1JMPSTO;轉(zhuǎn)循環(huán)控制處理
NEXT1:CMPAL,80;與80比較
JCNEXT2 ;小于80分,轉(zhuǎn)NEXT2INCBYTEPTR[DI+1];否則80分以上的人數(shù)加1 JMPSTONEXT2:CMPAL,70;與70比較
JCNEXT3 ;小于70分,轉(zhuǎn)NEXT3INCBYTEPTR[DI+2];否則70分以上的人數(shù)加1
JMPSTONEXT3:CMPAL,60;與60比較
JCNEXT4;小于60分,轉(zhuǎn)NEXT4INCBYTEPTR[DI+3];否則60分以上的人數(shù)加1JMPSTO;轉(zhuǎn)循環(huán)控制處理NEXT4NEXT4:INCBYTEPTR[DI+4];60分以下的人數(shù)加1STO:INCSI;指向下一個(gè)學(xué)生成績
LOOPAGAIN;循環(huán),直到所有成績都統(tǒng)計(jì)完
MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART[例如4-21]兩個(gè)多字節(jié)二進(jìn)制數(shù)求和程序;
DATA SEGMENT BUFF1 DB4FH,0B6H,7CH,34H,56H,1FH BUFF2 DB13H,24H,57H,68H,0FDH,9AH SUM DB6DUP(?)
COUNT DB3 DATA ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSETBUFF1 MOV DI,OFFSETBUFF2 MOV BX,OFFSETSUM
MOVCL,COUNT ;初始化計(jì)數(shù)器
MOV CH,0 CLC ;CF=0GOON: MOVAX,[SI] ADC AX,[DI] INC SI INC SI INCDI INCDI MOV [BX],AX INC BX INCBX LOOP GOON MOV AH,4CH INT 21H CODE ENDS ENDSTART三、多重循環(huán)程序設(shè)計(jì)例在以BUF為首址的字存儲(chǔ)區(qū)中存放有N個(gè)有符號數(shù),現(xiàn)需將它們按大到小的順序排列在BUF存儲(chǔ)區(qū)中,試編寫其程序。冒泡排序算法:從第一個(gè)數(shù)開始依次對相鄰兩個(gè)數(shù)進(jìn)行比較,如次序?qū)?,則不交換兩數(shù)位置;如次序不對則使這兩個(gè)數(shù)交換位置??梢钥闯?,第一遍需比較(N-1)次,此時(shí),最小的數(shù)已經(jīng)放到了最后;第二遍比較:只需考慮剩下的(N-1)個(gè)數(shù),即只需比較(N-2)次;第三遍只需比較(N-3)次,……整個(gè)排序過程最多需(N-1)遍。如下面的4個(gè)數(shù)即是采用冒泡排序比較的例子。數(shù)
10 8 16 90 32第一遍
10 16 90 32 8第二遍
16 90 32 10 8第三遍
90 32 16 10 8程序流程圖如圖4.9所示。DSEGSEGMENTMEMDWl00DUP(?);假定要排序的數(shù)已DSEGENDS ;存入這200個(gè)單元中CSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXLEADI,MEM ;DI指向MEM的首址
MOVBL,99;外循環(huán)只需99次即可[例4-15]把從MEM單元開始的l00個(gè)16位無符號數(shù)按從大到小的順序排列。
;外循環(huán)體從此開始NEXT1:MOVSI,DI ;SI指向當(dāng)前要比較的數(shù)MOVCL,BL;CL為內(nèi)循環(huán)計(jì)數(shù)器,循環(huán)次數(shù)每次減l;以下為內(nèi)循環(huán)NEXT2:MOVAX,[SI] ;取第一個(gè)數(shù)NiADDSI,2 ;指向下一個(gè)數(shù)Nj,CMPAX,[SI] ;比較Ni和NjJNCNEXT3 ;若Ni大于Nj,則不交換
MOVDX,[SI] ;否則,交換Ni和Nj
MOV[SI-2],DX
MOV[SI],AXNEXT3:DECCL ;內(nèi)循環(huán)結(jié)束?JNZNEXT2 ;若未結(jié)束,則繼續(xù) ;內(nèi)循環(huán)到此結(jié)束
DECBL;外循環(huán)結(jié)束?
JNZNEXT1;若未結(jié)束,則繼續(xù)
;外循環(huán)體結(jié)束
MOVAX,4C00H;返回DOSINT21HCSEGENDSENDSTART4、子程序設(shè)計(jì)1、子程序的作用:
功能獨(dú)立,可重復(fù)調(diào)用;便于程序設(shè)計(jì)模塊化;
將多次重復(fù)的程序段或語句序列設(shè)計(jì)成可供反復(fù)調(diào)用的獨(dú)立的子程序結(jié)構(gòu)。 調(diào)用子程序的程序稱為主調(diào)程序或主程序。 子程序執(zhí)行完后,返到主程序處繼續(xù)執(zhí)行主程序,稱為“返回主程序”,即返主。 主程序的概念是相對的。使用子程序的注意事項(xiàng):參數(shù)傳遞主程序現(xiàn)場保護(hù):常常是子程序用到的寄存器主程序也會(huì)用到,為了防止破壞主程序中寄存器的內(nèi)容,需要在子程序入口處將其所用到的寄存器內(nèi)容壓棧保護(hù)。(1)寄存器法(2)約定存儲(chǔ)單元法(3)堆棧法子程序設(shè)計(jì)通常一個(gè)完整的子程序由下面五個(gè)部分組成:①子程序入口:通常用子程序名作為子程序入口,也就是標(biāo)號地址。②保護(hù)現(xiàn)場:為了不破壞主程序原有信息,進(jìn)入子程序首先把子程序中將要用到的寄存器、存儲(chǔ)單元等壓入堆?;虼嫒肟沾鎯?chǔ)單元中。③子程序體④恢復(fù)現(xiàn)場:把前邊保護(hù)的現(xiàn)場信息進(jìn)行恢復(fù)。⑤子程序返回:RET指令,返回到主程序的斷點(diǎn)處,繼續(xù)執(zhí)行主程序。3.子程序說明文件為方便使用,要建立子程序的文檔說明,即子程序說明文件。一般有以下幾項(xiàng)內(nèi)容:(1)子程序名:有一定意義的標(biāo)識符,同時(shí)也是該子程序的入口地址;(2)子程序功能:子程序完成的具體任務(wù);(3)子程序中所用寄存器和工作單元;(4)子程序輸入?yún)?shù):子程序運(yùn)行所需參數(shù)及通過寄存器、存儲(chǔ)單元或堆棧傳遞;(5)子程序輸出參數(shù):子程序運(yùn)行完畢的結(jié)果參數(shù)由哪些寄存器、存儲(chǔ)單元或堆棧傳遞。(6)調(diào)用實(shí)例:給出調(diào)用示范例子?!?……….MOVAX,LEN1PUSHAXLEAAX,ARY1PUSHAX存放參數(shù)PUSHBPMOVBP,SPPUSHAXPUSHBXPUSHCXPUSHF保護(hù)現(xiàn)場主程序Flash子程序取得參數(shù)MOVCX,[BP+6]MOVBX,[BP+4]ADD1:求和并且保存結(jié)果XORAX,AXADDAL,[BX]ADCAH,0INCBXLOOPADD1MOV[BX],AX恢復(fù)現(xiàn)場POPFPOPCXPOPBXPOPAXPOPBP返回主程序RET4調(diào)用子程序CALLSUM存放參數(shù)MOVAX,LEN2PUSHAXLEAAX,ARY2PUSHAX調(diào)用子程序CALLSUM用堆棧段傳遞參數(shù)DATASEGMENTARY1DB03H,07H,50H,06H,23H,45H,0F6H,0DFHLEN1EQU$-ARY1SUM1DW?ARY2DB33H,44H,55H,12H,78H,89H,0FFH,0CDHLEN2EQU$-ARY2SUM2DW?DATAENDSSTACKSEGMENTSTACK’STACK’DB100DUP(‘S‘)STACKENDSCODESEGMENTPARA‘CODE’ASSUMECS:CODE,DS:DATA,SS:STACKSTAPROCFAR
PUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,LEN1PUSHAXLEAAX,ARY1PUSHAXCALLSUMMOVAX,LEN2PUSHAXLEAAX,ARY2PUSHAXCALLSUMRETSTAENDPFlash
SUMPROCPUSHBPMOVBP,SPPUSHAXPUSHBXPUSHCXPUSHFMOVCX,[BP+6]
MOVBX,[BP+4]
XORAX,AXADD1:ADDAL,[BX]
ADCAH,0 INCBX LOOPADD1 MOV[BX],AX POPF POPCX POPBX POPAX POPBPRET4
SUMENDPCODEENDSENDSTAFlash子程序應(yīng)用舉例例4.12將一個(gè)給定的二進(jìn)制數(shù)按位轉(zhuǎn)換成相應(yīng)的ASCII碼字符串,送到指定的存儲(chǔ)單元并顯示。如二進(jìn)制數(shù)10010011轉(zhuǎn)換成字符串為‘10010011’。要求將轉(zhuǎn)換過程寫成子程序,且子程序應(yīng)具有較好的通用性,而必須能實(shí)現(xiàn)對8位和16位二進(jìn)制數(shù)的轉(zhuǎn)換。;入口參數(shù):DX存放待轉(zhuǎn)換的二進(jìn)制數(shù);;CX存放待轉(zhuǎn)換數(shù)的位數(shù)(8位或16位);;DI存放ASCII碼首地址;;出口參數(shù):轉(zhuǎn)換后的字符串存放在以DI作指針的字節(jié)存貯區(qū)中;程序如下:DATA SEGMENTNUM8 DB 93HNUM16DW 0ABCDHASCBUFDB 20DUP(0)DATA ENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:dataSTART: MOVAX,DATAMOVDS,AXMOVDX,0MOVDL,NUM8 ;轉(zhuǎn)換二進(jìn)制數(shù)送DXMOVCX,8 ;置位數(shù)8LEADI,ASCBUF ;字符串首址→DICALLBTASC ;調(diào)用子程序BTASCMOV[DI],BYTEPTR0DHMOV[DI+1],BYTEPTR0AH
MOV [DI+2],BYTEPTR'$' LEA DX,ASCBUF;顯示轉(zhuǎn)換后的字符串
MOV AH,9 INT 21H MOV DX,NUM16 MOV CX,16 ;置位數(shù)16 LEA DI,ASCBUF CALL BTASCMOV [DI],BYTEPTR0DH MOV [DI+1],BYTEPTR0AH MOV [DI+2],BYTEPTR'$';顯示轉(zhuǎn)換后的字符串
LEA DX,ASCBUF MOV AH,9 INT 21H MOVAH,4CH INT21HBTASC PROC PUSH AX ;保存AX CMP CX,8 ;比較8位數(shù)
JNE L1 ;直接轉(zhuǎn)換16位數(shù)
MOV DH,DL;8位數(shù)轉(zhuǎn)換送DHL1: MOV AL,0 ROL DX,1 ;DX最高位移入CF RCL AL,1 ;CF移入AL最低位
ADD AL,30H MOV [DI],AL
INC DI LOOPL1 POPAX RETBTASC ENDPCODE ENDS END START返回本節(jié)運(yùn)行匯編語言源程序一、運(yùn)行匯編語言源程序的步驟編輯源程序,調(diào)用編輯程序(edit)建立一個(gè)擴(kuò)展名為.asm的源程序文件;匯編源程序。調(diào)用匯編程序MASM.EXE對XX.ASM進(jìn)行匯編,生成XX.OBJ目標(biāo)文件;連接:調(diào)用LINK.EXE連接程序,將XX.OBJ目標(biāo)程序轉(zhuǎn)換為可執(zhí)行文件XX.EXE;調(diào)試程序:調(diào)用DEBUG.COM調(diào)試程序進(jìn)行調(diào)試。運(yùn)行可執(zhí)行文件XX.EXE;輔助工具程序(.EXE)進(jìn)行匯編語言程序調(diào)試有:
DEBUG.COM動(dòng)態(tài)調(diào)試程序
CREF.EXE交叉引用程序
TD(turboDebugger簡稱)也是動(dòng)態(tài)調(diào)試程序,可在DOS和Windows環(huán)境下運(yùn)行,用戶界面十分友好。
匯編源程序
用編輯軟件建立的源程序.ASM文件,必須經(jīng)過匯編才能產(chǎn)生.OBJ文件。為此,需鍵入:
C:>MASM<源文件名>
屏幕上顯示:
Microsoft(R)MacroassembleVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987ALLrightsreserved
OBJfilename[<file>.obj]:
Sourcelisting[nul.lst]:
Cross-reference[nul.crf]:
匯編后生成以下幾個(gè)文件:(1).OBJ文件
.OBJ文件是目標(biāo)代碼文件,當(dāng)源程序中無語法錯(cuò)誤時(shí),則在當(dāng)前工作盤上自動(dòng)存入一個(gè).OBJ文件,供下一步連接用。
若源程序有語法錯(cuò)誤時(shí),會(huì)出現(xiàn)錯(cuò)誤信息提示:
源程序文件行
錯(cuò)誤信息代碼
錯(cuò)誤說明信息
××Warningerrors(警告錯(cuò)誤)
××Severeerrors(嚴(yán)重錯(cuò)誤)
若嚴(yán)重錯(cuò)誤總數(shù)不為0,則.OBJ文件沒有生成,需回到編輯狀態(tài)下修改源程序直到無錯(cuò)為止。(2).LST文件(列表文件)
.LST文件對調(diào)試程序有幫助,它是將源程序中各語句及其對應(yīng)的目標(biāo)代碼和符號表以清單方式列出(3).CRF文件(交叉引用文件)
.CRF文件給出了源程序中定義的符號引用情況,按字母順序排列。.CRF文件不可顯示,須用CREF.EXE系統(tǒng)程序?qū)?CRF文件轉(zhuǎn)換成為.REF文件后方可顯示輸出。
三、
連接目標(biāo)程序
匯編后生成的.OBJ文件,其所有目標(biāo)代碼的地址都是浮動(dòng)的偏移地址,機(jī)器不能直接運(yùn)行。必須用連接程序(LINK.EXE)對其進(jìn)行連接裝配定位,產(chǎn)生.EXE可執(zhí)行文件,方可運(yùn)行。
在系統(tǒng)提示符下鍵入:LINK<源程序文件名>屏幕上出現(xiàn)以下提示信息:
Microsoft(R)MacroassembleVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987ALLrightsreserved
Runfile[<file>.EXE]:
ListFile[nul.map]:
Libraries[.lib]:
LINK<file>;多了一個(gè)分號,表示結(jié)束后續(xù)詢問。
連接后,可生成兩種文件:.EXE和.MAP
(1).EXE文件(可執(zhí)行文件)
若連接過程中無錯(cuò)誤,則自動(dòng)在當(dāng)前工作盤生成.EXE文件。若有錯(cuò)誤,則會(huì)給出錯(cuò)誤信息提示,這時(shí)必須重新修改源程序,再匯編、連接。
(2).MAP(連接映像文件)
(3).LIB庫文件
連接程序詢問是否使用某種庫文件,不需使用庫文件直接按回車鍵。
(4)若要連接多個(gè)模塊目標(biāo)程序,可用“+”把它們連接起來。如:LINKfiles1+files2+files3如:
LINK<file>;多了一個(gè)分號,表示結(jié)束后續(xù)詢問。啟動(dòng)DEBUG程序§1.啟動(dòng)DEBUG程序
①在DOS提示符下鍵入:DEBUG↙(表示回車) Debug執(zhí)行,屏幕顯示提示符“-”,說明計(jì)算機(jī)當(dāng)前處于DEBUG的管理之下,可接受、并執(zhí)行DEBUG命令。②在DOS提示符下鍵入:DEBUG[路徑\]文件名↙
DEBUG執(zhí)行,并將指定文件裝入內(nèi)存,供調(diào)試。命令格式
§2DEBUG命令和參數(shù)的格式
1.命令格式
命令字母[參數(shù)]
字母不分大小寫;只使用16進(jìn)制數(shù),不加H;分割符只在兩個(gè)數(shù)值之間是必須的,命令和參數(shù)之間可有可無;鍵入回車鍵執(zhí)行命令,Ctrl+Break或Ctrl+C中止命令的執(zhí)行;如命令不符合DEBUG的規(guī)則,則提示“error”并使用“^”指示錯(cuò)誤位置。參數(shù)格式12.參數(shù)格式 ①表示地址(邏輯地址):段地址:偏移地址D0400:2500D10ac:0 Dds:04Dcs:100偏移地址D2505D100;DEBUG認(rèn)為輸入的是偏移地址,段地址采用默認(rèn)的段寄存器,不同的命令默認(rèn)不同的段寄存器,例如匯編命令默認(rèn)CS,顯示數(shù)據(jù)命令默認(rèn)DS。既不送段地址,也不送偏移地址,段地址采用默認(rèn)的段寄存器,偏移地址采用當(dāng)前值。只送段地址,省略偏移地址,非法。 如DDS:或D0400:參數(shù)格式12.參數(shù)格式 ①表示地址(邏輯地址):段地址:偏移地址D0400:2500D10ac:0 Dds:04Dcs:100偏移地址D2505D100;DEBUG認(rèn)為輸入的是偏移地址,段地址采用默認(rèn)的段寄存器,不同的命令默認(rèn)不同的段寄存器,例如匯編命令默認(rèn)CS,顯示數(shù)據(jù)命令默認(rèn)DS。既不送段地址,也不送偏移地址,段地址采用默認(rèn)的段寄存器,偏移地址采用當(dāng)前值。只送段地址,省略偏移地址,非法。 如DDS:或D0400:參數(shù)格式2
②表示范圍開始地址結(jié)束地址如“DDS:050”,“D2AC0:100200”,“D100120”注意:結(jié)束地址不能帶段地址開始地址L字節(jié)長度如“DDS:0L10”,“D100L20”命令索引命令索引D命令
R命令
U命令
G命令
T命令
Q命令N命令L命令P命令A(yù)命令E命令F命令 W命令 C命令H命令 S命令I(lǐng)命令O命令M命令D命令§3.DEBUG命令1.顯示命令D①D[地址]②D[范圍]
;如不指定范圍,一次顯示8行×16個(gè)字節(jié)。-D;默認(rèn)段寄存器為DS,當(dāng)前偏移地址-DDS:100/-DCS:200
-D200:100
-D200;200為偏移地址,默認(rèn)段寄存器DS
-DDS:100110/-D100L10E命令
2.修改命令E ①E地址;從指定地址開始,修改(或連續(xù)修改)存儲(chǔ)單元內(nèi)容。DEBUG首先顯示指定單元內(nèi)容,如要修改,可輸入新數(shù)據(jù);空格鍵顯示下一個(gè)單元內(nèi)容并可修改,減號鍵顯示上一個(gè)單元內(nèi)容并可修改;如不修改,可直接按空格鍵或減號鍵;回車鍵結(jié)束命令。 ②E地址數(shù)據(jù)表;從指定的地址開始用數(shù)據(jù)表給定的數(shù)據(jù)修改存儲(chǔ)單元。-EDS:100F3‘AB’8D。F命令3.添充命令F F范圍數(shù)據(jù)表;將數(shù)據(jù)表寫入指定范圍的存儲(chǔ)單元;數(shù)據(jù)個(gè)數(shù)多,忽略多出的數(shù)據(jù),個(gè)數(shù)少,則重復(fù)使用數(shù)據(jù)表。-FDS:0L501
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第四單元學(xué)情評估(含答案)2024-2025學(xué)年統(tǒng)編版七年級語文下冊
- 《認(rèn)清國情》課件
- 子宮角妊娠的健康宣教
- 頭皮毛囊炎的臨床護(hù)理
- 《教你門窗工程預(yù)算》課件
- 《機(jī)械設(shè)計(jì)基礎(chǔ)》課件-第6章
- 《Java程序設(shè)計(jì)及移動(dòng)APP開發(fā)》課件-第09章
- 粉刺的臨床護(hù)理
- 痱子的臨床護(hù)理
- JJF(陜) 092-2022 醫(yī)用電動(dòng)頸腰椎牽引治療儀校準(zhǔn)規(guī)范
- 《3DMAX》課程標(biāo)準(zhǔn)(高職環(huán)境藝術(shù)設(shè)計(jì)專業(yè))
- 2023年健康管理師(基礎(chǔ))考題及答案
- 說課大賽作品于素玲9-《藥物制劑技術(shù)》課程設(shè)計(jì)
- 2023年部編版道德與法治小學(xué)三年級上冊教學(xué)計(jì)劃(含進(jìn)度表)
- 2025屆高三復(fù)習(xí)備考工作計(jì)劃暨行動(dòng)方案
- 三位數(shù)乘以三位數(shù)-計(jì)算題-豎式-50題-
- 醫(yī)療器械商貿(mào)公司簡介
- 《邏輯的力量》課件++2023-2024學(xué)年統(tǒng)編版高中語文選擇性必修上冊
- 內(nèi)科主任職責(zé)
- 搬遷保密工作方案
- 油款欠賬合同
評論
0/150
提交評論