第四章-匯編語言程序設(shè)計-2_第1頁
第四章-匯編語言程序設(shè)計-2_第2頁
第四章-匯編語言程序設(shè)計-2_第3頁
第四章-匯編語言程序設(shè)計-2_第4頁
第四章-匯編語言程序設(shè)計-2_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

宏指令及其使用宏指令、宏定義和宏調(diào)用宏指令

源程序中具有獨立功能的一段程序代碼宏定義

宏指令名MACRO<形式參數(shù)> … ;

… 宏體

… ;

ENDM宏調(diào)用

宏調(diào)用的格式為: 宏指令名<實際參數(shù)>例:1)PUSHREG MACRO PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DIENDM2)LOADWMACROPR,VAR MOV PR,VAR MOV AX,[PR]ENDM3)SHIFTMACRON,REG,CC MOV CL,N S&CC REG,CLENDM4)SAVEWMACROPR,REG,OPC MOV [PR],REG OPC PRENDMLOADW SI,WVARSHIFT 4,AX,ARSAVEW SI,AX,INC…將某變量指針WVAR指向的內(nèi)存單元的內(nèi)容送AX寄存器。右移4位后,再存入WVAR變量處。MULTIPLYMACROOPR1,OPR2,RESULT MOV AL,OPR1 IMUL OPR2 MOV RESULT,AXENDMADDMULT MACRO REG,VAR1,VAR2 MULTIPLYFIRST1,F(xiàn)IRST2,MULT1 MULTIPLYSECOND1,SECOND2,MULT2 MOV REG,VAR1 ADD REG,VAR2 MOV SUM,REGENDM…MULTIPLYFIRST1,F(xiàn)IRST2,MULT1+MOVAL,F(xiàn)IRST1+IMULFIRST2+MOVMULT1,AXMULTIPLYSECOND1,SECOND2,MULT2+MOV AL,SECOND1+IMUL SECOND2+MOV MULT2,AXADDMULT AX,MULT1,MULT2+MOV AX,MULT1+ADD AX,MULT2+MOV SUM,AX…宏嵌套宏調(diào)用:ADDMULT AX,MULT1,MULT2宏定義中的標(biāo)號與變量

DELAY MACRO VALUE1,VALUE2 LOCAL AGAIN1,AGAIN2 PUSH AX PUSH CX MOV CX,VALUE1AGAIN1: MOV AX,VALUE2AGAIN2: DEC AX JNZ AGAIN2 LOOP AGAIN1 POP CX POP AX ENDMDELAY 6789H,0FFFFH+ PUSH AX+ PUSH CX+ MOV CX,6789H+??0000:MOV AX,OFFFFH+??0001 DEC AX+ JNZ ??0001+ LOOP ??0000+ POP CX+ POP AX …DELAY 0FFF0H,8000H+ PUSH AX+ PUSH CX+ MOV CX,0FFF0H+??0002:MOV AX,8000H+??0003:DEC AX+ JNZ ??0003+ LOOP ??0002+ POP CX+ POP AX

宏調(diào)用:…DELAY 6789H,0FFFFH…DELAY 0FFF0H,8000H…

小結(jié)宏指令與子程序的異同相同點:均可用來簡化源程序,并可使程序?qū)λ鼈兌啻芜M行調(diào)用。不同點:定義方法及格式不同。子程序省內(nèi)存,宏指令則不省。子程序執(zhí)行速度慢,而宏運行速度快。4.2匯編語言程序設(shè)計

編制匯編程序步驟:明確任務(wù),確定算法繪流程圖根據(jù)流程圖編寫匯編語言程序上機調(diào)試程序程序的基本結(jié)構(gòu):順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)編輯源程序

EDITABC.ASM匯編源程序

MASM

ABC.ASM形成目標(biāo)程序ABC.OBJ連接目標(biāo)程序

LINKABC.OBJ有連接錯誤信息?形成可執(zhí)行程序ABC.EXE裝入可執(zhí)行程序到內(nèi)存并執(zhí)行ABC下一程序用DEBUG調(diào)試可執(zhí)行程序DEBUG

ABC.EXE找到原因YNYNNYN有匯編錯誤信息?Y運行結(jié)果正確?用DEBUG調(diào)試程序查錯?1.順序程序設(shè)計

(exp6.asm)例:

TITLE EXAMPLE1 DATA SEGMENT2 VARX DW 63 VARY DW 74 RESULT DW?5 DATA ENDS6 STACK1 SEGMENTPARASTACK7 DW 20HDUP(0)8 STACK1 ENDS9 COSEG SEGMENT10 PROC1 PROC FAR11 ASSUME CS:COSEG,DS:DATA,SS:STACK112 START: PUSH DS13 MOV AX,0續(xù):14 PUSH AX15 MOV AX,DATA16 MOV DS,AX17 MOV DX,VARX ;DX←X18 ADD DX,VARY ;DX←(X+Y)19 MOV CL,320 SAL DX,CL ;DX←(X+Y)*821 SUB DX,VARX ;DX←(X+Y)*8-X22 SAR DX,1 ;DX←((X+Y)*8-X)/223 MOV RESULT,DX ;存結(jié)果24 RET25PROC1 ENDP26COSEG ENDSEND START源程序代碼段中:第15,16語句是為數(shù)據(jù)段寄存器賦值,讓DS指向本程序的數(shù)據(jù)段DATA。第17~第23語句完成公式計算并存儲結(jié)果是代碼段中。第12~第14語句是為用戶程序結(jié)束,返回DOS操作系統(tǒng)而作的準(zhǔn)備。

DOS的裝入功能(又稱EXEC系統(tǒng)功能)

可執(zhí)行文件.exe,應(yīng)裝入內(nèi)存方能執(zhí)行。由DOS的裝入功能完成。在DOS的提示符后輸入可執(zhí)行文件的文件名,按回車鍵,DOS系統(tǒng)即調(diào)用裝入功能,

將可執(zhí)行程序裝入內(nèi)存。當(dāng)一個用戶程序的可執(zhí)行文件(.EXE)裝入內(nèi)存后,存儲器分配情況如圖所示

系統(tǒng)占用程序段前綴用戶數(shù)據(jù)段用戶堆棧段用戶代碼…系統(tǒng)和ROM占用0HDS,ESSSCS0FFFFFH共100H個字節(jié)用戶空間完成以下操作:確定內(nèi)存可用部分,以便存放要執(zhí)行的.exe文件。建立程序段前綴PSP

(ProgramSegmentPrefix)

程序段前綴大小100H,即256個字節(jié)。存放進程間的控制信息。

PSP最開始的兩個字節(jié)CD20,是一條INT20H指令。裝入可執(zhí)行程序.exe0000:0000H可用內(nèi)存空間內(nèi)存FFFF:0000HROMBIOS系統(tǒng)檢測程序COMMAND.COMDOS系統(tǒng)1KB中斷向量表CD20………h(huán)ello.exexxxx:0000Hxxxx:00FFH程序段前綴用戶程序

修改以下寄存器的值

DS、ES設(shè)置為程序段前綴所在內(nèi)存的段值;

(DS)=xxxxH(ES)=xxxxHSS、SP設(shè)置為由連接程序傳過來的值;

CS、IP設(shè)置為程序的入口地址,即偽操作END后跟的符號名對應(yīng)的物理地址;

此時CS:IP指向用戶程序,開始執(zhí)行用戶程序。0000:0000H可用內(nèi)存空間內(nèi)存FFFF:0000HROMBIOS系統(tǒng)檢測程序COMMAND.COMDOS系統(tǒng)1KB中斷向量表CD20………h(huán)ello.exexxxx:0000Hxxxx:00FFH程序段前綴CS:IP20H中斷程序的功能:處理程序結(jié)束,返回系統(tǒng)。調(diào)用20H中斷程序是有條件的:要求當(dāng)前的CS應(yīng)為程序段前綴在內(nèi)存的段值CD20xxxx

….0000xxxx:0SS:SPSS:SP程序段前綴PSPPSP的段值PSP的偏值用戶程序CSIP采用下面的程序框架,可保證執(zhí)行INT20H時,當(dāng)前的CS值為程序段前綴在內(nèi)存的段值。codeSEGMENTASSUMECS:codemainPROCFAR;使RET為遠返回start:PUSHDS;入棧保存地址

MOVAX,0;程序段前綴的首地址

PUSHAX…;程序主體部分

…RET;取程序段前綴首地址mainENDPcodeENDSENDstart注意:不可在匯編語言程序的最后用INT20H返回DOS。原因是20h中斷子程的執(zhí)行是有條件的。采用上述返回DOS的程序結(jié)構(gòu),才能滿足該條件,否則無法返回。結(jié)束用戶程序,返回操作系統(tǒng)的另一個辦法是用中斷指令“INT21H”。如使用這種辦法,用戶程序可以不設(shè)置過程,只要在用戶程序結(jié)束時,用以下兩條指令即可:

MOV AH,4CHINT 21H這樣,上述程序的代碼段可以修改為:

COSEG SEGMENT ASSUME CS:COSEG,DS:DATA ASSUME SS:STACK1START: MOV AX,DATA MOV DS,AX MOV DX,VARX ADD DX,VAY MOV CL,3 SAL DX,CL SUB DX,VARX SAR DX,1 MOV RESULT,DX MOV AH,4CH INT 21HCOSEG ENDS END START2.分支程序設(shè)計

分支程序結(jié)構(gòu)也稱條件結(jié)構(gòu),通常有兩種形式,見圖。兩個分支YN多個分支…例:求補碼數(shù)[X]補的絕對值,并送回原處。STACK SEGMENT STACK ;定義堆棧段,

DW 256DUP(?) ;預(yù)留256個單元TOP LABEL WORDSTACK ENDSDATA SEGMENTXADR DW 3456H ;設(shè)[X]補=3456HDATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,STACK ;將堆棧段段址送SS。

MOV SS,AX MOV SP,OFFSETTOP ;設(shè)置棧指針,使其指向棧頂?shù)刂贰?/p>

PUSH DS ;將PSP中INT20H指令的存放地址壓入棧。

MOV AX,0 PUSH AX MOV AX,DATA ;將數(shù)據(jù)段段址送DS。

MOV DS,AX MOV AX,XADR ;取[X]補到AX。

AND AX,AX

;設(shè)置標(biāo)志位。

JNS DONE

;若X≥0,轉(zhuǎn)DONE。

NEG AX

;若X<0,求補得|X|。

MOV XADR,AX

;將|X|送回原處。DONE: RET ;返回PC-DOS狀態(tài)。MAIN ENDPCODE ENDSEND START例:設(shè)有一組(8個)選擇項存于AL寄存器中,試根據(jù)AL中哪一位為1把程序分別轉(zhuǎn)移到相應(yīng)的分支去。BRANCH_ADDR SEGMENT;定義數(shù)據(jù)段。BRANCH_TAB DW ROUTINE1 ;定義數(shù)據(jù)表(跳轉(zhuǎn)表)。

DW ROUTINE2 DW ROUTINE3 DW ROUTINE4 DW ROUTINE5 DW ROUTINE6 DW ROUTINE7 DW ROUTINE8BRANCH_ADDR ENDS續(xù):ROUTINE_SELECT SEGMENT ;定義代碼段。MAIN PROC FAR ASSUMECS:ROUTINE_SELECT,DS:BRANCH_ADDRSTART: PUSH DS ;將PSP中INT20的存放地址壓入棧頂。

SUB BX,BX PUSH BX MOV BX,BRANCH_ADDR MOV DS,BX CMP AL,0 ;判AL中是否有置1的位。

JE DONE ;若AL全零,及早退出選擇結(jié)構(gòu)。

LEA BX,BRANCH_TAB ;跳轉(zhuǎn)表首址送BX。COUTINUE: SHR AL,l ;AL最低位移至CF。

JNC NOT_YET ;CF=0,轉(zhuǎn)去檢查下一位。

JMP WORDPTR[BX] ;CF=1,轉(zhuǎn)相應(yīng)分支程序。NOT_YET:ADDBX,TYPEBRANCH_TAB ;修改BX內(nèi)容,為轉(zhuǎn)入下一分支作好準(zhǔn)備。

JMP COUTINUE ;繼續(xù)檢查下一選擇項。DONE: RET ;若無選擇項置位轉(zhuǎn)此處,執(zhí)行其它程序。ROUTINE1: …ROUTINE2: …… … RETMAIN ENDPROUTINE_SELECT ENDS END START3.循環(huán)程序設(shè)計

常見的循環(huán)程序結(jié)構(gòu)有兩種:WHILE_DO結(jié)構(gòu)和DO_UNTIL結(jié)構(gòu),見圖。循環(huán)初始設(shè)置循環(huán)體循環(huán)條件判斷?YNYN循環(huán)初始設(shè)置循環(huán)體循環(huán)條件判斷?當(dāng)型循環(huán)(當(dāng)條件成立進入循環(huán))直到型循環(huán)(直到條件成立退出循環(huán))例:將內(nèi)存的二進制數(shù)轉(zhuǎn)化成以壓縮的BCD碼形式存儲的十進制數(shù)。.MODEL SMALL.386DATA SEGMENT BINNUM DD 12345678H ;內(nèi)存中的二進制數(shù)。

DECINUM DB 5DUP(0) ;轉(zhuǎn)化成壓縮的BCD碼的存儲區(qū)。

NUMBER DD 1000000000,100000000,10000000,1000000 DD 100000,10000,1000,100,10,1 ;減數(shù)。DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FARSTART: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX ;初始化。

MOV EAX,BINNUM ;將數(shù)放入EAX。

MOV SI,OFFSET DECINUM ;SI指向BCD碼存儲區(qū)。

MOV DI,OFFSETNUMBER ;DI指向減數(shù)區(qū)。

MOV CX,5 ;循環(huán)5次。ROTATE: CALL BINDECI ;調(diào)用二進制轉(zhuǎn)化成十進制子程序。

ADD DI,8 ;DI下移兩個雙宇。

INC SI ;SI下移一個字節(jié)。

LOOP ROTATE ;若CX≠0則循環(huán),輸出下兩位。

RETMAIN ENDPBINDECI PROCNEAR PUSHF PUSH CX ;入棧。

MOV CX,0 ;CX存放商,初始清0。

CLC ;清除CF。DO_AGAIN1:

SUB EAX,DWORDPTR[DI] ;EAX減去相應(yīng)的減數(shù)。

JC NEXT1 ;若不夠減,則跳出循環(huán)。

INC CL ;否則,CL加l(商)。

JMP DO_AGAIN1 ;繼續(xù)減。NEXT1: MOV CH,CL ;將商移入CH。

MOV CL,0 ;CL清0。

ADD EAX,DWORDPTR[DI] ;恢復(fù)最后一次減前的值。

CLC ;清除CF。DO-AGAIN2:

SUB EAX,DWORDPTR[DI+4] ;EAX減去下一個數(shù)。

JC NEXT2 ;若不夠減,則跳出循環(huán)。

INC CL ;否則,CL加1(商)。

JMP DO_AGAIN2 ;繼續(xù)減。NEXT2: ADD EAX,DWORDPTR[DI+4] ;恢復(fù)最后一次減前的值。 ;CH:CL中放的是高兩位商,是非壓縮的BCD碼。 ;以下將它們轉(zhuǎn)化成壓縮的BCD碼并放入存儲單元。

SHL CH,1 SHL CH,1 SHL CH,1 SHL CH,1 ;CH左移4位。

OR CH,CL ;CH中存放壓縮的BCD碼。

MOV BYTEPTR[SI],CH ;放入存儲區(qū)。

POP CX POPF RETBINDECI ENDPCODE ENDS END START

例:將內(nèi)存中以壓縮的BCD碼形式存儲的十進制數(shù)轉(zhuǎn)化成二制數(shù).MODEL SMALL.386DATA SEGMENT BINNUM DD0 DECINUM DB12H,34H,56H,78H,90H ;用十六進制數(shù)表示壓縮的BCD碼。

DATA ENDS ;十進制數(shù)是1234567890。CODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FARSTART: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX ;初始化

MOV EAX,0 ;32位二進制數(shù)初始值為0。

MOV SIOFFSETDECINUM ;DS:SI指向DECINUM。

MOV CX,5 ;循環(huán)5次。ROTATE: CALL DECIBIN INC SI ;SI指向下一個字節(jié)

LOOP ROTATE MOV DWORDPTRBINNUM,EAX ;將32位二進制數(shù)放入BINNUM。

RETMAIN ENDPDECIBINPROCNEAR PUSHF PUSH ECX PUSH EBXBEGIN:

MOV ECX,100 ;ECX放置乘數(shù)100。

MUL ECX ;EAX乘100 MOV CH,BYTEPTR[SI] ;取出一個壓縮的BCD碼到CH。

MOV CL,CH ;復(fù)制到CL。

AND CL,0FH ;CL中保留低4位。

AND CH,0F0H ;CH中保留高4位,這時CH相當(dāng)于非壓縮的BCD碼*16。

SHR CH,1 ;算術(shù)右移1位,相當(dāng)于非壓縮的BCD

溫馨提示

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

評論

0/150

提交評論