微機(jī)原理-匯編語(yǔ)言程序設(shè)計(jì)-課件_第1頁(yè)
微機(jī)原理-匯編語(yǔ)言程序設(shè)計(jì)-課件_第2頁(yè)
微機(jī)原理-匯編語(yǔ)言程序設(shè)計(jì)-課件_第3頁(yè)
微機(jī)原理-匯編語(yǔ)言程序設(shè)計(jì)-課件_第4頁(yè)
微機(jī)原理-匯編語(yǔ)言程序設(shè)計(jì)-課件_第5頁(yè)
已閱讀5頁(yè),還剩141頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

微型計(jì)算機(jī)機(jī)原理及應(yīng)用1微型計(jì)算機(jī)機(jī)原理及應(yīng)用1程序設(shè)計(jì)的基本技術(shù)1235順序程序設(shè)計(jì)分支程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)子程序設(shè)計(jì)4串處理程序設(shè)計(jì)2程序設(shè)計(jì)的基本技術(shù)1235順序程序設(shè)計(jì)分支程序設(shè)計(jì)循環(huán)程序設(shè)精品資料3精品資料3你怎么稱呼老師?如果老師最后沒(méi)有總結(jié)一節(jié)課的重點(diǎn)的難點(diǎn),你是否會(huì)認(rèn)為老師的教學(xué)方法需要改進(jìn)?你所經(jīng)歷的課堂,是講座式還是討論式?教師的教鞭“不怕太陽(yáng)曬,也不怕那風(fēng)雨狂,只怕先生罵我笨,沒(méi)有學(xué)問(wèn)無(wú)顏見(jiàn)爹娘……”“太陽(yáng)當(dāng)空照,花兒對(duì)我笑,小鳥(niǎo)說(shuō)早早早……”44注意:本書(shū)有關(guān)匯編語(yǔ)言程序設(shè)計(jì)只限于DOS環(huán)境下的實(shí)地址方式,該方式下字長(zhǎng)為16位。順序程序是最簡(jiǎn)單的程序,它的執(zhí)行順序和程序中指令的順序完全一致1順序程序設(shè)計(jì)5注意:本書(shū)有關(guān)匯編語(yǔ)言程序設(shè)計(jì)只限于DOS環(huán)境下的實(shí)地址方式

格式:MULsource

IMULsource

;符號(hào)整數(shù)乘法1.1乘除法指令1.乘法指令MUL和符號(hào)整數(shù)乘法指令I(lǐng)MUL1、源操作數(shù)

source可以是字節(jié)、字或雙字,可為寄存器或存儲(chǔ)器操作數(shù),不能為立即數(shù)。2、目的操作數(shù)是隱藏的,為被乘數(shù),放于AL、AX或EAX,視source的類型屬性決定是AL、AX還是EAX3、在乘法指令之前必須將目的操作數(shù)送AL(字節(jié)乘)或AX(字乘)或EAX(雙字乘)。6格式:MULsource1.1乘除法指令1.乘積的放法:8位或16位乘法指令所執(zhí)行的操作是AL或AX乘以source,乘積放回到AX或DX和AX,如下圖所示ALsourc8AX×AXsourc16AX×DX1.1乘除法指令7乘積的放法:ALsourc8AX×AXsourc16AX×D32位乘法指令所執(zhí)行的操作是EAX乘以source,乘積放回到EDX和EAX,如下圖所示EAXsourc32EAX×EDX注意:乘法指令對(duì)標(biāo)志位CF和OF有影響,對(duì)其余標(biāo)志位的影響不確定。1.1乘除法指令832位乘法指令所執(zhí)行的操作是EAX乘以source,乘積放回例如:將AX中的3位BCD數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)存入字節(jié)變量SB中。M0VCH,10MOVCL,4MOVSB,AL;暫存十位和個(gè)位MOVAL,AH;百位存入AL中MULCH;百位×10→AXMOVAH,SB;百位×10的積小于255,所以只用AL存放即可SHRAH,CL;取十位ADDAL,AH;百位×10+十位→ALMULCH;(百位×10+十位)×10→AXANDSB,0FH;取個(gè)位ADDSB,AL;(百位×10+十位)×10+個(gè)位→SB

N2×102+N1×10+N0=(N2×10+N1)×10+N0程序段如下:1.1乘除法指令9例如:將AX中的3位BCD數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)存入字節(jié)變量SB中

格式:IMULREG,source;REG←REGXsource

IMULREG,source,imm;REG←sourceXimm1.1乘除法指令注:符號(hào)整數(shù)乘法指令I(lǐng)MUL1、雙操作數(shù)乘法指令是用源操作數(shù)乘目的操作數(shù),乘積存入目的操作數(shù)。2、三操作數(shù)乘法指令是用源操作數(shù)乘立即數(shù),乘積存入目的操作數(shù)。3、要求:其源操作數(shù)

source可為寄存器或存儲(chǔ)器操作數(shù),目的操作數(shù)只能是16位和32位的寄存器,源、目的操作數(shù)的類型要求一致。10格式:IMULREG,source;RE

格式:

DIVsource

IDIVsource

;符號(hào)整數(shù)除法注意:源操作數(shù)source可以是字、字節(jié)或雙字,可為REG或MEM,不能為立即數(shù)目的操作數(shù)是隱藏的,放置被除數(shù),可為AX或DX和AX或EDX和EAX。2.除法指令DIV和符號(hào)整數(shù)除法指令I(lǐng)DIV1.1乘除法指令11格式:DIVsource2.除法指令DIV和8位或16位除法指令所執(zhí)行的操作如下圖所示ALsourc8AXAXsourc16AXDXAHDX……1.1乘除法指令128位或16位除法指令所執(zhí)行的操作如下圖所示ALsourc8A32位除法指令所執(zhí)行的操作如下圖所示EAXsourc32EAXEDXEDX…可用除法運(yùn)算(除10取余)將二進(jìn)制數(shù)轉(zhuǎn)換為BCD數(shù)1.1乘除法指令1332位除法指令所執(zhí)行的操作如下圖所示EAXsourc32EA如,用除10取余法將8位二進(jìn)制數(shù)FFH轉(zhuǎn)換為BCD數(shù)255H的二進(jìn)制運(yùn)算如下圖所示1.1乘除法指令方法:“除10取余”法例如將AL中的8位無(wú)符號(hào)二進(jìn)制數(shù)轉(zhuǎn)換為BCD數(shù)放入AX中14如,用除10取余法將8位二進(jìn)制數(shù)FFH轉(zhuǎn)換為BCD數(shù)255H例如將AL中的8位無(wú)符號(hào)二進(jìn)制數(shù)轉(zhuǎn)換為BCD數(shù)放入AX中MOVAL,0FFHMOVCL,10MOVAH,0;將8位二進(jìn)制數(shù)擴(kuò)展為16位DIVCL;商→AL,余數(shù)→AH(個(gè)位數(shù))MOVCH,AH;暫存BCD數(shù)個(gè)位MOVAH,0DIVCL

;商→AL,余數(shù)→AH(十位數(shù))MOVCL,4SHLAH,CL;BCD數(shù)十位移至高4位ORCH,AH;BCD數(shù)十位與個(gè)位拼合MOVAH,0MOVCL,10DIVCL;AH中余數(shù)為BCD數(shù)的百位MOVAL,CH

;BCD數(shù)十位與個(gè)位送AL1.1乘除法指令15例如將AL中的8位無(wú)符號(hào)二進(jìn)制數(shù)轉(zhuǎn)換為BCD數(shù)放入AX中MO

3.擴(kuò)展指令CBW和CWD擴(kuò)展方法:要把一個(gè)8位二進(jìn)制數(shù)除以另一個(gè)8位二進(jìn)制數(shù),要有一個(gè)16位二進(jìn)制數(shù)在AX中,所以做8位除以8位的除法前先要把8位被除數(shù)擴(kuò)展為16位。做16位除以16位的除法前要把16位被除數(shù)擴(kuò)展為32位,做32位除以32位的除法前要把32位被除數(shù)擴(kuò)展為64位。這種擴(kuò)展對(duì)于無(wú)符號(hào)數(shù)除法只需將AH或DX或EDX清0,而對(duì)符號(hào)整數(shù)除法則要通過(guò)擴(kuò)展符號(hào)位來(lái)把被除數(shù)擴(kuò)展。1.1乘除法指令163.擴(kuò)展指令CBW和CWD擴(kuò)展方法:1.1乘除法指令都隱含操作數(shù)在做8位除以8位、16位除以16位、

32位除以32位的符號(hào)整數(shù)除法之前,應(yīng)先擴(kuò)展AL或AX或EAX中的被除數(shù)。擴(kuò)展指令和符號(hào)整數(shù)除法指令僅對(duì)補(bǔ)碼數(shù)適用。格式:CBW

;AL的最高位符號(hào)位擴(kuò)展至AH

CWD

;AX的最高位擴(kuò)展至DX

CWDE

;AX的最高位擴(kuò)展至EAX的高16位

CDQ

;EAX的最高位擴(kuò)展至EDX1.1乘除法指令17指令都隱含操作數(shù)格式:CBW;AL的最高位符號(hào)位擴(kuò)如:有一符號(hào)字?jǐn)?shù)組變量ARRAY,第1個(gè)字是被除數(shù),第2個(gè)字是除數(shù),接著存放商和余數(shù),其程序段為:MOVSI,OFFSETARRAYMOVAX,[SI]CWDIDIVWORDPTR2[SI]MOV4[SI],AXMOV6[SI],DX1.1乘除法指令18如:有一符號(hào)字?jǐn)?shù)組變量ARRAY,第1個(gè)字是被除數(shù),第2個(gè)字1.2BCD數(shù)調(diào)整指令分析:兩個(gè)BCD數(shù)相加,其和仍應(yīng)為BCD數(shù),如不是BCD數(shù)則結(jié)果錯(cuò)誤。(正確)BCD數(shù)十進(jìn)制數(shù)碼加法器的和(錯(cuò)誤)000000000∶∶∶1001910010001,0000101010∶∶∶0001,01011511110001,0110160001,0000∶∶∶0010,0101250001,1001如何修正?191.2BCD數(shù)調(diào)整指令分析:191.2BCD數(shù)調(diào)整指令造成此結(jié)果的原因?產(chǎn)生錯(cuò)誤的原因是8421BCD碼為十進(jìn)制,逢十進(jìn)一,而四位二進(jìn)制是逢十六進(jìn)一,二者進(jìn)位關(guān)系不同,當(dāng)和數(shù)大于9時(shí),8421BCD應(yīng)產(chǎn)生進(jìn)位,而十六進(jìn)制還不可能產(chǎn)生進(jìn)位。為此,應(yīng)對(duì)結(jié)果進(jìn)行修正。當(dāng)運(yùn)算結(jié)果小于等于9時(shí),不需修正或加“0”,但當(dāng)結(jié)果大于9時(shí),應(yīng)修正讓其產(chǎn)生一個(gè)進(jìn)位,加0110即可。如相加結(jié)果產(chǎn)生了進(jìn)位位,其結(jié)果必定大于9,所以,也需修正。對(duì)BCD數(shù)使用二進(jìn)制數(shù)算術(shù)運(yùn)算指令進(jìn)行運(yùn)算,然后執(zhí)行一條專用調(diào)整指令來(lái)處理BCD數(shù)的結(jié)果。201.2BCD數(shù)調(diào)整指令造成此結(jié)果的原因?20

1.BCD數(shù)加法調(diào)整指令DAA和AAA格式:

DAA功能:將AL中的數(shù)當(dāng)作兩個(gè)壓縮BCD數(shù)相加之和調(diào)整為正確的壓縮BCD數(shù)。調(diào)整規(guī)則:(AL&0FH)>9或AF=1,則AL加6;(AL&0F0H)>90H或CF=1,則AL加60H.1.2BCD數(shù)調(diào)整指令(1)壓縮BCD數(shù)加法調(diào)整211.BCD數(shù)加法調(diào)整指令DAA和AAA格式:DAA

注意:該指令操作數(shù)隱含為AL,即只能對(duì)AL中的操作數(shù)據(jù)進(jìn)行調(diào)整。導(dǎo)致壓縮BCD數(shù)的加減指令只能針對(duì)字節(jié)運(yùn)算。對(duì)結(jié)果調(diào)整時(shí)要用到CF和AF兩個(gè)標(biāo)志位,所以調(diào)整指令應(yīng)緊跟BCD數(shù)加法指令DAA指令會(huì)影響標(biāo)志如:MOVAX,3456H

ADDAL,AH;AL=8AH,AF=0,CF=0

DAA;AL=90H

00110100

+01010110

10001010

+0110

100100001.2BCD數(shù)調(diào)整指令22注意:001101001.2BCD數(shù)例1求兩個(gè)字變量W1和W2中壓縮BCD數(shù)之和,存入字節(jié)變量SUM中。如:8931+5678=14609,程序段如下:W1DW8931HW2DW5678HSUMDB3DUP(0)MOVAL,BYTEPTRW1

;AL=31H

ADD

AL,BYTEPTRW2

;31+78=A9H,AL=A9H,CF=0,AF=0

DAA

;AL=09H,CF=1

MOVSUM,AL;存?zhèn)€位和十位MOVAL,BYTEPTRW1+1

;AL=89H

ADCAL,BYTEPTRW2+1;89+56+CF=AL=E0H,CF=0,AF=1

DAA

;AL=46H,CF=1

MOVSUM+1,AL;存百位和千位MOVSUM+2,0;處理向萬(wàn)位的進(jìn)位RCLSUM+2,11.2BCD數(shù)調(diào)整指令23例1求兩個(gè)字變量W1和W2中壓縮BCD數(shù)之和,存入字節(jié)變量

格式:

AAA功能:將AL中的數(shù)當(dāng)作兩個(gè)非壓縮BCD數(shù)相加之和進(jìn)行調(diào)整,得到正確的非壓縮BCD數(shù)送AX

。調(diào)整規(guī)則:(AL&0FH)>9或AF=1,

則(AL+6)&0FH→AL,AH+1→AH

;否則,AL&0FH→AL,AH不變.(2)非壓縮BCD數(shù)加法調(diào)整1.2BCD數(shù)調(diào)整指令24格式:AAA(2)非壓縮BCD數(shù)加法調(diào)整1.2注意:同DAA指令,AAA指令的操作數(shù)也隱含為AL,且要緊跟加法指令。導(dǎo)致非壓縮BCD數(shù)的加減指令只能針對(duì)字節(jié)運(yùn)算。AAA調(diào)整后的存放規(guī)律可理解為調(diào)整后的個(gè)位數(shù)送AL,十位數(shù)(即進(jìn)位)加到AH中,故執(zhí)行該指令前應(yīng)注意AH是否清0。如:將兩個(gè)BCD數(shù)的ASCII碼相加,得到和的ASCII碼:

MOVAL,35H;’5’

ADDAL,39H;’9’,AL=6EH

MOVAH,0

AAA

;AX=0104H

ORAX,3030H;AX=3134H即’14’1.2BCD數(shù)調(diào)整指令25注意:1.2BCD數(shù)調(diào)整指令25例2求兩個(gè)字變量W1和W2中非壓縮BCD數(shù)之和,存入字節(jié)變量SUM中。如:89+67=156,程序段如下:W1DW0809HW2DW0607HSUMDB3DUP(0)

MOVAX,W1

;AX=0809H

ADDAL,BYTEPTRW2

;AL=10H,AF=1

AAA

;AX=0906H

MOVSUM,AL

;存?zhèn)€位MOVAL,AHADDAL,BYTEPTRW2+1

;AL=0FH,AF=0

MOVAH,0

AAA

;AL=05H,AH=01H

MOVWORDPTRSUM+1,AX

;存十位和百位1.2BCD數(shù)調(diào)整指令26例2求兩個(gè)字變量W1和W2中非壓縮BCD數(shù)之和,存入字節(jié)

格式:

DAS功能:將AL中的數(shù)當(dāng)作兩個(gè)壓縮BCD數(shù)相減之差進(jìn)行調(diào)整,得到正確的壓縮BCD數(shù)。調(diào)整規(guī)則:(AL&0FH)>9或AF=1,則AL減6;(AL&0F0H)>90H或CF=1,則AL減60H.如:

MOVAX,5643H

SUBAL,AH

;AL=DEH,有借位

DAS

;AL=78H,保持借位,即134-562.BCD數(shù)減法調(diào)整指令DAS和AAS(1)壓縮BCD數(shù)減法調(diào)整1.2BCD數(shù)調(diào)整指令27格式:DAS如:2.BCD數(shù)減法調(diào)整指令DAS和A

格式:

AAS功能:將AL中的數(shù)當(dāng)作兩個(gè)非壓縮BCD數(shù)相減之差進(jìn)行調(diào)整,得到正確的非壓縮BCD數(shù)送AX。

調(diào)整規(guī)則:(AL&0FH)>9或AF=1,則(AL-6)&0FH→AL,AH-1→AH;否則,AL&0FH→AL,AH不變.如:MOVAX,0806H

SUBAL,07H

;AX=08FFH

AAS

;AX=0709H(2)非壓縮BCD數(shù)減法調(diào)整1.2BCD數(shù)調(diào)整指令28格式:AAS如:MOVAX,0806H(2)非

格式:

AAM功能:將AL中小于64H的二進(jìn)制數(shù)變換為非壓縮BCD數(shù)送AX調(diào)整規(guī)則:AL/0AH→AH(十位),

ALMOD0AH→AL(個(gè)位)如:MOVAL,63H

AAM

;AX=0909H3.非壓縮BCD數(shù)乘除法調(diào)整指令A(yù)AM和AAD(1)乘法調(diào)整1.2BCD數(shù)調(diào)整指令29格式:AAM如:MOVAL,63H3.非壓縮例3字變量W和字節(jié)變量B分別存放著兩個(gè)非壓縮BCD數(shù),編寫求兩數(shù)之積,并將它存儲(chǔ)到JJ字節(jié)變量中的程序。

程序段如下:WDW0307HBDB9JJDB3DUP(0)MOVAL,BYTEPTRW ;AL=07H

MULB ;AX=003FH

AAM ;AX=0603H

MOVWORDPTRJJ,AX

MOVAL,BYTEPTRW+1 ;AL=03H

MULB ;AX=001BH

AAM ;AX=0207H

ADDAL,JJ+1 ;07H+06H=0DH,即AL=0DH

AAA ;進(jìn)位直接加入AH!AX=0303HMOVWORDPTRJJ+1,AX1.2BCD數(shù)調(diào)整指令30例3字變量W和字節(jié)變量B分別存放著兩個(gè)非壓縮BCD數(shù),編

格式:

AAD功能:將AX中的兩位非壓縮BCD數(shù)變換成二進(jìn)制數(shù)集中放在AL中。如:MOVAX,0906H

MOVDL,06H

AAD;AX=0060H

DIVDL;AL=10H,AH=0

MOVDL,AH;存余數(shù)AAM

;AX=0106H(2)除法調(diào)整注:此指令可對(duì)被除數(shù)進(jìn)行預(yù)調(diào)整加、減和乘法調(diào)整在相應(yīng)運(yùn)算操作之后進(jìn)行,而除法的調(diào)整在除法操作之前進(jìn)行1.2BCD數(shù)調(diào)整指令31格式:AAD如:(2)除法調(diào)整注:1.2BCD例3.4字變量W和字節(jié)變量B中分別存放著兩個(gè)非壓縮BCD數(shù)編程求二者的商和余數(shù),并分別存放到字變量QUOT和字節(jié)變量REMA中。程序段如下:

WDW0909H

BDB5

REMADB0

QUOTDW0

MOVAX,W

AAD ;0909H

63HDIVB ;63H

5=13H…4,AL=13H,AH=04HMOVREMA,AHAAM ;13H

0109HMOVQUOT,AX1.2BCD數(shù)調(diào)整指令32例3.4字變量W和字節(jié)變量B中分別存放著兩個(gè)非壓縮BCD數(shù)編例5從鍵盤鍵入0~9的任一自然數(shù)N,求其立方值并將其送顯示器顯示.INPUTDB’PleaseInputN(0~9):$’

LFBDB’0$

1$8$27$64$’

DB’125$216$343$512$729$’NDB0

MOVDX,OFFSETINPUT

MOVAH,9

INT21H顯示提示信息建立立方表可用乘法運(yùn)算實(shí)現(xiàn),也可用查表法實(shí)現(xiàn)。查表法程序段如下:1.3順序程序設(shè)計(jì)舉例33例5從鍵盤鍵入0~9的任一自然數(shù)N,求其立方值并將其送顯示MOVAH,1;輸入并顯示器顯示N,N送入AL

INT21H

MOVN,AL

MOVAH,2;2號(hào)系統(tǒng)功能調(diào)用-換行

MOVDL,0AH

INT21H

MOVDL,N

ANDDL,0FH;將‘N’轉(zhuǎn)換為N(將ASCII碼轉(zhuǎn)換為數(shù)字)MOVCL,2;將N乘以4

SHLDL,CL

MOVDH,0;8位4N擴(kuò)展為16位的地址偏移量ADDDX,OFFSETLFB;4N+表的偏移地址MOVAH,9

INT21H1.3順序程序設(shè)計(jì)舉例34MOVAH,1;輸入并顯示器顯例6編寫兩個(gè)32位無(wú)符號(hào)數(shù)的乘法程序程序如下:

.386

stacksegmentstackUSE16

stack

dw32dup(0) stackends datasegmentUSE16

ABDD12345678H CDDD12233445H ABCD DD2DUP(0) dataendscodesegmentUSE16

startprocfar

assumess:stack,cs:code,ds:data

1.3順序程序設(shè)計(jì)舉例35例6編寫兩個(gè)32位無(wú)符號(hào)數(shù)的乘法程序1.3順序程序設(shè)計(jì)舉pushds

subax,ax

pushax

movax,data

movds,ax

MOVEAX,AB

MULCD

MOVABCD,EAX

MOVABCD+4,EDX

ret

startendp

codeends

endstart1.3順序程序設(shè)計(jì)舉例36pushds

程序設(shè)計(jì)的基本技術(shù)135順序程序設(shè)計(jì)分支程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)子程序設(shè)計(jì)4串處理程序設(shè)計(jì)237程序設(shè)計(jì)的基本技術(shù)135順序程序設(shè)計(jì)分支程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)

順序程序是按指令的書(shū)寫(存放)順序執(zhí)行,而實(shí)際情況需要根據(jù)不同的條件做不同的處理,形成分支.匯編中的分支的條件往往是通過(guò)標(biāo)志的不同狀態(tài)而反映的。常用改變標(biāo)志指令和轉(zhuǎn)移指令實(shí)現(xiàn)分支。分類:JMP、JCOND兩類。轉(zhuǎn)移指令將控制程序轉(zhuǎn)向其后的目的標(biāo)號(hào)指定的地址。條件轉(zhuǎn)移指令緊跟在能改變并設(shè)置狀態(tài)的指令之后,由狀態(tài)標(biāo)志決定程序的走向。2分支程序設(shè)計(jì)38順序程序是按指令的書(shū)寫(存放)順序執(zhí)行,而實(shí)際情況需要根通用格式:Jcondshort_lable操作:若滿足條件,則OFFSETshort_lable→IP,實(shí)現(xiàn)轉(zhuǎn)移;否則順序執(zhí)行.short_lable→短標(biāo)號(hào),條件轉(zhuǎn)移是相對(duì)轉(zhuǎn)移指令,即從當(dāng)前地址到目標(biāo)地址的偏移量為-128~127(從本指令則為-126~+129,因?yàn)闂l件轉(zhuǎn)移指令均為雙字節(jié)指令),故只能實(shí)現(xiàn)段內(nèi)轉(zhuǎn)移.80386以后,在實(shí)地址方式下,能夠轉(zhuǎn)移到代碼段的任何位置。2.1條件轉(zhuǎn)移指令39通用格式:Jcondshort_lable2.1條件轉(zhuǎn)

僅判斷一個(gè)標(biāo)志位實(shí)現(xiàn)轉(zhuǎn)移.PF=0奇轉(zhuǎn)移JNP/JPOPF=1偶轉(zhuǎn)移

JP/JPEOF=0無(wú)溢出轉(zhuǎn)移JNOOF=1溢出轉(zhuǎn)移JOSF=0為正轉(zhuǎn)移JNSSF=1為負(fù)轉(zhuǎn)移JSCF=0無(wú)進(jìn)(借)位轉(zhuǎn)移JNCCF=1有進(jìn)(借)位轉(zhuǎn)移JCZF=0不相等/不等于0轉(zhuǎn)移JNE/JNZZF=1相等/等于0轉(zhuǎn)移JE/JZ標(biāo)志設(shè)置功能指令助記符1.簡(jiǎn)單條件轉(zhuǎn)移指令2.1條件轉(zhuǎn)移指令40僅判斷一個(gè)標(biāo)志位實(shí)現(xiàn)轉(zhuǎn)移.PF=0奇轉(zhuǎn)移JNP/JP如:JZ/JES_LAB→為零/相等轉(zhuǎn)移

操作:測(cè)試前面操作結(jié)果為0則轉(zhuǎn)移,即判ZF=1轉(zhuǎn)移.JZ,JE為等價(jià)助記符,任寫一種均可,可根據(jù)程序設(shè)計(jì)意圖選擇.如:

MOVBX,0FFFFH

INCBX;ZF=1

JZNEXT;為0轉(zhuǎn)移到NEXT

NEXT:……

2.1條件轉(zhuǎn)移指令41如:JZ/JES_LAB→為零/相等轉(zhuǎn)移2.1條件轉(zhuǎn)如:MOVBL,1;

CMPBL,5;ZF=0

JENEXT;比較結(jié)果相等則轉(zhuǎn)移到NEXT

;不相等順序執(zhí)行NEXT:…注意:此類指令,均只測(cè)試前面的操作結(jié)果所設(shè)標(biāo)志,指令本身不影響標(biāo)志.所以,在條件轉(zhuǎn)移指令前,一定有一條能正確影響標(biāo)志的指令.2.1條件轉(zhuǎn)移指令42如:MOVBL,1;2.

2.無(wú)符號(hào)數(shù)條件轉(zhuǎn)移指令

條件轉(zhuǎn)移常依據(jù)兩個(gè)數(shù)的關(guān)系來(lái)決定,兩個(gè)數(shù)的關(guān)系除相等與否,還有大小之分,比較大小時(shí),要區(qū)分是無(wú)符號(hào)數(shù)還是符號(hào)數(shù),否則答案不明確.如:0FFH>00H?

視為無(wú)符號(hào)數(shù)0FFH=255>00H;

視為符號(hào)數(shù)0FFH=-1﹤00H.所以,應(yīng)將兩種類型的數(shù)分開(kāi)比較:對(duì)無(wú)符號(hào)數(shù)使用術(shù)語(yǔ):低于/高于

Below/Above;對(duì)帶符號(hào)數(shù)使用術(shù)語(yǔ):小于/大于

Less/Greater2.1條件轉(zhuǎn)移指令432.無(wú)符號(hào)數(shù)條件轉(zhuǎn)移指令條件轉(zhuǎn)移常依據(jù)兩個(gè)數(shù)的關(guān)

無(wú)符號(hào)數(shù)條件轉(zhuǎn)移指令有4條(P93,表3-2):指令助記符功能

JB/JNAE

低于/不高于等于轉(zhuǎn)移

JNB/JAE

不低于/高于等于轉(zhuǎn)移

JA/JNBE

高于/不低于等于轉(zhuǎn)移

JNA/JBE

不高于/低于等于轉(zhuǎn)移2.1條件轉(zhuǎn)移指令44無(wú)符號(hào)數(shù)條件轉(zhuǎn)移指令有4條(P93,表3-2):2.

3.符號(hào)數(shù)條件轉(zhuǎn)移指令

有符號(hào)數(shù)條件轉(zhuǎn)移指令有4條(P94,表3-3):

指令助記符功能

JL/JNGE

小于/不大于等于轉(zhuǎn)移

JNL/JGE

不小于/大于等于轉(zhuǎn)移

JG/JNLE

大于/不小于等于轉(zhuǎn)移

JNG/JLE

不大于/小于等于轉(zhuǎn)移2.1條件轉(zhuǎn)移指令453.符號(hào)數(shù)條件轉(zhuǎn)移指令有符號(hào)數(shù)條件轉(zhuǎn)移指令有4

格式:JMPtarget操作:將控制轉(zhuǎn)向目的標(biāo)號(hào)target:

target在段內(nèi):target的偏移地址→IP

target在段外:target的偏移地址→IP

target的段首址→CS條件轉(zhuǎn)移范圍為-128~+127,而無(wú)條件轉(zhuǎn)移指令沒(méi)有范圍限制.在分支程序中往往需要它將各分支重新匯集到一起.如何實(shí)現(xiàn)條件轉(zhuǎn)移指令的范圍?2.2無(wú)條件轉(zhuǎn)移指令1.無(wú)條件直接轉(zhuǎn)移指令46格式:JMPtarget條件轉(zhuǎn)移范圍為-1

格式:JMPdest

操作:

轉(zhuǎn)移的目的地址放于寄存器或存儲(chǔ)器。

目的操作數(shù)為寄存器→寄存器內(nèi)容送IP

目的操作數(shù)為字變量→字變量?jī)?nèi)容送IP

目的操作數(shù)為雙字變量→雙字變量?jī)?nèi)容送CS和IP

如:JMPNEXT;無(wú)條件轉(zhuǎn)移轉(zhuǎn)到NEXT

NEXT:…如:JMPWORDPTR[BX];即([BX])→IP

2.無(wú)條件間接轉(zhuǎn)移指令2.2無(wú)條件轉(zhuǎn)移指令47格式:JMPdest2.無(wú)條件間接轉(zhuǎn)移注意:分支實(shí)現(xiàn)的基本方法有兩種:一種是利用比較轉(zhuǎn)移指令實(shí)現(xiàn)分支;一種是利用跳轉(zhuǎn)表實(shí)現(xiàn)分支.視比較對(duì)象,正確選擇合適的轉(zhuǎn)移指令.要為每個(gè)分支安排正確出口.凡是可共用的部分,應(yīng)盡量放在公共程序段中以使程序簡(jiǎn)短.在調(diào)試分支程序時(shí),應(yīng)使用多組數(shù)據(jù),分別對(duì)各種分支進(jìn)行反復(fù)測(cè)試.2.3分支程序設(shè)計(jì)舉例48注意:2.3分支程序設(shè)計(jì)舉例48例7

編程計(jì)算下面函數(shù)值(X,Y均為字節(jié)符號(hào)數(shù))

思路:1、如何確定X、Y是同號(hào)、異號(hào)數(shù)?利用XORX,Y的結(jié)果來(lái)確定。若同號(hào),則異或的結(jié)果必為0;若異號(hào),則異或的結(jié)果必為1。2、如何確定X、Y是正數(shù)或負(fù)數(shù)?利用CMP指令,比較X,Y,與0的大小來(lái)確定。

2.3分支程序設(shè)計(jì)舉例49例7編程計(jì)算下面函數(shù)值(X,Y均為字節(jié)符號(hào)數(shù))思路:例7

編程計(jì)算下面函數(shù)值(X,Y均為字節(jié)符號(hào)數(shù))

XDB-5YDB20ZDB0

MOVAL,X

XORAL,Y

;根據(jù)X、Y的符號(hào)置S標(biāo)志,相同為0

JSDIFF

;符號(hào)位S=1轉(zhuǎn)移,相異為1,X、Y相異結(jié)束

MOVZ,1

;Z賦1

CMPX,0

;相同后,判斷其中某數(shù)的符號(hào)

JNS

NOCHA

;大于等于0,結(jié)束NEGZ;小于0,求補(bǔ)得

1NOCHA:RETDIFF:MOVZ,0RET2.3分支程序設(shè)計(jì)舉例50例7編程計(jì)算下面函數(shù)值(X,Y均為字節(jié)符號(hào)數(shù))X例8從鍵盤上鍵入0~9中任一自然數(shù)N,將2的N次方值在顯示器的下一行顯示出來(lái)。思路:1、計(jì)算2N的方法:1左移N位,得到的結(jié)果為二進(jìn)制數(shù)。2、求得的徝是一個(gè)二進(jìn)制數(shù),為了輸出還要將二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)BCD數(shù)碼,將二進(jìn)制數(shù)轉(zhuǎn)化為BCD數(shù),采用“除10取余法”,

,為了使用9號(hào)系統(tǒng)功能調(diào)用,還需將BCD數(shù)碼的ASCII碼存入內(nèi)存,余數(shù)為BCD數(shù),余數(shù)加上30H即可得到余數(shù)的ASCII碼。3、2的N次方值對(duì)應(yīng)的列表在存儲(chǔ)器中的放法,其最大值是2的9次方,29=512,最大值的ASCII碼占3個(gè)單元,再加上回車、換行和

$

,所以輸出數(shù)據(jù)區(qū)OBUF最多6個(gè)單元。除10操作一直進(jìn)行到商等于0為止.本例中的最大商值為51(=33H),故可以采用16位除以8位的除法操作。2.3分支程序設(shè)計(jì)舉例51例8從鍵盤上鍵入0~9中任一自然數(shù)N,將2的N次方值在顯示例8從鍵盤上鍵入0~9中任一自然數(shù)N,將2的N次方值在顯示器的下一行顯示出來(lái)。程序段如下:

OBUFDB6DUP(0)

MOVAH,1鍵盤鍵入的數(shù)的ASCII碼送至AL

INT21H

ANDAL,0FH ;將

N

轉(zhuǎn)換為N

MOVCL,AL

MOVAX,1;1X2N SHLAX,CL MOVBX,5 MOVOBUF[BX],

$

MOVCX,10 ;轉(zhuǎn)換為十進(jìn)制數(shù)的ASCII碼

2.3分支程序設(shè)計(jì)舉例52例8從鍵盤上鍵入0~9中任一自然數(shù)N,將2的N次方值在顯示2.3分支程序設(shè)計(jì)舉例

MOVCX,10 ;轉(zhuǎn)換為十進(jìn)制數(shù)的ASCII碼AGAIN:MOVDX,0

DIVCX ORDL,30H DECBX MOVOBUF[BX],DL;將轉(zhuǎn)換結(jié)果“2”的ASCII碼存入

ANDAX,AX;判斷轉(zhuǎn)換是否結(jié)束

JNZAGAIN

SUBBX,2

MOVWORDPTROBUF[BX],0A0DH;存入回車換行 MOVDX,BX ADDDX,OFFSETOBUF MOVAH,9 INT21HRET532.3分支程序設(shè)計(jì)舉例MOVCX,10 例9從鍵盤上鍵入2位十六進(jìn)制數(shù)將其拼合成一個(gè)字節(jié)存入字節(jié)變量SB中。思路:1、鍵入的二位十六進(jìn)制數(shù)碼,采用10號(hào)系統(tǒng)功能調(diào)用,輸入并存好。(存的是ASCII碼)2、鍵入數(shù)碼假設(shè)為56,則存入AX中,AX=3635H,且AH=36H,AL=35H,3、如何將56的ASCII碼轉(zhuǎn)換為數(shù)碼并合并到一個(gè)字節(jié)中去。

注意:0-9和A-F的ASCII碼轉(zhuǎn)換為數(shù)碼的方法是不同的。2.3分支程序設(shè)計(jì)舉例54例9從鍵盤上鍵入2位十六進(jìn)制數(shù)將其拼合成一個(gè)字節(jié)存入字節(jié)變例9從鍵盤上鍵入2位十六進(jìn)制數(shù)將其拼合成一個(gè)字節(jié)存入字節(jié)變量SB中。IBUF DB3,0,3DUP(0)SB DB0 MOVDX,OFFSETIBUF;鍵入2位十六進(jìn)制數(shù) MOVAH,10 INT21H MOVAX,WORDPTRIBUF+2 ;鍵入字符送AX

SUBAX,3030H ;字符變?yōu)槭M(jìn)制數(shù) CMPAL,0AH JBLNSUB7 SUBAL,7LNSUB7: CMPAH,0AH JBLNSUB7 SUBAH,72.3分支程序設(shè)計(jì)舉例55例9從鍵盤上鍵入2位十六進(jìn)制數(shù)將其拼合成一個(gè)字節(jié)存入字節(jié)變HNSUB7: MOVCL,4;將AX中的數(shù)拼合成一個(gè)字節(jié) SHLAL,CL ORAL,AH MOVSB,AL

RET2.3分支程序設(shè)計(jì)舉例56HNSUB7: MOVCL,4;將AX中例10某工廠的產(chǎn)品有8種不同的加工處理程序P0~P7,根據(jù)鍵盤輸入,做不同的處理,若是0~7以外的鍵,則退出加工處理

此例可以用兩種方法實(shí)現(xiàn):一種是用逐一比較判斷,逐次比較轉(zhuǎn)移實(shí)現(xiàn)二叉分支、整體上實(shí)現(xiàn)多分支;另一種是跳轉(zhuǎn)表法,直接實(shí)現(xiàn)多分支.2.3分支程序設(shè)計(jì)舉例57例10某工廠的產(chǎn)品有8種不同的加工處理程序P0~P7,根據(jù)2.3分支程序設(shè)計(jì)舉例方法一︰逐一比較法.簡(jiǎn)單,條理清楚,易于實(shí)現(xiàn),但轉(zhuǎn)移范圍只能是:-128~+127,要求:分支不能太多。INPUTDB’Input(0~7):$’

MOVDX,OFFSETINPUT

;顯示提示

MOVAH,9

INT21HMOVAH,1

;等待鍵入一個(gè)字符

INT21H

CMPAL,’0’

;為0字符則轉(zhuǎn)P0

JEP0CMPAL,’1’

;為1字符則轉(zhuǎn)P1

JEP1582.3分支程序設(shè)計(jì)舉例方法一︰逐一比較法.簡(jiǎn)單,條理清楚2.3分支程序設(shè)計(jì)舉例

CMPAL,’2’JEP2CMPAL,’3’JEP3CMPAL,’4’

JEP4CMPAL,’5’JEP5CMPAL,’6’JEP6CMPAL,’7’JEP7RET;不是0~7則退出程序

592.3分支程序設(shè)計(jì)舉例CMPAL,’2’592.3分支程序設(shè)計(jì)舉例

P0:MOVDL,’0’;鍵入0則顯示0以替代P0程序

JMPEXITP1:MOVDL,’1’

;鍵入1則顯示1以替代P1程序

JMPEXIT

︰P7:MOVDL,’7’JMPEXITEXIT:MOVAH,2INT21HRET

;分支程序一定要注意匯合到結(jié)束處

602.3分支程序設(shè)計(jì)舉例P0:MOVDL,’2.3分支程序設(shè)計(jì)舉例

方法二:跳轉(zhuǎn)表法

利用無(wú)條件的間接轉(zhuǎn)移指令可實(shí)現(xiàn)遠(yuǎn)距離的多分支(間接跳轉(zhuǎn)至不同分支的入口處)在數(shù)據(jù)區(qū)造一地址表,存放不同的分支入口地址;設(shè)表的首地址為PTAB,每一個(gè)PTABP0入口地址占一個(gè)字單元,+2P1∴Pi的入口地址=PTAB+2*i+4P2若將2*i→BX,則JMPPTAB[BX]

:可轉(zhuǎn)到Pi入口處612.3分支程序設(shè)計(jì)舉例方法二:跳轉(zhuǎn)表法612.3分支程序設(shè)計(jì)舉例

INPUTDB’INPUT(0~7):$’

PTABDWP0,P1,P2,P3,P4,P5,P6,P7;定義地址表

MOVDX,OFFSETINPUT

;顯示提示

MOVAH,9

INT21H

MOVAH,1

;等待鍵入0~7的數(shù)字

INT21H

CMPAL,’0’;檢查輸入數(shù)據(jù),不是0~7則退出

JBEXIT

CMPAL,’7’

JAEXITANDAX,0FH

;

i*2→BX

ADDAX,AX

622.3分支程序設(shè)計(jì)舉例INPUTDB’INPUT(2.3分支程序設(shè)計(jì)舉例

MOVBX,AX

JMPPTAB[BX]

;(PTAB+2*i)=Pi→IPP0:MOVDL,’0’;鍵入0則顯示0以替代P0程序

JMPDOWNP1:MOVDL,’1’

;鍵入1則顯示1以替代P1程序

JMPDOWN︰P7:MOVDL,’7’DOWN:MOVAH,2INT21HRET鍵入的ASCⅡ碼為無(wú)符號(hào)數(shù),所以,用JB、JA等指令而不能用JG、JL等。請(qǐng)思考:若為跨段標(biāo)號(hào),應(yīng)修改哪些地方?注:只需修改:DW→DD(存IP、CS)、i*2→i*4即可632.3分支程序設(shè)計(jì)舉例MOVBX,AX程序設(shè)計(jì)的基本技術(shù)125順序程序設(shè)計(jì)分支程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)子程序設(shè)計(jì)4串處理程序設(shè)計(jì)364程序設(shè)計(jì)的基本技術(shù)125順序程序設(shè)計(jì)分支程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)循環(huán)程序的四部分:(1)循環(huán)準(zhǔn)備(循環(huán)初始化)建地址指針、置計(jì)數(shù)初值、設(shè)置必要的常數(shù)、對(duì)工作寄存

器及工作單元置初值或清0等.(2)循環(huán)體重復(fù)執(zhí)行的部分,循環(huán)的核心.(3)循環(huán)的修改修改計(jì)數(shù)器、寄存器、地址指針(基址或變址寄存器)、恢復(fù)某些參數(shù)。為下一輪循環(huán)做準(zhǔn)備。(4)循環(huán)控制修改計(jì)數(shù)器,判斷控制循環(huán)是否結(jié)束或繼續(xù)。3

循環(huán)程序設(shè)計(jì)65循環(huán)程序的四部分:3循環(huán)程序設(shè)計(jì)65循環(huán)程序的具體結(jié)構(gòu)流程有兩種:初始化循環(huán)體修改結(jié)束循環(huán)?YN(a)先執(zhí)行循環(huán)體,后判斷循環(huán)是否結(jié)束→至少執(zhí)行一次循環(huán)體初始化循環(huán)體修改進(jìn)入循環(huán)?YN(b)先判斷循環(huán)是否結(jié)束,后執(zhí)行循環(huán)體→可以不執(zhí)行循環(huán)體3.1循環(huán)程序的基本結(jié)構(gòu)66循環(huán)程序的具體結(jié)構(gòu)流程有兩種:初始化循環(huán)體修改結(jié)束循環(huán)?YN例:編程統(tǒng)計(jì)字變量W中有多少位1,并將結(jié)果存入字節(jié)

變量N中。方法一:先執(zhí)行,后判斷

MOVN,0

MOVCX,16LOP:SHLW,1

JNCNOINC

INCNNOINC:DECCX

JNZLOPret方法二:先判斷,后執(zhí)行

MOVN,0LOP:CMPW,0

JZDONE

SHLW,1

JNCLOP

INCN

JMPLOPDONE:retDECCXJNZLOP3.1循環(huán)程序的基本結(jié)構(gòu)67例:編程統(tǒng)計(jì)字變量W中有多少位1,并將結(jié)果存入字節(jié)

循環(huán)控制方法最常見(jiàn)的有兩種:⒈計(jì)數(shù)控制→循環(huán)次數(shù)已知,故可用某個(gè)寄存器或單元作為計(jì)數(shù)器,用計(jì)數(shù)器的值來(lái)控制循環(huán)的結(jié)束與否.⒉條件控制→循環(huán)次數(shù)未知,即循環(huán)次數(shù)與循環(huán)體的執(zhí)行情況有關(guān),通過(guò)條件測(cè)試指令來(lái)測(cè)試是否滿足循環(huán)條件,以控制循環(huán)是否結(jié)束.

3.1循環(huán)程序的基本結(jié)構(gòu)68循環(huán)控制方法最常見(jiàn)的有兩種:3.1循環(huán)程序的基本結(jié)構(gòu)68此類指令的特點(diǎn)是:

1、循環(huán)次數(shù)由CX計(jì)數(shù)器控制.循環(huán)指令本身不影

響標(biāo)志。

2、同條件轉(zhuǎn)移指令一樣,重復(fù)控制指令也是相對(duì)

轉(zhuǎn)移指令(即段內(nèi)轉(zhuǎn)移),重復(fù)控制指令的目的地址必須在本指令地址的-126~129字節(jié)的

范圍之內(nèi)。3.2重復(fù)控制指令69此類指令的特點(diǎn)是:3.2重復(fù)控制指令69

⒈LOOP指令:無(wú)條件循環(huán)指令格式:

LOOPshort-lable操作:CX-1→CX,當(dāng)CX≠0則轉(zhuǎn)short-lable所指指令;否則順序執(zhí)行.注意:在使用LOOP指令前,必須把循環(huán)次數(shù)送入CX.LOOPshotr-lable=若CX=0,則循環(huán)要進(jìn)行65536次.DECCXJNZshort-lable3.2重復(fù)控制指令70⒈LOOP指令:無(wú)條件循環(huán)指令格式:LOOP

⒉LOOPZ/LOOPE指令:格式:

LOOPZ/LOOPEshort-lable操作:CX-1→CX,

當(dāng)CX≠0,且ZF=1(相等)則轉(zhuǎn)移;否則順序執(zhí)行.注意:本指令不影響ZF,ZF由前面指令設(shè)定.即前

面比較結(jié)果相等。3.2重復(fù)控制指令71⒉LOOPZ/LOOPE指令:格式:LOOP

格式:

LOOPNZ/LOOPNEshort-lable

操作:CX-1→CX,

當(dāng)CX≠0,且ZF=0(不相等)

則轉(zhuǎn)移;否則

順序執(zhí)行.格式:JCXZshort-lable操作:CX=0轉(zhuǎn)移,否則順序執(zhí)行.注意:指令本身不作減操作,本指令一般用在循環(huán)

的開(kāi)始處,當(dāng)CX=0,則跳過(guò)循環(huán)。⒊LOOPNZ/LOOPNE指令⒋JCXZ指令3.2重復(fù)控制指令72格式:LOOPNZ/LOOPNE

(注意循環(huán)結(jié)構(gòu),防止死循環(huán))下面通過(guò)幾個(gè)例題介紹循環(huán)控制計(jì)數(shù)控制條件控制計(jì)數(shù)與條件雙重控制對(duì)于某些問(wèn)題,還有一些特殊控制,如:設(shè)開(kāi)關(guān)變量等,可參其他教材.3.3單重循環(huán)程序設(shè)計(jì)舉例73(注意循環(huán)結(jié)構(gòu),防止死循環(huán))下面通過(guò)幾個(gè)例題介紹循環(huán)例11計(jì)算Z=X+Y,其中X、Y為雙字變量.32位系統(tǒng):XDD72345678H

YDD90ABCDEFH

ZDB5DUP(0)

MOVEAX,X

ADDEAX,Y

MOVDWORDPTRZ,EAX

MOVZ+4,0

RCLZ+4,1思路:按照由低到高字節(jié)相加.最后的和可能占5個(gè)字節(jié).用一個(gè)雙字變量所占的字節(jié)數(shù)4作為循環(huán)體的控制條件,為計(jì)數(shù)控制.3.3單重循環(huán)程序設(shè)計(jì)舉例74例11計(jì)算Z=X+Y,其中X、Y為雙字變量.32位系統(tǒng)例11計(jì)算Z=X+Y,其中X、Y為雙字變量.XDD72345678HYDD90ABCDEFHZDB5DUP(0)MOVCX,4

;設(shè)計(jì)數(shù)初值MOVSI,0

;地址指針ANDAX,AX;清CF,使CF=0AGAIN:MOVAL,BYTEPTRX[SI]ADCAL,BYTEPTRY[SI]MOVZ[SI],ALINCSI

;指下一個(gè)字節(jié)

LOOPAGAIN;計(jì)數(shù)控制

MOVZ[SI],0

;處理向

RCLZ[SI],1

萬(wàn)位進(jìn)位3.3單重循環(huán)程序設(shè)計(jì)舉例75例11計(jì)算Z=X+Y,其中X、Y為雙字變量.XDD例12編寫將某數(shù)據(jù)區(qū)十六進(jìn)制數(shù)加密的程序.每個(gè)數(shù)字占一個(gè)字節(jié)分析:設(shè)加密數(shù)關(guān)系如下:

十六數(shù):0123456789ABCDEF

加密數(shù):A98EF10B25D3746C

解密數(shù):658BD9EC2107FA34

即發(fā)0,則發(fā)A;發(fā)3,則發(fā)E;發(fā)A,則發(fā)D解密規(guī)律→解密數(shù)的位移量=加密數(shù)表的數(shù)值如:解密數(shù)0的位移量是=0AH

如:解密數(shù)4的位移量是=0FH3.3單重循環(huán)程序設(shè)計(jì)舉例76例12編寫將某數(shù)據(jù)區(qū)十六進(jìn)制數(shù)加密的程序.每個(gè)數(shù)字占一個(gè)字HEXSDB1,2,…,0EH

;待發(fā)數(shù)

NEQU$-HEXS;統(tǒng)計(jì)待發(fā)數(shù)個(gè)數(shù)JMHDBNDUP(0)

;存加密數(shù)JMBDB0AH,9,8,0EH,0FH,1,0,0BH,2,5,0DH,3,7,4,6,0CHMOVCX,NMOVBH,0

初始化

MOVSI,0AGAIN:MOVBL,HEXS[SI]

;取十六進(jìn)制數(shù),其大小正好為該數(shù)碼在加密表中的地址偏移量。

MOVAL,JMB[BX]

;[BX+AL]→AL

MOVJMH[SI],AL

;存加密數(shù)

INCSI

;指向下一數(shù)

LOOPAGAIN;計(jì)數(shù)控制加密表3.3單重循環(huán)程序設(shè)計(jì)舉例77HEXSDB1,2,…,0EH;待發(fā)數(shù)加密JMHDB0FH,0EH,8,9,0AH;設(shè)加密數(shù)NEQU$-JMH

;統(tǒng)計(jì)加密數(shù)個(gè)數(shù)KMBDB6,5,8,0BH,0DH,9,0EH,0CH,2,1,0,7,0FH,0AH,3,4KMHDBNDUP(0)

;存解密數(shù)

MOVCX,N

MOVBX,OFFSETKMB

MOVSI,0NEXT:MOVAL,JMH[SI]

XLATKMB

MOVKMH[SI],AL

INCSI

LOOPNEXT初始化查表解密解密表3.3單重循環(huán)程序設(shè)計(jì)舉例78JMHDB0FH,0EH,8,9,0AH例13將字節(jié)變量SB中的8位二進(jìn)數(shù)送顯示器顯示.思路:把SB中的八位二進(jìn)制數(shù)0或1,當(dāng)成數(shù)碼顯示出來(lái),八位數(shù)碼加1,需預(yù)留9個(gè)單元。1、為了避免通過(guò)CF來(lái)傳遞二進(jìn)制數(shù),先將SB中的8位二進(jìn)制數(shù)送入AL中,再左移AX,將1位二進(jìn)制數(shù)直接移入AH中。即將字節(jié)變量中的1位二進(jìn)制數(shù)移入AH中,再將移入的二進(jìn)制數(shù)變?yōu)锳SCII碼。SBDB9AHOBUFDB9DUP(0)3.3單重循環(huán)程序設(shè)計(jì)舉例79例13將字節(jié)變量SB中的8位二進(jìn)數(shù)送顯示器顯示.思路:把SSBDB9AHOBUFDB9DUP(0)

MOVCX,8MOVBX,0;BX為輸出緩沖區(qū)的地址偏移量

MOVAL,SBAGAIN:MOVAH,0SHLAX,1

ADDAH,30H

MOVOBUF[BX],AH

INCBX

LOOPAGAINMOV0BUF[BX],

$

MOVDX,OFFSETOBUF

MOVAH,9

INT21H

ret3.3單重循環(huán)程序設(shè)計(jì)舉例二進(jìn)制數(shù)顯示:80SBDB9AH3.3單重循環(huán)程序設(shè)計(jì)舉例二進(jìn)

SBDB8AHOBUFDB3DUP(0)

MOVCX,0204H;CH中為循環(huán)次數(shù),CL中為移位次數(shù)MOVBX,0;BX為輸出緩沖區(qū)的地址偏移量

MOVAL,SBAGAIN:MOVAH,3;將數(shù)碼轉(zhuǎn)換為ASCII碼SHLAX,CL

CMPAH,39H;確定數(shù)碼介于0-9或A-FJBENAD7ADDAH,7

NAD7:MOVOBUF[BX],AH

INCBX

DECCHJNZAGAIN

3.3單重循環(huán)程序設(shè)計(jì)舉例十六進(jìn)制數(shù)顯示:MOV0BUF[BX],

$

MOVDX,OFFSETOBUFMOVAH,9INT21Hret81SBDB8AH3.3單重循環(huán)程序設(shè)計(jì)舉例十六例14將鍵入的十進(jìn)制數(shù)(﹣32768~32767)轉(zhuǎn)換為二進(jìn)制數(shù)。思路:1、數(shù)碼的輸入采用10號(hào)系統(tǒng)功能調(diào)用,存入的是ASCII碼。2、判斷數(shù)碼是正數(shù)或負(fù)數(shù),若為正數(shù)則直接從第一個(gè)數(shù)碼

轉(zhuǎn)至第3步進(jìn)行轉(zhuǎn)換,若為負(fù)數(shù),則移至第2個(gè)數(shù)碼開(kāi)始

轉(zhuǎn)換。

如何判斷其正負(fù)?

將該數(shù)碼與“-”比較,若結(jié)果為0,則標(biāo)志位Z=1,否則Z=0,判斷時(shí),保留其Z,因?yàn)槿羰秦?fù)數(shù),需取其補(bǔ)碼。3、十進(jìn)制數(shù)碼轉(zhuǎn)換為二進(jìn)制數(shù),采用乘10的方法,此

部分采用循環(huán)程序,循環(huán)的次數(shù)為數(shù)碼個(gè)數(shù)。具體為:3.3單重循環(huán)程序設(shè)計(jì)舉例82例14將鍵入的十進(jìn)制數(shù)(﹣32768~32767)轉(zhuǎn)換為二算法:十進(jìn)制數(shù)→二進(jìn)制數(shù):反復(fù)*10+Di→循環(huán)體

D4D3D2D1D0=D4*104+D3*103+…+D0

=((((0*10+D4)*10+D3)*10+D2)*10+D1)*10+D0循環(huán)次數(shù)

輸入負(fù)數(shù)→輸入數(shù)碼個(gè)數(shù)-1;輸入正數(shù)(不帶符號(hào))→輸入數(shù)碼個(gè)數(shù)循環(huán)體中對(duì)其絕對(duì)值轉(zhuǎn)換為二進(jìn)制數(shù),若為負(fù)數(shù)還應(yīng)求補(bǔ)3.3單重循環(huán)程序設(shè)計(jì)舉例83算法:十進(jìn)制數(shù)→二進(jìn)制數(shù):3.3單重循環(huán)程序設(shè)計(jì)舉例83BINARYDW0OBUFDB’INPUTADECIMAL(﹣32768~32767):$’IBUFDB7,0,7DUP(0)MOVDX,OFFSETIBUF

;鍵入十進(jìn)制數(shù),存入的ASCII碼

MOVAH,10

INT21HMOVCL,IBUF+1

;十進(jìn)制數(shù)位數(shù)(含“-”)送CX

MOVCH,0MOVSI,OFFSETIBUF+2

;指向鍵入的第一個(gè)字符

CMPBYTEPTR[SI],’-’;判是否為負(fù)數(shù)

PUSHF

;保護(hù)零標(biāo)志

JNESININC

;正數(shù)跳轉(zhuǎn)至SININC

INCSI

;越過(guò)“-”指向數(shù)字

DECCX

;實(shí)際字符數(shù)少1(“-”號(hào))3.3單重循環(huán)程序設(shè)計(jì)舉例84BINARYDW03.3單重循環(huán)程序設(shè)計(jì)舉例84SININC:MOVAX,0

;開(kāi)始十進(jìn)制→二進(jìn)制AGAIN:MOVDX,10

;((0×10+a4)×10+…)×10+a0

MULDXANDBYTEPTR[SI],0FH

;十進(jìn)制數(shù)ASCⅡ轉(zhuǎn)換為BCD數(shù)。

ADDAL,[SI]ADCAH,0INCSI

;指向下一位

LOOPAGAIN

;計(jì)數(shù)循環(huán)

POPF

;恢復(fù)零標(biāo)志

JNZNNEG

;非0即為正數(shù),則不求補(bǔ)

NEGAX

;負(fù)數(shù)對(duì)其絕對(duì)值求補(bǔ)NNEG:MOVBINARY,AX

;存放結(jié)果

3.3單重循環(huán)程序設(shè)計(jì)舉例85SININC:MOVAX,0;開(kāi)例15對(duì)多個(gè)字符號(hào)數(shù)求和,結(jié)果不超出雙字符號(hào)數(shù),以十六進(jìn)制數(shù)的形式顯示其結(jié)果。

注意:其結(jié)果不超出雙字符號(hào)數(shù)

思路:

1、求多個(gè)數(shù)累加的方法,以0為基礎(chǔ)多次累加。

2、累加的和即8位十六進(jìn)制數(shù)如何轉(zhuǎn)換為ASCII碼?

通過(guò)循環(huán)左移把最高1位(二進(jìn)制數(shù)左移4位)移至最

低位,并用AND指令取出來(lái),再轉(zhuǎn)換為ASCII碼,循環(huán)

8次。

注意:轉(zhuǎn)換過(guò)程中,若該數(shù)碼大于9,則需進(jìn)行加9修正。3.3單重循環(huán)程序設(shè)計(jì)舉例86例15對(duì)多個(gè)字符號(hào)數(shù)求和,結(jié)果不超出雙字符號(hào)數(shù),以十六進(jìn)制.386

stack segmentstackUSE16

stack

dw32dup(0)

stack ends

data segmentUSE16

NUM DW1111H,2222H,3333H,4444H,5555H

DW6666H,7777H,8888H,9999H

COUNT EQU($-NUM)/2

RESULT DD0

OBUF DB10DUP(0)

data ends

3.3單重循環(huán)程序設(shè)計(jì)舉例87.386

stack segmentstackUSE1code segmentUSE16

begin procfar

assumess:stack,cs:code,ds:data

pushds

subax,ax

pushax

movax,data

movds,ax

MOVCX,COUNT

MOVEBX,0

AGAIN1:

MOVSXEAX,NUM[EBX*2]

ADDRESULT,EAX

INCEBX

LOOPAGAIN1

MOVDI,OFFSETOBUF

3.3單重循環(huán)程序設(shè)計(jì)舉例88code segmentUSE16

begin pro MOVCX,8;將十六進(jìn)制數(shù)拆轉(zhuǎn)為ASCII字符

AGAIN2:

ROLRESULT,4

MOVAL,0FH

ANDAL,BYTEPTRRESULT

ADDAL,30H

CMPAL,39H

JNANA7

ADDAL,7

NA7:

MOV[DI],AL

INCDI

LOOPAGAIN2

3.3單重循環(huán)程序設(shè)計(jì)舉例89 MOVCX,8;將十六進(jìn)制數(shù)拆轉(zhuǎn)為ASCII字符 MOVWORDPTR[DI],

$H

MOVBX,OFFSETOBUF-1;去掉前面的0

CONT:

INCBX

CMPBYTEPTR[BX],

0

JECONT

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論