版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
微型計算機機原理及應(yīng)用1微型計算機機原理及應(yīng)用1程序設(shè)計的基本技術(shù)1235順序程序設(shè)計分支程序設(shè)計循環(huán)程序設(shè)計子程序設(shè)計4串處理程序設(shè)計2程序設(shè)計的基本技術(shù)1235順序程序設(shè)計分支程序設(shè)計循環(huán)程序設(shè)精品資料3精品資料3你怎么稱呼老師?如果老師最后沒有總結(jié)一節(jié)課的重點的難點,你是否會認為老師的教學方法需要改進?你所經(jīng)歷的課堂,是講座式還是討論式?教師的教鞭“不怕太陽曬,也不怕那風雨狂,只怕先生罵我笨,沒有學問無顏見爹娘……”“太陽當空照,花兒對我笑,小鳥說早早早……”44注意:本書有關(guān)匯編語言程序設(shè)計只限于DOS環(huán)境下的實地址方式,該方式下字長為16位。順序程序是最簡單的程序,它的執(zhí)行順序和程序中指令的順序完全一致1順序程序設(shè)計5注意:本書有關(guān)匯編語言程序設(shè)計只限于DOS環(huán)境下的實地址方式
格式:MULsource
IMULsource
;符號整數(shù)乘法1.1乘除法指令1.乘法指令MUL和符號整數(shù)乘法指令I(lǐng)MUL1、源操作數(shù)
source可以是字節(jié)、字或雙字,可為寄存器或存儲器操作數(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注意:乘法指令對標志位CF和OF有影響,對其余標志位的影響不確定。1.1乘除法指令832位乘法指令所執(zhí)行的操作是EAX乘以source,乘積放回例如:將AX中的3位BCD數(shù)轉(zhuǎn)換為二進制數(shù)存入字節(jié)變量SB中。M0VCH,10MOVCL,4MOVSB,AL;暫存十位和個位MOVAL,AH;百位存入AL中MULCH;百位×10→AXMOVAH,SB;百位×10的積小于255,所以只用AL存放即可SHRAH,CL;取十位ADDAL,AH;百位×10+十位→ALMULCH;(百位×10+十位)×10→AXANDSB,0FH;取個位ADDSB,AL;(百位×10+十位)×10+個位→SB
N2×102+N1×10+N0=(N2×10+N1)×10+N0程序段如下:1.1乘除法指令9例如:將AX中的3位BCD數(shù)轉(zhuǎn)換為二進制數(shù)存入字節(jié)變量SB中
格式:IMULREG,source;REG←REGXsource
IMULREG,source,imm;REG←sourceXimm1.1乘除法指令注:符號整數(shù)乘法指令I(lǐng)MUL1、雙操作數(shù)乘法指令是用源操作數(shù)乘目的操作數(shù),乘積存入目的操作數(shù)。2、三操作數(shù)乘法指令是用源操作數(shù)乘立即數(shù),乘積存入目的操作數(shù)。3、要求:其源操作數(shù)
source可為寄存器或存儲器操作數(shù),目的操作數(shù)只能是16位和32位的寄存器,源、目的操作數(shù)的類型要求一致。10格式:IMULREG,source;RE
格式:
DIVsource
IDIVsource
;符號整數(shù)除法注意:源操作數(shù)source可以是字、字節(jié)或雙字,可為REG或MEM,不能為立即數(shù)目的操作數(shù)是隱藏的,放置被除數(shù),可為AX或DX和AX或EDX和EAX。2.除法指令DIV和符號整數(shù)除法指令I(lǐng)DIV1.1乘除法指令11格式:DIVsource2.除法指令DIV和8位或16位除法指令所執(zhí)行的操作如下圖所示ALsourc8AXAXsourc16AXDXAHDX……1.1乘除法指令128位或16位除法指令所執(zhí)行的操作如下圖所示ALsourc8A32位除法指令所執(zhí)行的操作如下圖所示EAXsourc32EAXEDXEDX…可用除法運算(除10取余)將二進制數(shù)轉(zhuǎn)換為BCD數(shù)1.1乘除法指令1332位除法指令所執(zhí)行的操作如下圖所示EAXsourc32EA如,用除10取余法將8位二進制數(shù)FFH轉(zhuǎn)換為BCD數(shù)255H的二進制運算如下圖所示1.1乘除法指令方法:“除10取余”法例如將AL中的8位無符號二進制數(shù)轉(zhuǎn)換為BCD數(shù)放入AX中14如,用除10取余法將8位二進制數(shù)FFH轉(zhuǎn)換為BCD數(shù)255H例如將AL中的8位無符號二進制數(shù)轉(zhuǎn)換為BCD數(shù)放入AX中MOVAL,0FFHMOVCL,10MOVAH,0;將8位二進制數(shù)擴展為16位DIVCL;商→AL,余數(shù)→AH(個位數(shù))MOVCH,AH;暫存BCD數(shù)個位MOVAH,0DIVCL
;商→AL,余數(shù)→AH(十位數(shù))MOVCL,4SHLAH,CL;BCD數(shù)十位移至高4位ORCH,AH;BCD數(shù)十位與個位拼合MOVAH,0MOVCL,10DIVCL;AH中余數(shù)為BCD數(shù)的百位MOVAL,CH
;BCD數(shù)十位與個位送AL1.1乘除法指令15例如將AL中的8位無符號二進制數(shù)轉(zhuǎn)換為BCD數(shù)放入AX中MO
3.擴展指令CBW和CWD擴展方法:要把一個8位二進制數(shù)除以另一個8位二進制數(shù),要有一個16位二進制數(shù)在AX中,所以做8位除以8位的除法前先要把8位被除數(shù)擴展為16位。做16位除以16位的除法前要把16位被除數(shù)擴展為32位,做32位除以32位的除法前要把32位被除數(shù)擴展為64位。這種擴展對于無符號數(shù)除法只需將AH或DX或EDX清0,而對符號整數(shù)除法則要通過擴展符號位來把被除數(shù)擴展。1.1乘除法指令163.擴展指令CBW和CWD擴展方法:1.1乘除法指令都隱含操作數(shù)在做8位除以8位、16位除以16位、
32位除以32位的符號整數(shù)除法之前,應(yīng)先擴展AL或AX或EAX中的被除數(shù)。擴展指令和符號整數(shù)除法指令僅對補碼數(shù)適用。格式:CBW
;AL的最高位符號位擴展至AH
CWD
;AX的最高位擴展至DX
CWDE
;AX的最高位擴展至EAX的高16位
CDQ
;EAX的最高位擴展至EDX1.1乘除法指令17指令都隱含操作數(shù)格式:CBW;AL的最高位符號位擴如:有一符號字數(shù)組變量ARRAY,第1個字是被除數(shù),第2個字是除數(shù),接著存放商和余數(shù),其程序段為:MOVSI,OFFSETARRAYMOVAX,[SI]CWDIDIVWORDPTR2[SI]MOV4[SI],AXMOV6[SI],DX1.1乘除法指令18如:有一符號字數(shù)組變量ARRAY,第1個字是被除數(shù),第2個字1.2BCD數(shù)調(diào)整指令分析:兩個BCD數(shù)相加,其和仍應(yīng)為BCD數(shù),如不是BCD數(shù)則結(jié)果錯誤。(正確)BCD數(shù)十進制數(shù)碼加法器的和(錯誤)000000000∶∶∶1001910010001,0000101010∶∶∶0001,01011511110001,0110160001,0000∶∶∶0010,0101250001,1001如何修正?191.2BCD數(shù)調(diào)整指令分析:191.2BCD數(shù)調(diào)整指令造成此結(jié)果的原因?產(chǎn)生錯誤的原因是8421BCD碼為十進制,逢十進一,而四位二進制是逢十六進一,二者進位關(guān)系不同,當和數(shù)大于9時,8421BCD應(yīng)產(chǎn)生進位,而十六進制還不可能產(chǎn)生進位。為此,應(yīng)對結(jié)果進行修正。當運算結(jié)果小于等于9時,不需修正或加“0”,但當結(jié)果大于9時,應(yīng)修正讓其產(chǎn)生一個進位,加0110即可。如相加結(jié)果產(chǎn)生了進位位,其結(jié)果必定大于9,所以,也需修正。對BCD數(shù)使用二進制數(shù)算術(shù)運算指令進行運算,然后執(zhí)行一條專用調(diào)整指令來處理BCD數(shù)的結(jié)果。201.2BCD數(shù)調(diào)整指令造成此結(jié)果的原因?20
1.BCD數(shù)加法調(diào)整指令DAA和AAA格式:
DAA功能:將AL中的數(shù)當作兩個壓縮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,即只能對AL中的操作數(shù)據(jù)進行調(diào)整。導致壓縮BCD數(shù)的加減指令只能針對字節(jié)運算。對結(jié)果調(diào)整時要用到CF和AF兩個標志位,所以調(diào)整指令應(yīng)緊跟BCD數(shù)加法指令DAA指令會影響標志如: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求兩個字變量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;處理向萬位的進位RCLSUM+2,11.2BCD數(shù)調(diào)整指令23例1求兩個字變量W1和W2中壓縮BCD數(shù)之和,存入字節(jié)變量
格式:
AAA功能:將AL中的數(shù)當作兩個非壓縮BCD數(shù)相加之和進行調(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,且要緊跟加法指令。導致非壓縮BCD數(shù)的加減指令只能針對字節(jié)運算。AAA調(diào)整后的存放規(guī)律可理解為調(diào)整后的個位數(shù)送AL,十位數(shù)(即進位)加到AH中,故執(zhí)行該指令前應(yīng)注意AH是否清0。如:將兩個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求兩個字變量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求兩個字變量W1和W2中非壓縮BCD數(shù)之和,存入字節(jié)
格式:
DAS功能:將AL中的數(shù)當作兩個壓縮BCD數(shù)相減之差進行調(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ù)當作兩個非壓縮BCD數(shù)相減之差進行調(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的二進制數(shù)變換為非壓縮BCD數(shù)送AX調(diào)整規(guī)則:AL/0AH→AH(十位),
ALMOD0AH→AL(個位)如:MOVAL,63H
AAM
;AX=0909H3.非壓縮BCD數(shù)乘除法調(diào)整指令AAM和AAD(1)乘法調(diào)整1.2BCD數(shù)調(diào)整指令29格式:AAM如:MOVAL,63H3.非壓縮例3字變量W和字節(jié)變量B分別存放著兩個非壓縮BCD數(shù),編寫求兩數(shù)之積,并將它存儲到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 ;進位直接加入AH!AX=0303HMOVWORDPTRJJ+1,AX1.2BCD數(shù)調(diào)整指令30例3字變量W和字節(jié)變量B分別存放著兩個非壓縮BCD數(shù),編
格式:
AAD功能:將AX中的兩位非壓縮BCD數(shù)變換成二進制數(shù)集中放在AL中。如:MOVAX,0906H
MOVDL,06H
AAD;AX=0060H
DIVDL;AL=10H,AH=0
MOVDL,AH;存余數(shù)AAM
;AX=0106H(2)除法調(diào)整注:此指令可對被除數(shù)進行預調(diào)整加、減和乘法調(diào)整在相應(yīng)運算操作之后進行,而除法的調(diào)整在除法操作之前進行1.2BCD數(shù)調(diào)整指令31格式:AAD如:(2)除法調(diào)整注:1.2BCD例3.4字變量W和字節(jié)變量B中分別存放著兩個非壓縮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中分別存放著兩個非壓縮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顯示提示信息建立立方表可用乘法運算實現(xiàn),也可用查表法實現(xiàn)。查表法程序段如下:1.3順序程序設(shè)計舉例33例5從鍵盤鍵入0~9的任一自然數(shù)N,求其立方值并將其送顯示MOVAH,1;輸入并顯示器顯示N,N送入AL
INT21H
MOVN,AL
MOVAH,2;2號系統(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擴展為16位的地址偏移量ADDDX,OFFSETLFB;4N+表的偏移地址MOVAH,9
INT21H1.3順序程序設(shè)計舉例34MOVAH,1;輸入并顯示器顯例6編寫兩個32位無符號數(shù)的乘法程序程序如下:
.386
stacksegmentstackUSE16
stack
dw32dup(0) stackends datasegmentUSE16
ABDD12345678H CDDD12233445H ABCD DD2DUP(0) dataendscodesegmentUSE16
startprocfar
assumess:stack,cs:code,ds:data
1.3順序程序設(shè)計舉例35例6編寫兩個32位無符號數(shù)的乘法程序1.3順序程序設(shè)計舉pushds
subax,ax
pushax
movax,data
movds,ax
MOVEAX,AB
MULCD
MOVABCD,EAX
MOVABCD+4,EDX
ret
startendp
codeends
endstart1.3順序程序設(shè)計舉例36pushds
程序設(shè)計的基本技術(shù)135順序程序設(shè)計分支程序設(shè)計循環(huán)程序設(shè)計子程序設(shè)計4串處理程序設(shè)計237程序設(shè)計的基本技術(shù)135順序程序設(shè)計分支程序設(shè)計循環(huán)程序設(shè)計
順序程序是按指令的書寫(存放)順序執(zhí)行,而實際情況需要根據(jù)不同的條件做不同的處理,形成分支.匯編中的分支的條件往往是通過標志的不同狀態(tài)而反映的。常用改變標志指令和轉(zhuǎn)移指令實現(xiàn)分支。分類:JMP、JCOND兩類。轉(zhuǎn)移指令將控制程序轉(zhuǎn)向其后的目的標號指定的地址。條件轉(zhuǎn)移指令緊跟在能改變并設(shè)置狀態(tài)的指令之后,由狀態(tài)標志決定程序的走向。2分支程序設(shè)計38順序程序是按指令的書寫(存放)順序執(zhí)行,而實際情況需要根通用格式:Jcondshort_lable操作:若滿足條件,則OFFSETshort_lable→IP,實現(xiàn)轉(zhuǎn)移;否則順序執(zhí)行.short_lable→短標號,條件轉(zhuǎn)移是相對轉(zhuǎn)移指令,即從當前地址到目標地址的偏移量為-128~127(從本指令則為-126~+129,因為條件轉(zhuǎn)移指令均為雙字節(jié)指令),故只能實現(xiàn)段內(nèi)轉(zhuǎn)移.80386以后,在實地址方式下,能夠轉(zhuǎn)移到代碼段的任何位置。2.1條件轉(zhuǎn)移指令39通用格式:Jcondshort_lable2.1條件轉(zhuǎn)
僅判斷一個標志位實現(xiàn)轉(zhuǎn)移.PF=0奇轉(zhuǎn)移JNP/JPOPF=1偶轉(zhuǎn)移
JP/JPEOF=0無溢出轉(zhuǎn)移JNOOF=1溢出轉(zhuǎn)移JOSF=0為正轉(zhuǎn)移JNSSF=1為負轉(zhuǎn)移JSCF=0無進(借)位轉(zhuǎn)移JNCCF=1有進(借)位轉(zhuǎn)移JCZF=0不相等/不等于0轉(zhuǎn)移JNE/JNZZF=1相等/等于0轉(zhuǎn)移JE/JZ標志設(shè)置功能指令助記符1.簡單條件轉(zhuǎn)移指令2.1條件轉(zhuǎn)移指令40僅判斷一個標志位實現(xiàn)轉(zhuǎn)移.PF=0奇轉(zhuǎn)移JNP/JP如:JZ/JES_LAB→為零/相等轉(zhuǎn)移
操作:測試前面操作結(jié)果為0則轉(zhuǎn)移,即判ZF=1轉(zhuǎn)移.JZ,JE為等價助記符,任寫一種均可,可根據(jù)程序設(shè)計意圖選擇.如:
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:…注意:此類指令,均只測試前面的操作結(jié)果所設(shè)標志,指令本身不影響標志.所以,在條件轉(zhuǎn)移指令前,一定有一條能正確影響標志的指令.2.1條件轉(zhuǎn)移指令42如:MOVBL,1;2.
2.無符號數(shù)條件轉(zhuǎn)移指令
條件轉(zhuǎn)移常依據(jù)兩個數(shù)的關(guān)系來決定,兩個數(shù)的關(guān)系除相等與否,還有大小之分,比較大小時,要區(qū)分是無符號數(shù)還是符號數(shù),否則答案不明確.如:0FFH>00H?
視為無符號數(shù)0FFH=255>00H;
視為符號數(shù)0FFH=-1﹤00H.所以,應(yīng)將兩種類型的數(shù)分開比較:對無符號數(shù)使用術(shù)語:低于/高于
Below/Above;對帶符號數(shù)使用術(shù)語:小于/大于
Less/Greater2.1條件轉(zhuǎn)移指令432.無符號數(shù)條件轉(zhuǎn)移指令條件轉(zhuǎn)移常依據(jù)兩個數(shù)的關(guān)
無符號數(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無符號數(shù)條件轉(zhuǎn)移指令有4條(P93,表3-2):2.
3.符號數(shù)條件轉(zhuǎn)移指令
有符號數(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.符號數(shù)條件轉(zhuǎn)移指令有符號數(shù)條件轉(zhuǎn)移指令有4
格式:JMPtarget操作:將控制轉(zhuǎn)向目的標號target:
target在段內(nèi):target的偏移地址→IP
target在段外:target的偏移地址→IP
target的段首址→CS條件轉(zhuǎn)移范圍為-128~+127,而無條件轉(zhuǎn)移指令沒有范圍限制.在分支程序中往往需要它將各分支重新匯集到一起.如何實現(xiàn)條件轉(zhuǎn)移指令的范圍?2.2無條件轉(zhuǎn)移指令1.無條件直接轉(zhuǎn)移指令46格式:JMPtarget條件轉(zhuǎn)移范圍為-1
格式:JMPdest
操作:
轉(zhuǎn)移的目的地址放于寄存器或存儲器。
目的操作數(shù)為寄存器→寄存器內(nèi)容送IP
目的操作數(shù)為字變量→字變量內(nèi)容送IP
目的操作數(shù)為雙字變量→雙字變量內(nèi)容送CS和IP
如:JMPNEXT;無條件轉(zhuǎn)移轉(zhuǎn)到NEXT
…
NEXT:…如:JMPWORDPTR[BX];即([BX])→IP
2.無條件間接轉(zhuǎn)移指令2.2無條件轉(zhuǎn)移指令47格式:JMPdest2.無條件間接轉(zhuǎn)移注意:分支實現(xiàn)的基本方法有兩種:一種是利用比較轉(zhuǎn)移指令實現(xiàn)分支;一種是利用跳轉(zhuǎn)表實現(xiàn)分支.視比較對象,正確選擇合適的轉(zhuǎn)移指令.要為每個分支安排正確出口.凡是可共用的部分,應(yīng)盡量放在公共程序段中以使程序簡短.在調(diào)試分支程序時,應(yīng)使用多組數(shù)據(jù),分別對各種分支進行反復測試.2.3分支程序設(shè)計舉例48注意:2.3分支程序設(shè)計舉例48例7
編程計算下面函數(shù)值(X,Y均為字節(jié)符號數(shù))
思路:1、如何確定X、Y是同號、異號數(shù)?利用XORX,Y的結(jié)果來確定。若同號,則異或的結(jié)果必為0;若異號,則異或的結(jié)果必為1。2、如何確定X、Y是正數(shù)或負數(shù)?利用CMP指令,比較X,Y,與0的大小來確定。
2.3分支程序設(shè)計舉例49例7編程計算下面函數(shù)值(X,Y均為字節(jié)符號數(shù))思路:例7
編程計算下面函數(shù)值(X,Y均為字節(jié)符號數(shù))
XDB-5YDB20ZDB0
MOVAL,X
XORAL,Y
;根據(jù)X、Y的符號置S標志,相同為0
JSDIFF
;符號位S=1轉(zhuǎn)移,相異為1,X、Y相異結(jié)束
MOVZ,1
;Z賦1
CMPX,0
;相同后,判斷其中某數(shù)的符號
JNS
NOCHA
;大于等于0,結(jié)束NEGZ;小于0,求補得
1NOCHA:RETDIFF:MOVZ,0RET2.3分支程序設(shè)計舉例50例7編程計算下面函數(shù)值(X,Y均為字節(jié)符號數(shù))X例8從鍵盤上鍵入0~9中任一自然數(shù)N,將2的N次方值在顯示器的下一行顯示出來。思路:1、計算2N的方法:1左移N位,得到的結(jié)果為二進制數(shù)。2、求得的徝是一個二進制數(shù),為了輸出還要將二進制數(shù)轉(zhuǎn)換為十進制數(shù)BCD數(shù)碼,將二進制數(shù)轉(zhuǎn)化為BCD數(shù),采用“除10取余法”,
,為了使用9號系統(tǒng)功能調(diào)用,還需將BCD數(shù)碼的ASCII碼存入內(nèi)存,余數(shù)為BCD數(shù),余數(shù)加上30H即可得到余數(shù)的ASCII碼。3、2的N次方值對應(yīng)的列表在存儲器中的放法,其最大值是2的9次方,29=512,最大值的ASCII碼占3個單元,再加上回車、換行和
$
,所以輸出數(shù)據(jù)區(qū)OBUF最多6個單元。除10操作一直進行到商等于0為止.本例中的最大商值為51(=33H),故可以采用16位除以8位的除法操作。2.3分支程序設(shè)計舉例51例8從鍵盤上鍵入0~9中任一自然數(shù)N,將2的N次方值在顯示例8從鍵盤上鍵入0~9中任一自然數(shù)N,將2的N次方值在顯示器的下一行顯示出來。程序段如下:
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)換為十進制數(shù)的ASCII碼
2.3分支程序設(shè)計舉例52例8從鍵盤上鍵入0~9中任一自然數(shù)N,將2的N次方值在顯示2.3分支程序設(shè)計舉例
MOVCX,10 ;轉(zhuǎ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è)計舉例MOVCX,10 例9從鍵盤上鍵入2位十六進制數(shù)將其拼合成一個字節(jié)存入字節(jié)變量SB中。思路:1、鍵入的二位十六進制數(shù)碼,采用10號系統(tǒng)功能調(diào)用,輸入并存好。(存的是ASCII碼)2、鍵入數(shù)碼假設(shè)為56,則存入AX中,AX=3635H,且AH=36H,AL=35H,3、如何將56的ASCII碼轉(zhuǎn)換為數(shù)碼并合并到一個字節(jié)中去。
注意:0-9和A-F的ASCII碼轉(zhuǎn)換為數(shù)碼的方法是不同的。2.3分支程序設(shè)計舉例54例9從鍵盤上鍵入2位十六進制數(shù)將其拼合成一個字節(jié)存入字節(jié)變例9從鍵盤上鍵入2位十六進制數(shù)將其拼合成一個字節(jié)存入字節(jié)變量SB中。IBUF DB3,0,3DUP(0)SB DB0 MOVDX,OFFSETIBUF;鍵入2位十六進制數(shù) MOVAH,10 INT21H MOVAX,WORDPTRIBUF+2 ;鍵入字符送AX
SUBAX,3030H ;字符變?yōu)槭M制數(shù) CMPAL,0AH JBLNSUB7 SUBAL,7LNSUB7: CMPAH,0AH JBLNSUB7 SUBAH,72.3分支程序設(shè)計舉例55例9從鍵盤上鍵入2位十六進制數(shù)將其拼合成一個字節(jié)存入字節(jié)變HNSUB7: MOVCL,4;將AX中的數(shù)拼合成一個字節(jié) SHLAL,CL ORAL,AH MOVSB,AL
RET2.3分支程序設(shè)計舉例56HNSUB7: MOVCL,4;將AX中例10某工廠的產(chǎn)品有8種不同的加工處理程序P0~P7,根據(jù)鍵盤輸入,做不同的處理,若是0~7以外的鍵,則退出加工處理
此例可以用兩種方法實現(xiàn):一種是用逐一比較判斷,逐次比較轉(zhuǎn)移實現(xiàn)二叉分支、整體上實現(xiàn)多分支;另一種是跳轉(zhuǎn)表法,直接實現(xiàn)多分支.2.3分支程序設(shè)計舉例57例10某工廠的產(chǎn)品有8種不同的加工處理程序P0~P7,根據(jù)2.3分支程序設(shè)計舉例方法一︰逐一比較法.簡單,條理清楚,易于實現(xiàn),但轉(zhuǎn)移范圍只能是:-128~+127,要求:分支不能太多。INPUTDB’Input(0~7):$’
MOVDX,OFFSETINPUT
;顯示提示
MOVAH,9
INT21HMOVAH,1
;等待鍵入一個字符
INT21H
CMPAL,’0’
;為0字符則轉(zhuǎn)P0
JEP0CMPAL,’1’
;為1字符則轉(zhuǎn)P1
JEP1582.3分支程序設(shè)計舉例方法一︰逐一比較法.簡單,條理清楚2.3分支程序設(shè)計舉例
CMPAL,’2’JEP2CMPAL,’3’JEP3CMPAL,’4’
JEP4CMPAL,’5’JEP5CMPAL,’6’JEP6CMPAL,’7’JEP7RET;不是0~7則退出程序
592.3分支程序設(shè)計舉例CMPAL,’2’592.3分支程序設(shè)計舉例
P0:MOVDL,’0’;鍵入0則顯示0以替代P0程序
JMPEXITP1:MOVDL,’1’
;鍵入1則顯示1以替代P1程序
JMPEXIT
︰P7:MOVDL,’7’JMPEXITEXIT:MOVAH,2INT21HRET
;分支程序一定要注意匯合到結(jié)束處
602.3分支程序設(shè)計舉例P0:MOVDL,’2.3分支程序設(shè)計舉例
方法二:跳轉(zhuǎn)表法
利用無條件的間接轉(zhuǎn)移指令可實現(xiàn)遠距離的多分支(間接跳轉(zhuǎn)至不同分支的入口處)在數(shù)據(jù)區(qū)造一地址表,存放不同的分支入口地址;設(shè)表的首地址為PTAB,每一個PTABP0入口地址占一個字單元,+2P1∴Pi的入口地址=PTAB+2*i+4P2若將2*i→BX,則JMPPTAB[BX]
:可轉(zhuǎn)到Pi入口處612.3分支程序設(shè)計舉例方法二:跳轉(zhuǎn)表法612.3分支程序設(shè)計舉例
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è)計舉例INPUTDB’INPUT(2.3分支程序設(shè)計舉例
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Ⅱ碼為無符號數(shù),所以,用JB、JA等指令而不能用JG、JL等。請思考:若為跨段標號,應(yīng)修改哪些地方?注:只需修改:DW→DD(存IP、CS)、i*2→i*4即可632.3分支程序設(shè)計舉例MOVBX,AX程序設(shè)計的基本技術(shù)125順序程序設(shè)計分支程序設(shè)計循環(huán)程序設(shè)計子程序設(shè)計4串處理程序設(shè)計364程序設(shè)計的基本技術(shù)125順序程序設(shè)計分支程序設(shè)計循環(huán)程序設(shè)計循環(huán)程序的四部分:(1)循環(huán)準備(循環(huán)初始化)建地址指針、置計數(shù)初值、設(shè)置必要的常數(shù)、對工作寄存
器及工作單元置初值或清0等.(2)循環(huán)體重復執(zhí)行的部分,循環(huán)的核心.(3)循環(huán)的修改修改計數(shù)器、寄存器、地址指針(基址或變址寄存器)、恢復某些參數(shù)。為下一輪循環(huán)做準備。(4)循環(huán)控制修改計數(shù)器,判斷控制循環(huán)是否結(jié)束或繼續(xù)。3
循環(huán)程序設(shè)計65循環(huán)程序的四部分:3循環(huán)程序設(shè)計65循環(huán)程序的具體結(jié)構(gòu)流程有兩種:初始化循環(huán)體修改結(jié)束循環(huán)?YN(a)先執(zhí)行循環(huán)體,后判斷循環(huán)是否結(jié)束→至少執(zhí)行一次循環(huán)體初始化循環(huá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)計字變量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)計字變量W中有多少位1,并將結(jié)果存入字節(jié)
循環(huán)控制方法最常見的有兩種:⒈計數(shù)控制→循環(huán)次數(shù)已知,故可用某個寄存器或單元作為計數(shù)器,用計數(shù)器的值來控制循環(huán)的結(jié)束與否.⒉條件控制→循環(huán)次數(shù)未知,即循環(huán)次數(shù)與循環(huán)體的執(zhí)行情況有關(guān),通過條件測試指令來測試是否滿足循環(huán)條件,以控制循環(huán)是否結(jié)束.
3.1循環(huán)程序的基本結(jié)構(gòu)68循環(huán)控制方法最常見的有兩種:3.1循環(huán)程序的基本結(jié)構(gòu)68此類指令的特點是:
1、循環(huán)次數(shù)由CX計數(shù)器控制.循環(huán)指令本身不影
響標志。
2、同條件轉(zhuǎn)移指令一樣,重復控制指令也是相對
轉(zhuǎn)移指令(即段內(nèi)轉(zhuǎn)移),重復控制指令的目的地址必須在本指令地址的-126~129字節(jié)的
范圍之內(nèi)。3.2重復控制指令69此類指令的特點是:3.2重復控制指令69
⒈LOOP指令:無條件循環(huán)指令格式:
LOOPshort-lable操作:CX-1→CX,當CX≠0則轉(zhuǎn)short-lable所指指令;否則順序執(zhí)行.注意:在使用LOOP指令前,必須把循環(huán)次數(shù)送入CX.LOOPshotr-lable=若CX=0,則循環(huán)要進行65536次.DECCXJNZshort-lable3.2重復控制指令70⒈LOOP指令:無條件循環(huán)指令格式:LOOP
⒉LOOPZ/LOOPE指令:格式:
LOOPZ/LOOPEshort-lable操作:CX-1→CX,
當CX≠0,且ZF=1(相等)則轉(zhuǎn)移;否則順序執(zhí)行.注意:本指令不影響ZF,ZF由前面指令設(shè)定.即前
面比較結(jié)果相等。3.2重復控制指令71⒉LOOPZ/LOOPE指令:格式:LOOP
格式:
LOOPNZ/LOOPNEshort-lable
操作:CX-1→CX,
當CX≠0,且ZF=0(不相等)
則轉(zhuǎn)移;否則
順序執(zhí)行.格式:JCXZshort-lable操作:CX=0轉(zhuǎn)移,否則順序執(zhí)行.注意:指令本身不作減操作,本指令一般用在循環(huán)
的開始處,當CX=0,則跳過循環(huán)。⒊LOOPNZ/LOOPNE指令⒋JCXZ指令3.2重復控制指令72格式:LOOPNZ/LOOPNE
(注意循環(huán)結(jié)構(gòu),防止死循環(huán))下面通過幾個例題介紹循環(huán)控制計數(shù)控制條件控制計數(shù)與條件雙重控制對于某些問題,還有一些特殊控制,如:設(shè)開關(guān)變量等,可參其他教材.3.3單重循環(huán)程序設(shè)計舉例73(注意循環(huán)結(jié)構(gòu),防止死循環(huán))下面通過幾個例題介紹循環(huán)例11計算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個字節(jié).用一個雙字變量所占的字節(jié)數(shù)4作為循環(huán)體的控制條件,為計數(shù)控制.3.3單重循環(huán)程序設(shè)計舉例74例11計算Z=X+Y,其中X、Y為雙字變量.32位系統(tǒng)例11計算Z=X+Y,其中X、Y為雙字變量.XDD72345678HYDD90ABCDEFHZDB5DUP(0)MOVCX,4
;設(shè)計數(shù)初值MOVSI,0
;地址指針ANDAX,AX;清CF,使CF=0AGAIN:MOVAL,BYTEPTRX[SI]ADCAL,BYTEPTRY[SI]MOVZ[SI],ALINCSI
;指下一個字節(jié)
LOOPAGAIN;計數(shù)控制
MOVZ[SI],0
;處理向
RCLZ[SI],1
萬位進位3.3單重循環(huán)程序設(shè)計舉例75例11計算Z=X+Y,其中X、Y為雙字變量.XDD例12編寫將某數(shù)據(jù)區(qū)十六進制數(shù)加密的程序.每個數(shù)字占一個字節(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è)計舉例76例12編寫將某數(shù)據(jù)區(qū)十六進制數(shù)加密的程序.每個數(shù)字占一個字HEXSDB1,2,…,0EH
;待發(fā)數(shù)
NEQU$-HEXS;統(tǒng)計待發(fā)數(shù)個數(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]
;取十六進制數(shù),其大小正好為該數(shù)碼在加密表中的地址偏移量。
MOVAL,JMB[BX]
;[BX+AL]→AL
MOVJMH[SI],AL
;存加密數(shù)
INCSI
;指向下一數(shù)
LOOPAGAIN;計數(shù)控制加密表3.3單重循環(huán)程序設(shè)計舉例77HEXSDB1,2,…,0EH;待發(fā)數(shù)加密JMHDB0FH,0EH,8,9,0AH;設(shè)加密數(shù)NEQU$-JMH
;統(tǒng)計加密數(shù)個數(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è)計舉例78JMHDB0FH,0EH,8,9,0AH例13將字節(jié)變量SB中的8位二進數(shù)送顯示器顯示.思路:把SB中的八位二進制數(shù)0或1,當成數(shù)碼顯示出來,八位數(shù)碼加1,需預留9個單元。1、為了避免通過CF來傳遞二進制數(shù),先將SB中的8位二進制數(shù)送入AL中,再左移AX,將1位二進制數(shù)直接移入AH中。即將字節(jié)變量中的1位二進制數(shù)移入AH中,再將移入的二進制數(shù)變?yōu)锳SCII碼。SBDB9AHOBUFDB9DUP(0)3.3單重循環(huán)程序設(shè)計舉例79例13將字節(jié)變量SB中的8位二進數(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è)計舉例二進制數(shù)顯示:80SBDB9AH3.3單重循環(huán)程序設(shè)計舉例二進
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è)計舉例十六進制數(shù)顯示:MOV0BUF[BX],
$
MOVDX,OFFSETOBUFMOVAH,9INT21Hret81SBDB8AH3.3單重循環(huán)程序設(shè)計舉例十六例14將鍵入的十進制數(shù)(﹣32768~32767)轉(zhuǎn)換為二進制數(shù)。思路:1、數(shù)碼的輸入采用10號系統(tǒng)功能調(diào)用,存入的是ASCII碼。2、判斷數(shù)碼是正數(shù)或負數(shù),若為正數(shù)則直接從第一個數(shù)碼
轉(zhuǎn)至第3步進行轉(zhuǎn)換,若為負數(shù),則移至第2個數(shù)碼開始
轉(zhuǎn)換。
如何判斷其正負?
將該數(shù)碼與“-”比較,若結(jié)果為0,則標志位Z=1,否則Z=0,判斷時,保留其Z,因為若是負數(shù),需取其補碼。3、十進制數(shù)碼轉(zhuǎn)換為二進制數(shù),采用乘10的方法,此
部分采用循環(huán)程序,循環(huán)的次數(shù)為數(shù)碼個數(shù)。具體為:3.3單重循環(huán)程序設(shè)計舉例82例14將鍵入的十進制數(shù)(﹣32768~32767)轉(zhuǎn)換為二算法:十進制數(shù)→二進制數(shù):反復*10+Di→循環(huán)體
D4D3D2D1D0=D4*104+D3*103+…+D0
=((((0*10+D4)*10+D3)*10+D2)*10+D1)*10+D0循環(huán)次數(shù)
輸入負數(shù)→輸入數(shù)碼個數(shù)-1;輸入正數(shù)(不帶符號)→輸入數(shù)碼個數(shù)循環(huán)體中對其絕對值轉(zhuǎn)換為二進制數(shù),若為負數(shù)還應(yīng)求補3.3單重循環(huán)程序設(shè)計舉例83算法:十進制數(shù)→二進制數(shù):3.3單重循環(huán)程序設(shè)計舉例83BINARYDW0OBUFDB’INPUTADECIMAL(﹣32768~32767):$’IBUFDB7,0,7DUP(0)MOVDX,OFFSETIBUF
;鍵入十進制數(shù),存入的ASCII碼
MOVAH,10
INT21HMOVCL,IBUF+1
;十進制數(shù)位數(shù)(含“-”)送CX
MOVCH,0MOVSI,OFFSETIBUF+2
;指向鍵入的第一個字符
CMPBYTEPTR[SI],’-’;判是否為負數(shù)
PUSHF
;保護零標志
JNESININC
;正數(shù)跳轉(zhuǎn)至SININC
INCSI
;越過“-”指向數(shù)字
DECCX
;實際字符數(shù)少1(“-”號)3.3單重循環(huán)程序設(shè)計舉例84BINARYDW03.3單重循環(huán)程序設(shè)計舉例84SININC:MOVAX,0
;開始十進制→二進制AGAIN:MOVDX,10
;((0×10+a4)×10+…)×10+a0
MULDXANDBYTEPTR[SI],0FH
;十進制數(shù)ASCⅡ轉(zhuǎn)換為BCD數(shù)。
ADDAL,[SI]ADCAH,0INCSI
;指向下一位
LOOPAGAIN
;計數(shù)循環(huán)
POPF
;恢復零標志
JNZNNEG
;非0即為正數(shù),則不求補
NEGAX
;負數(shù)對其絕對值求補NNEG:MOVBINARY,AX
;存放結(jié)果
3.3單重循環(huán)程序設(shè)計舉例85SININC:MOVAX,0;開例15對多個字符號數(shù)求和,結(jié)果不超出雙字符號數(shù),以十六進制數(shù)的形式顯示其結(jié)果。
注意:其結(jié)果不超出雙字符號數(shù)
思路:
1、求多個數(shù)累加的方法,以0為基礎(chǔ)多次累加。
2、累加的和即8位十六進制數(shù)如何轉(zhuǎn)換為ASCII碼?
通過循環(huán)左移把最高1位(二進制數(shù)左移4位)移至最
低位,并用AND指令取出來,再轉(zhuǎn)換為ASCII碼,循環(huán)
8次。
注意:轉(zhuǎn)換過程中,若該數(shù)碼大于9,則需進行加9修正。3.3單重循環(huán)程序設(shè)計舉例86例15對多個字符號數(shù)求和,結(jié)果不超出雙字符號數(shù),以十六進制.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è)計舉例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è)計舉例88code segmentUSE16
begin pro MOVCX,8;將十六進制數(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è)計舉例89 MOVCX,8;將十六進制數(shù)拆轉(zhuǎn)為ASCII字符 MOVWORDPTR[DI],
$H
MOVBX,OFFSETOBUF-1;去掉前面的0
CONT:
INCBX
CMPBYTEPTR[BX],
0
JECONT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖北省武漢市2024年中考一模數(shù)學試題含答案
- 遼寧大學《公共政策理論與應(yīng)用》2023-2024學年第一學期期末試卷
- 黃河交通學院《藝術(shù)實踐(2)》2023-2024學年第一學期期末試卷
- 江蘇海事職業(yè)技術(shù)學院《建筑工程進度控制》2023-2024學年第一學期期末試卷
- 【物理】第七章 力 章末練習 2024-2025學年八年級下冊人教版物理
- 黑龍江財經(jīng)學院《醫(yī)藥學術(shù)推廣綜合實訓》2023-2024學年第一學期期末試卷
- 重慶三峽職業(yè)學院《大數(shù)據(jù)與數(shù)據(jù)分析》2023-2024學年第一學期期末試卷
- 重慶城市管理職業(yè)學院《消防工程綜合》2023-2024學年第一學期期末試卷
- 浙江育英職業(yè)技術(shù)學院《裝飾工程制圖及AutoCAD應(yīng)用》2023-2024學年第一學期期末試卷
- 體現(xiàn)漢字文化的有趣漢字故事
- 建筑工地節(jié)前停工安全檢查表
- 三年級下冊小猿口算題1000道
- QUALITY MANUAL質(zhì)量手冊(英文版)
- 決策的藝術(shù)課件
- 國際經(jīng)濟學國際貿(mào)易的標準理論
- 8D報告培訓教材(PPT 47頁)
- -居民死亡醫(yī)學證明(推斷)書
- 糖尿病酮癥酸中毒病例討論-文檔資料
- 液相色譜質(zhì)譜質(zhì)譜儀LCMSMSSYSTEM
- 民辦非企業(yè)單位章程核準表-空白表格
- 派克與永華互換表
評論
0/150
提交評論