第6章循環(huán)與分支程序1_第1頁
第6章循環(huán)與分支程序1_第2頁
第6章循環(huán)與分支程序1_第3頁
第6章循環(huán)與分支程序1_第4頁
第6章循環(huán)與分支程序1_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第六章循環(huán)與分支程序設(shè)計6.1分支程序設(shè)計6.2循環(huán)程序設(shè)計6.3多重循環(huán)程序設(shè)計6.4子程序2/29/202416.1分支程序設(shè)計

6.1.1標號標號:

用來說明可執(zhí)行指令在匯編語言程序中的位置。和變量類似,實質(zhì)上是一個地址值。可以作為轉(zhuǎn)移指令(或CALL)的操作數(shù)。屬性:段屬性、位移量屬性和距離屬性。注意:

如果一個標號只在標號定義的段中用JMP或條件轉(zhuǎn)移指令(或CALL)來訪問,需要將標號的距離屬性定義為NEAR;如果一個標號能被其他段中的JMP指令(或CALL)

來訪問,那么需要將這個標號的距離定義為FAR。2/29/202421、定義距離屬性為NEAR的標號

1)隱式說明:即在標號后面加上冒號,放在指令的前面。例如:L1:MOVAX,[SI]NEXT:MOVAX,BXL1和NEXT都是標號名,它們的距離屬性均為NEAR。2)顯式說明:即用LABEL偽指令或在EQU指令中用THIS操作符明顯的說明。例如:L2LABELNEARMOVDX,CXL3EQUTHISNEARORDL,30H

標號L2和L3的距離屬性均為NEAR。2/29/202432、定義距離屬性為FAR的標號

例如:

L4

LABELFAR

MOVAX,CXL5EQUTHISFARORDL,30H3、同時定義距離屬性為FAR和NEAR的標號例如:

L6

LABELFAR

L7:ANDAL,0FH或者:

L6EQUTHISFARL7:ANDAL,0FH2/29/202446.1.2無條件轉(zhuǎn)移指令

JMP指令(無條件轉(zhuǎn)移)格式:JMP目的操作數(shù)功能:JMP指令無條件地控制轉(zhuǎn)移至目標單元(目的操作數(shù)).JMP指令具體格式有以下五種:1、段內(nèi)直接轉(zhuǎn)移格式:JMP標號名;標號為NEAR屬性這個標號是在本段內(nèi)某一指令的前面,后面綴以冒號來定義其位置的(位移量)。2/29/20245例如:

JMPL2∶L1:ADDAX,100L2:MOVCX,30∶JMPL12、段內(nèi)直接短轉(zhuǎn)移格式:JMPSHORT標號名例如:∶

JMPSHORTL1L2:MOVDX,CX∶L1:ORDL,30H∶2/29/202463、段內(nèi)間接轉(zhuǎn)移格式:JMP地址表達式例如:

JMPBX

;把控制轉(zhuǎn)向CS:BX

JMPVAR_WORD;把控制轉(zhuǎn)向VAR_WORD存儲單元中存放的地址處4、

段間間接轉(zhuǎn)移格式:JMP雙字存儲變量功能:將控制轉(zhuǎn)移到雙字存儲變量指定的地址,即將雙字存儲變量第二個字作為段地址,第一個字為偏移地址處繼續(xù)執(zhí)行。2/29/202475、段間直接轉(zhuǎn)移格式:JMP標號;標號為FAR屬性例如:

CODE1SEGMENT∶JMPCODE2_NEXT∶CODE1ENDSCODE2SEGMENT∶CODE2_NEXTLABELFAR∶CODE2ENDS2/29/202486.3.3比較指令CMP指令(比較指令)格式:CMP目的操作數(shù),源操作數(shù)功能:CMP指令與SUB指令一樣執(zhí)行減法操作,即目的操作數(shù)減去源操作數(shù),但其結(jié)果不送回目的操作數(shù)。執(zhí)行指令后,兩個操作數(shù)保持原值不變。只是影響標志位:

OF,CF,PF,SF,ZF,AF.注意:CMP指令后面往往會跟著一條條件轉(zhuǎn)移指令,根據(jù)比較結(jié)果產(chǎn)生不同的程序分支。2/29/202496.1.4條件轉(zhuǎn)移指令8086/8088提供了很多條件轉(zhuǎn)移指令,而且往往一條指令有好幾種助記符表示形式,歸納主要分成兩大類:·判斷兩數(shù)大小的條件轉(zhuǎn)移指令?!y試單個標志位的條件轉(zhuǎn)移相令。1、比較兩個無符號數(shù),判斷無符號數(shù)大小的條件轉(zhuǎn)移指令1)JA/JNBE(jumpifnotbloworequal,orabove)

JA指令(高于轉(zhuǎn)移)

JNBE指令(不低于等于轉(zhuǎn)移)這是一條條件轉(zhuǎn)移指令的兩種助記符。當兩個無符號數(shù)進行比較時,如果A>B成立則轉(zhuǎn)移。2/29/2024102)JBE/JNA(jumpifbloworequal,ornotabove)

JBE指令(低于或等于轉(zhuǎn)移)

JNA指令(不高于轉(zhuǎn)移)當兩個無符號數(shù)進行比較時,如果A≤B成立,則轉(zhuǎn)移3)JAE/JNB(jumpifnotblow,oraboveorequal)

JAE指令(高于等于轉(zhuǎn)移)

JNB指令(不低于轉(zhuǎn)移)當兩個無符號數(shù)相比較時,如果A≥B成立,則轉(zhuǎn)移。4)JB/JNAE(jumpifblow,ornotaboveorequal)

JB指令(低于轉(zhuǎn)移)

JNAE指令(不高于等于轉(zhuǎn)移)當兩個無符號數(shù)相比較時,如果A<B成立則轉(zhuǎn)移。2/29/2024112、判斷帶符號數(shù)的大小的條件轉(zhuǎn)移指令1)JG/JNLE(jumpifgreater,ornotlessorequal)

JG指令(大于轉(zhuǎn)移)

JNLE措令(不小于等于轉(zhuǎn)移)當兩個帶符號數(shù)相比較時,如果A>B,則轉(zhuǎn)移到目標地址。2)JGE/JNL(jumpifgreaterorequal,ornotless)

JGE指令(大于等于轉(zhuǎn)移)

JNL指令(不小于轉(zhuǎn)移)兩個帶符號數(shù)相比較時,若A≥B,轉(zhuǎn)移到目標地址2/29/2024123)JL/JNGE(jumpifless,ornotgreaterorequal)

JL指令(小于轉(zhuǎn)移)

JNGE指令(不大于等于轉(zhuǎn)移)當兩個帶符號數(shù)相比較時,當A<B時,轉(zhuǎn)移到目標地址。4)JLE/JNG(jumpiflessorequal,ornotgreater)

JLE指令(小于等于轉(zhuǎn)移)

JNG指令(不大于轉(zhuǎn)移)當兩個帶符號數(shù)相比較時,當A≤B時,轉(zhuǎn)移到目標地址。2、判斷帶符號數(shù)的大小的條件轉(zhuǎn)移指令2/29/2024133、測試單個標志的條件轉(zhuǎn)移指令1)測試ZF

①JE/JZ(jumpifzero,orequal)

JE指令(相等則轉(zhuǎn)移)

JZ指令(等于0轉(zhuǎn)移)當ZF=l時轉(zhuǎn)移到目標地址的條件轉(zhuǎn)移指令的兩種助記符。它既適用于判斷無符號數(shù)的相等,又適用于判斷帶符號數(shù)的相等。②JNE/JNZ(jumpifnotzero,ornotequal)

JNE指令(不相等則轉(zhuǎn)移)

JNZ指令(不等于0轉(zhuǎn)移)當ZF=0時轉(zhuǎn)移到目標地址的條件轉(zhuǎn)移指令的兩種助記符。既適用于判斷有/無符號數(shù)的相等.2/29/2024142)測試CF①JC(jumpifcarry)當CF=1時,轉(zhuǎn)移到目標地址。②JNC(jumpifnotcarry)當CF=0時,轉(zhuǎn)移到目標地址。3)測試SF①JS(jumpifsign)指令(為負轉(zhuǎn)移)當SF=1時,能轉(zhuǎn)移到目標地址的條件轉(zhuǎn)移指令。②JNS(jumpifnotsign)指令(為正轉(zhuǎn)移)當SF=0時.能轉(zhuǎn)移到目標地址的條件轉(zhuǎn)移指令4)測試PF①JP/JPE

指令(為偶轉(zhuǎn)移)PF=1時,轉(zhuǎn)移到目標地址的條件轉(zhuǎn)移指令的兩種助記符.2/29/202415②JNP/JPO

(為奇轉(zhuǎn)移)當PF=0時,轉(zhuǎn)移到目標地址的條件轉(zhuǎn)移指令5)測試OF①JO(jumpifoverflow)指令(溢出轉(zhuǎn)移)當滿足OF=1時,轉(zhuǎn)移到目標地址的條件轉(zhuǎn)移指令。②JNO(jumpifnotoverflow)指令(未溢出轉(zhuǎn)移)當OF=0時,轉(zhuǎn)移到目標地址的條件轉(zhuǎn)移指令。2/29/202416單路分支:

在C語言中,單分支語句if(AL)<(BL)AL=BL;匯編語言實現(xiàn)方法:比較指令后面緊跟上條件轉(zhuǎn)移指令。CMPAL,BLJAEL1MOVAL,BLL1:…

反方向判斷2/29/202417例6.6求一組無符號數(shù)的最大值和最小值,分別放在存儲單元MAX和MIN中。DATASEGMENTADW349AH,567H,7802H,9031H,0002H,8671HMAXDW?MINDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

:;插入程序

MOVAH,4CHINT21HCODEENDSENDSTART2/29/202418

MOVAX,0;AX用于存放最大值

MOVBX,0FFFFH;BX用于存放最小值

MOVSI,0MOVCX,6L1:CMPAX,A[SI]JAL2MOVAX,A[SI]L2:CMPBX,A[SI]JBL3MOVBX,A[SI]L3:INCSIINCSILOOPL1MOVMAX,AXMOVMIN,BX2/29/202419兩路分支程序舉例:

在C語言中,兩路分支表示如下:if(AL<BL)AL=BL;elseBL=AL;匯編語言實現(xiàn)兩路分支程序如下:CMPAL,BLJAEL1MOVAL,BLJMPL2L1:MOVBL,ALL2:…2/29/202420兩路分支程序舉例:例:

將存放在AL中的十六進制數(shù)字輸出

方法:利用0------30H-----OR30H9------39HA------41H------ADD37HB------42HF------47HCMPAL,9JAL1ORAL,30HJMPL2L1:ADDAL,37HL2:MOVDL,ALMOVAH,02HINT21H2/29/202421程序舉例:例6.5將0B4H-25H的結(jié)果用十六進制輸出

方法二、利用0------30H-----OR30H9------39HA------41H------ADD37HB------42HF------47H2/29/202422MOVAL,DSUBAL,EMOVF,ALMOVCL,4SHRAL,CLCMPAL,9JAL1ORAL,30HJMPL2L1:ADDAL,37HL2:MOVDL,ALMOVAH,02HINT21HMOVAL,FANDAL,0FHCMPAL,9JAL3ORAL,30HJMPL4L3:ADDAL,37HL4:MOVDL,ALMOVAH,02HINT21H2/29/202423程序舉例:例6.5將0B4H-25H的結(jié)果用十六進制輸出

方法三、利用0------30H-----OR30H9------39HA------41H------OR30H

ADD7HB------42HF------47H2/29/202424MOVAL,DSUBAL,EMOVF,AL

MOVCL,4SHRAL,CL

ORAL,30HCMPAL,39HJBEL1ADDAL,7HL1:MOVDL,ALMOVAH,02HINT21HMOVAL,FANDAL,0FHORAL,30HCMPAL,39HJBEL2ADDAL,7HL2:MOVDL,ALMOVAH,02HINT21H2/29/2024256.2循環(huán)程序設(shè)計JCXZ:當CX為0時跳轉(zhuǎn)的條件轉(zhuǎn)移指令;LOOP:使CX的值遞減并且產(chǎn)生一個無條件跳轉(zhuǎn)的循環(huán)指令;LOOPE/LOOPZ,LOOPNE/LOOPNZ

條件循環(huán)迭代控制指令,根據(jù)零狀態(tài)標志位的狀態(tài),決定是否繼續(xù)進行循環(huán)操作。循環(huán)控制指令可用來控制循環(huán)。它們用CX寄存器作為計數(shù)器,來控制循環(huán)次數(shù)。并且都是短距離轉(zhuǎn)移指令。

2/29/2024261、LOOP指令(執(zhí)行循環(huán)直到計數(shù)為0)格式:LOOP短距離標號例如:L1:…..┆

LOOPL1功能:CX-1=>CX,若CX不為0,則將控制轉(zhuǎn)移到目標操作數(shù)(指定標號處);否則順序執(zhí)行LOOP指令之后的指令。程序舉例例6.l一組數(shù)求和,假設(shè)有20個16位二進制數(shù),要對這20個數(shù)求和(假設(shè)和值<65536)程序如下:2/29/202427DATASEGMENTARRY DW123CH,3DH,100H,90H,345H,12H,DW0A5H,4BH,89H DW87H,234H,64H,35H,20H,21H,50H,DW88H,92H,11H,0FFHDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATAMOVDS,AX

2/29/202428

MOVCX,20MOVSI,0MOVAX,0NEXT: ADDAX,ARRY[SI]INCSIINCSILOOPNEXTMOVAH,4CHINT21HCODEENDSENDSTART2/29/2024292、LOOPE/LOOPZ(如果相等/如果為0則循環(huán))格式:LOOPE/LOOPZ短距離標號功能:該指令將CX減1,若CX不為0且ZF置1(即CX≠0且運算結(jié)果為0),則將控制轉(zhuǎn)移到目標操作數(shù),否則:順序執(zhí)行LOOPE/LOOPZ指令之后的指令。2/29/202430例6.2在字節(jié)數(shù)組中找出第一個非零元素,并顯示輸出第一個非零元素的下標.程序如下:DATASEGMENTARRAYDB0,0,0,0,0,0,84,0,9,10COUNTEQU$-OFFSETARRAYDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATABEGIN: MOVAX,DATA MOVDS,AXMOVCX,COUNTMOVDI,-12/29/202431

NEXT:INCDICMPARRAY[DI],0LOOPZNEXTJNEOKMOVDL,‘N’;沒找到非零元素,顯示NJMPDISPLAYOK: MOVDX,DIORDL,30HDISPLAY:MOVAH,02HINT21HMOVAH,4CHINT21HCODEENDSENDBEGIN注意:

MOVDI,0NEXT:CMPARRAY[DI],0INCDILOOPZNEXT是錯的,因為INCDI指令改變了ZF的值。2/29/2024323、LOOPNE/LOOPNZ(不等/不為零,則循環(huán))格式:LOOPNE/LOOPNZ短距離標號功能:該指令將CX減1,若CX不為0且ZF為0(即CX≠0且運算結(jié)果不為0),則將控制轉(zhuǎn)移到指定標號;否則,順序執(zhí)行下一條指令。例6.3求兩個一維字數(shù)組的和,數(shù)組元素個數(shù)為N,當計算到兩個數(shù)組對應(yīng)元素之和為零時就停止求和,(假設(shè)數(shù)組元素為無符號二進制數(shù))。其實現(xiàn)程序如下:DATASEGMENTARR1DW23H,34H,0,5H,66H,0,345H,567HARR2DW34H,24H,0,2H,44H,0,345H,56HNUM EQU$-OFFSETARRAY2SUM DW15DUP(?)DATAENDS2/29/202433CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,0MOVSI,0FFFEH ;-2=>SIMOVCX,NUMSHRCX,1 ;NUM/2=>CXNZERO:INCSIINCSIMOVAX,ARR1[SI]ADDAX,ARR2[SI]MOVSUM[SI],AXLOOPNZNZERODATASEGMENTARR1DW23H,34H,0,5H,66H,0,345H,567HARR2DW34H,24H,0,2H,44H,0,345H,56HNUM EQU$-OFFSETARRAY2SUM DW15DUP(?)DATAENDS2/29/202434JNZLMOVDL,’Y’JMPQL:MOVDL,’N’Q:MOVAH,02HINT21HMOVAH,4CHINT21HCODEENDSENDSTART3、JCXZ(CX為0轉(zhuǎn)移)格式:JCXZ短矩離標號功能:JCXZ指令在CX等于0時將控制轉(zhuǎn)移到目標操作數(shù)(目標標號處)。2/29/2024356.3多重循環(huán)程序設(shè)計二重循環(huán)的參考格式:

MOVCX,COUNT1;外層循環(huán)計數(shù)值LOOPER1:….MOVBUF,CX;存外循環(huán)計數(shù)到BUFMOVCX,COUNT2;內(nèi)層循環(huán)計數(shù)值LOOPER2:….LOOPLOOPER2;內(nèi)層循環(huán)結(jié)束

MOVCX,BUF;恢復(fù)外層循環(huán)計數(shù)值

.LOOPLOOPER1;外層循環(huán)結(jié)束2/29/202436例題6.4:將N個不同的無符號數(shù)A0,A1,A2,…,

AN-1

由小到大排序。DATASEGMENTADB9,8,7,6,5,4,3,2,1,0COUNTEQU$-offsetADATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

MOVAH,4CHINT21HCODEENDSENDSTART2/29/202437【例5】將10個數(shù)從小到大排序A[0]

A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]A[9]

584201516937方法一:對N個數(shù)選擇排序[N=10]基本思想:第1次,在A[0]~A[N-1]中找最小的數(shù)交換到A[0],第2次,在A[1]~A[N-1]中找最小的數(shù)交換到A[1],…………第N-1次,A[N-2]~A[N-1]中找最小的數(shù)交換到A[N-1]2/29/2024381.第1次,選A[0]~A[N-1]的最小值交換到A[0]:將10個數(shù)從小到大排序A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]A[9]

58420151693754412.第2次,選A[1]~A[N-1]的最小值交換到A[1]:

for(j=0+1;j<N;j++)if(A[0]>A[j])則交換A[0]和A[j]

for(j=1+1;j<N;j++)if(A[1]>A[j])則交換A[1]和A[j]

2/29/2024391.第1次,選A[0]~A[N-1]的最小值交換到A[0]:將10個數(shù)從小到大排序A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]A[9]

185201546937

2.第2次,選A[1]~A[N-1]的最小值交換到A[1]:138201556947

for(j=0+1;j<N;j++)

if(A[0]>A[j])則交換A[0]和A[j]

for(j=1+1;j<N;j++)if(A[1]>A[j])則交換A[1]和A[j]

2/29/202440將10個數(shù)從小到大排序A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]A[9]

185201546937

138201556947I.第i次,選A[i]~A[N-1]的最小值交換到A[i]:

for(j=i+1;j<N;j++)

if(A[i]>A[j])則交換A[i]和A[j]這樣的挑選要做N-1次??傻贸绦蛉缦拢?/29/202441

#defineN10for(i=0;i<N-1;i++)for(j=i+1;j<N;j++) if(A[i]>A[j]) { tmp=A[i];

A[i]=A[j];

A[j]=tmp; }

printf("排序為:\n");將10個數(shù)從小到大排序2/29/202442

MOVCX,COUNT-1;外循環(huán)循環(huán)COUNT-1次

MOVBX,0

LOOP1:MOVDX,CX;把CX的值暫時保存在DX中

MOVSI,1LOOP2:MOVAL,A[BX]CMPAL,A[BX+SI]JNAL1XCHGAL,A[BX+SI];交換A[BX]和A[BX+SI]值

MOVA[BX],ALL1:

INCSI

LOOPLOOP2INCBXMOVCX,DX;恢復(fù)CX的值

LOOPLOOP1

2/29/2024436.4子程序6.4.1子程序定義用一對偽指令PROC/ENDP定義一個子程序(過程),其格式如下:

名稱

PROC[NEAR/FAR]

RET

名稱

ENDP2/29/2024446.4子程序6.4.2子程序調(diào)用與返回CALL指令:調(diào)用子程序,將其下條指令的地址(返回地址)保存在堆棧里,將控制轉(zhuǎn)移到過程,執(zhí)行。RET指令:返回主程序。RET指令會到堆棧里找到由CALL指令保存的返回地址,將控制返回CALL指令的下條指令,繼續(xù)運行。2/29/202445調(diào)用子程序用CALL指令

示意如下:過程調(diào)用(主程序)過程定義(子程序)過程名PROCNEAR

┆CALL過程名RET┆過程名ENDP

6.4.3調(diào)用和返回指令1、CALL(調(diào)用)指令格式:CALL目的操作數(shù)具體格式與JMP指令相似,有四種格式:2/29/2024461)段內(nèi)直接調(diào)用

CALL過程名(NEAR類型)2)段內(nèi)間接調(diào)用

CALLWORDPTR[BX]3)段間直接調(diào)用

CALL過程名(FAR類型)4)段間間接調(diào)用

CALLDWORDPTR[BX]CALL指令的功能是去啟動一個過程,將其下條指令的偏移地址保存進棧,以供過程定義中的RET能將控制轉(zhuǎn)回到CALL的下一條指令。2/29/2024472、RET指令格式:RETRET彈出值功能:RET指令將控制從一個過程返回到調(diào)用該過程的CALL指令之后的指令(返回斷點處)。2/29/2024486.4.4子程序舉例1、段內(nèi)子程序調(diào)用和子程序定義程序格式實例。

SEGXSEGMENTASSUME…START:∶

CALLSUBT∶∶

SUBTPROCNEAR∶

RETSUBTENDPSEGXENDSENDSTART2/29/202449例6.7求0A5H與43H之和,用十六進制形式輸出,要求用子程序?qū)崿F(xiàn)。

DATASEGMENTADB0A5HBDB43HCDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

2/29/202450

MOVAL,AADDAL,BMOVC,ALMOVCL,4SHRAL,CLCALLBINIHEX;將AL中的一個十六進制數(shù)字輸出

MOVAL,CANDAL,0FHCALLBINIHEXMOVAH,4CHINT21H2/29/202451BINIHEXPROCNEAR;將AL中的一位十六進制數(shù)轉(zhuǎn)

CMPAL,9;化為字符的ASCII碼輸出

JAL1ORAL,30HJMPL2L1:ADDAL,37HL2:MOVDL,ALMOVAH,02HINT21HRETBINIHEXENDPCODEENDSENDSTART2/29/202452例6.8程序要求從鍵盤輸入一個十進制數(shù),然后把該數(shù)以十六進制形式在屏幕上顯示出來。DECIHEXSEGMENTASSUMECS:DECIHEXREPEAT:CALLDECIBIN;鍵入十進制數(shù)

CMPBX,0JEENDL

;等于零轉(zhuǎn)結(jié)束

CALLCRLF;顯示回車換行

CALLBINIHEX;輸出十六進制數(shù)

CALLCRLF;顯示回車換行

JMPREPEAT;轉(zhuǎn)去繼續(xù)ENDL:MOVAH,4CH;返回DOSINT21H2/29/202453DECIBINPROCNEAR;從鍵盤鍵入一個十進制數(shù)(限定數(shù)字0-9

MOVBX,0;如果輸入非0-9之間的字符,退出),化為二進制數(shù)存入BX寄存器NEXT:MOVAH,01HINT21HCMPAL,30HJBEXITCMPAL,39HJAEXITANDAL,0FHXORAH,AH;AH清0XCHGAX,BXMOVCX,10MULCXXCHGAX,BXADDBX,AXJMPNEXTEXIT:RETDECIBINENDP2/29/202454BINIHEXPROCNEAR;將保存在BX的二進制數(shù)用十六進制輸出

MOVCX,4;需要輸出4個十六進制位,用循環(huán)4次來實現(xiàn)NEXT1:ROLBX,1;將BX循環(huán)左移4位,既是將BX的高四位移到了低四位

ROLBX,1ROLBX,1ROLBX,1MOVDL,BLANDDL,0FH;截取低4位

CMPDL,9JAL1ORDL,30HJMPL2L1:ADDDL,37HL2:MOVAH,02HINT21HLOOPNEXT1RETBINIHEXENDP2/29/202455CRLFPROCNEARMOVDL,0DH;"回車"MOVAH,2INT21HMOVDL,0AH;"換行"INT21HRETCRLFENDPDECIHEXENDSENDREPEAT2/29/2024562、段間子程序調(diào)用和子程序定義程序?qū)嵗?。SEGXSEGMENT∶SUBTPROCFAR∶RETSUBTENDP∶CALLSUBT∶SEGXENDSSEGYSEGMENT∶CALLSUBT∶SEGYENDS2/29/2024576.編寫一個加密與解密0~9位字序列的程序,設(shè)0,1,2,3,4,5,6,7,8,9對應(yīng)的密碼表為9,0,8,2,7,4,6.3,1,5,鍵盤輸入任意一個4位數(shù)要求程序能夠馬上輸出這4位數(shù)對應(yīng)的密碼。例如:鍵盤輸入4925,顯示輸出7584。格式:XLAT換碼表或XLAT功能:[(BX)+(AL)]=>AL;即是用換碼表中一個字節(jié)的內(nèi)容置換AL寄存器的內(nèi)容。要求:在此指令之前,BX寄存器中存放換碼表的起

始地址,AL的內(nèi)容為要換碼的字節(jié)在換碼表中的下標。即是以[BX]為起點的換碼表中,以(AL)為相對位移,取一字節(jié)裝入AL。

2/29/202458DATAsegmentTAB_DADB9,0,8,2,7,4,6,3,1,5NUMDB4DUP(?)DATAendsCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX:MOVAH,4CHINT21HCODEENDSENDSTART2/29/202459MOVSI,0MOVCX,4MOVBX,OFFSETTAB_DAL1:MOVAH,01HINT21HANDAL,0FHXLATTAB_DAMOVNUM[SI],ALINCSILOOPL1

MOVCX,4MOVSI,0L2:MOVDL,NUM[SI]ORDL,30HMOVAH,02HINT21HINCSILOOPL2

2/29/202460P795_4.從鍵盤輸入一個十進制數(shù),以回車(0DH)結(jié)束,將其轉(zhuǎn)換成它所代表的二進制數(shù)據(jù),然后以十六進制形式輸出。DATASEGMENTBUFDB?PROMPTDB'PLEASEENTERANUM<128:$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX2/29/202461MOVDX,OFFSETPROMPTMOVAH,09HINT21HMOVBUF,0IN_L:MOVAH,01HINT21HCMPAL,0DHJEOUT_LANDAL,0FHSALBUF,1MOVBL,BUFSALBUF,1SALBUF,1ADDBUF,BL2/29/202462ADDBUF,ALJMPIN_LOUT_L:MOVDL,0DHMOVAH,02HINT21HMOVDL,0AHMOVAH,02HINT21HMOVAL,BUFANDAL,0F0HMOVCL,4SHRAL,CLNEXT:CMPAL,9JAL1ORAL,30HJMPL2L1:ADDAL,37HL2:MOVDL,ALMOVAH,02HINT21H2/29/202463MOVAL,BUFANDAL,0FHNEXT2:CMPAL,9JAL3ORAL,30HJMPL4L3:ADDAL,37HL4:MOVDL,ALMOVAH,02HINT21H

MOVAH,4CHINT21HCODEENDSENDSTART2/29/202464P7915.鍵盤輸入一個一位加法表達式。1)按十進制輸出其正確的結(jié)果。例如:7+8=15,2+3=05。2)按十六進制輸出其正確結(jié)果。例如:7+8=0FH,2+3=05H。

2/29/202465DATASEGMENTBUFDB3DUP(?)PROMPTDB'PLEASEENTERAequation',0dh,0ah,'$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSETPR

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論