《微機原理及單片機應(yīng)用技術(shù)》課件第3章 匯編語言與匯編程序設(shè)計基礎(chǔ)_第1頁
《微機原理及單片機應(yīng)用技術(shù)》課件第3章 匯編語言與匯編程序設(shè)計基礎(chǔ)_第2頁
《微機原理及單片機應(yīng)用技術(shù)》課件第3章 匯編語言與匯編程序設(shè)計基礎(chǔ)_第3頁
《微機原理及單片機應(yīng)用技術(shù)》課件第3章 匯編語言與匯編程序設(shè)計基礎(chǔ)_第4頁
《微機原理及單片機應(yīng)用技術(shù)》課件第3章 匯編語言與匯編程序設(shè)計基礎(chǔ)_第5頁
已閱讀5頁,還剩220頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章程序設(shè)計的基本技術(shù)3.13.23.33.5符號指令的格式8088/8086CPU的尋址方式8088/8086CPU的指令系統(tǒng)匯編語言程序?qū)崿F(xiàn)3.4偽指令3.6程序設(shè)計舉例操作助記符[目的操作數(shù)][,源操作數(shù)][;注釋]操作助記符,它以符號形式給出該指令進行什么操作,如數(shù)據(jù)傳送MOV?加ADD?減SUB和邏輯與AND等?操作數(shù)可以是操作數(shù)本身,可以是寄存器,也可以是地址表達式?有的操作數(shù)隱含在助記符中(形式上無操作數(shù)),有的只有1個操作數(shù),有的有2個操作數(shù),有的有3個操作數(shù),故符號指令的表示中使用了可選擇符號[]。3.1符號指令格式指令格式:

標(biāo)號:操作碼,操作數(shù)

;注釋標(biāo)號:內(nèi)存碼段中存放該指令的第一個字節(jié)的地址。操作碼:操作的性質(zhì)。操作數(shù):操作的對象,可以是操作數(shù)本身或存放操作數(shù)的內(nèi)存(I/O端口)地址。注釋:查看程序用,不參加編譯運行。尋址方式:指令中如何求出操作數(shù)有效地址的方法?(1)立即尋址(2)寄存器尋址(3)直接尋址(4)寄存器間接尋址(5)寄存器相對尋址(6)基址變址尋址(7)相對基址變址尋址3.28088/8086CPU的尋址方式尋址方式:尋找操作數(shù)的方式。計算機中操作數(shù)可以存放在以下幾個地方:指令代碼中,存放常量;MOVAX,2070H寄存器中:MOVAX,BX內(nèi)存中:MOVAX,[2000H]I/O端口中:INAL,40H…………碼段堆棧段數(shù)據(jù)段附加數(shù)據(jù)段…………碼段1堆棧段數(shù)據(jù)段碼段2每段的長度均小于64KB,即16位寄存器能表示的最大范圍。(1)立即尋址操作數(shù)直接放在指令中,緊跟在操作碼的后面,與操作碼一起放在存儲器的碼段區(qū)域中。MOVAX,2030HB820304004H4003H4002H4001H4000H……30H20HB8H……4004H4003H4002H4001H4000H……20H30HB8H……內(nèi)存地址內(nèi)存內(nèi)容錯誤!高字節(jié)高地址低字節(jié)低地址AXAHAL20H30H(2)寄存器尋址操作數(shù)放在CPU內(nèi)部的寄存器中,可以是8位或16位寄存器,注意源操作數(shù)和目的操作數(shù)的位數(shù)應(yīng)一致。MOVAX,BX;將BX中的內(nèi)容傳送到AX中去MOVAL,BH;將BH中的內(nèi)容傳送到AL中去MOVAL,BX錯誤!不匹配(3)直接尋址操作數(shù)存放在內(nèi)存中,在指令中給出存放操作數(shù)的偏移地址,如果不加說明,默認的段基址是數(shù)據(jù)段。MOVAX,[0020H];將

數(shù)據(jù)段偏移地址為0020H的地址中的內(nèi)容傳送到AX中去,相當(dāng)于:MOVAX,DS:[0020H]………………12H34H56H…………碼段堆棧段數(shù)據(jù)段……0000H0001H……0020H0021H0022H…………DS:0000H偏移地址內(nèi)存內(nèi)容MOVAX,[0020H]AXAHAL3412AX:3412H也可以傳送內(nèi)存中其他段的數(shù)據(jù),在相應(yīng)的偏移地址前加段超越符“:”。MOVAX,SS:[0020H];將

堆棧段偏移地址為0020H的地址中的內(nèi)容傳送到AX中去MOVES:[0100H],BX如果不加段超越,默認為數(shù)據(jù)段的偏移地址。(4)寄存器間接尋址操作數(shù)存放在內(nèi)存中,但其偏移地址存放寄存器中。在指令中只給出這個寄存器。MOVAX,[BX]BX中存放操作數(shù)的偏移地址其中,作為間址的寄存器只能有4個:BX,SI,DI,BP,其他寄存器無此功能。用BP尋址,段基址默認為堆棧段SS,其余3個的段基址默認為數(shù)據(jù)段DS,同時指令允許段超越?!?2H34H56H…………碼段堆棧段數(shù)據(jù)段……0000H0001H……0020H0021H0022H…………DS:0000H偏移地址內(nèi)存內(nèi)容MOVAX,[BX]AXAHAL3412AX:3412HMOVBX,0020HMOVAX,ES:[BX];傳送的操作數(shù)在附加段ES中,偏移地址存放在BX中。MOV[BP],BX;將BX中的內(nèi)容傳送到堆棧段中,其目的地的偏移地址存放在BP中。MOV[DI],2000H;將立即數(shù)2000H傳送到數(shù)據(jù)段中,其目的地的偏移地址存放在DI中。(5)寄存器相對尋址操作數(shù)存放在內(nèi)存中,但其偏移地址需要計算。偏移地址=寄存器內(nèi)容+指令中給定的偏移量MOVAX,[SI+0200H];欲傳送的操作數(shù)在數(shù)據(jù)段中,其偏移地址是SI寄存器中的內(nèi)容加上0200H同樣,作為變址的寄存器只能有4個:BX,SI,DI,BP,其他寄存器無此功能。用BP尋址,段基址默認為堆棧段SS,其余3個的段基址默認為數(shù)據(jù)段DS,同時指令允許段超越。MOVAX,0200H[BX]變址尋址可以有多種格式:MOVAX,[BX+0200H]MOVAX,0200H+[BX]例如:DS:3000H,BX:1000H數(shù)據(jù)所在的地址:高位:31201H低位:31200H(6)基址加變址尋址操作數(shù)存放在內(nèi)存中,但其偏移地址由兩部分相加而成:基址寄存器內(nèi)容+變址寄存器內(nèi)容MOVAX,[BX+SI];欲傳送的操作數(shù)在數(shù)據(jù)段中,其偏移地址是BX寄存器中的內(nèi)容加上SI寄存器中的內(nèi)容基址寄存器只有2個:BX,默認的段基址為DS;BP,默認的段基址為SS。變址寄存器只有2個:SI和DI。允許段超越。MOVAX,[BX+SI+0200H]MOVAX,0200H[BX+SI]MOVAX,0200H[BX][SI]MOVAX,0200H[BX][BP]MOVAX,0200H[SI][DI]必須是基址(BX或BP)加變址(DI或SI)MOVAX,0200H[BP+SI];欲取的數(shù)據(jù)在堆棧段(7)相對基址加變址尋址操作數(shù)存放在內(nèi)存中,但其偏移地址是由三部分相加而成:基址寄存器內(nèi)容+變址寄存器內(nèi)容+偏移量MOVAX,[BX+SI+0200H];欲傳送的操作數(shù)在數(shù)據(jù)段中,其偏移地址是BX寄存器中的內(nèi)容加上SI寄存器中的內(nèi)容加上0200H基址寄存器只有2個:BX,默認的段基址為DS;BP,默認的段基址為SS。變址寄存器只有2個:SI和DI。允許段超越。MOVAX,[BX+SI]MOVAX,[BX+SI]MOVAX,[BX][SI]MOVAX,[BX][BP]MOVAX,[SI][DI]必須是基址(BX或BP)加變址(DI或SI)MOVAX,[BP+SI];欲取的數(shù)據(jù)在堆棧段12H34H56H78H9AHBCHDEHF0H21000H21001H21002H21003H21004H21005H21006H21007H10H20H30H40H50H60H70H80H23000H23001H23002H23003H23004H23005H23006H23007H1AH2AH3AH4AH5AH6AH7AH8AH31000H31001H31002H31003H31004H31005H31006H31007H1BH2BH3BH4BH5BH6BH7BH8BH33000H33001H33002H33003H33004H33005H33006H33007HDS:2000HSS:3000HBX:1000HBP:3000HSI:3004HMOVAX,3000HMOVAX,BXMOVAX,[3000H]MOVAX,[BX]MOVAX,BPMOVAX,[BP]MOVAX,[SI]MOVSI,0002HMOVAX,[BX][SI]MOVAX,[BP+02H]MOVAL,[BX+06H]MOVAX,[BX+SI+4H]AX:3000HAX:1000HAX:2010HAX:3412HAX:3000HAX:2B1BHAX:6050HSI:0002HAX:7856HAX:4B3BHAL:DEHAX:F0DEH3.38086/8088指令系統(tǒng)數(shù)據(jù)傳送指令算術(shù)運算指令邏輯指令串操作指令程序控制指令處理機控制指令3.3.1數(shù)據(jù)傳送指令

1.通用數(shù)據(jù)傳送指令所有的MOV傳送指令都不能改變標(biāo)志CS,IP不能作為目的操作數(shù)MOVCS,AX兩個段寄存器間不能直接傳送MOVSS,DS立即數(shù)不能直接傳送給段寄存器

MOVDS,2000H內(nèi)存單元間不能直接傳送MOV[SI],[2000H]立即數(shù)不能作為目的操作數(shù)MOV1000H,AXMOVdest,srcMOVBL,AXMOV100,CXMOV[SI],AXMOVCS,AXMOV[SI],[DI]MOVBX,2[DI]MOVAX,CSMOVSS,2400HMOVAX,[BP+4]錯誤,不匹配錯誤,立即數(shù)不能賦值正確錯誤,CS不能賦值錯誤,內(nèi)存間不能直接傳送正確正確錯誤,段寄存器不能賦立即數(shù)正確堆棧操作指令:堆棧是按先進后出的原則組織的一段內(nèi)存區(qū)域,一般作臨時存儲器用(倉庫)。其指針SP為16位的寄存器,始終指向棧頂(貨物堆放的位置)。堆棧的空間大小是用戶指定的。SS:2000H;堆棧段的段基址;表示堆棧從20000H處開始20000H假設(shè)用戶定義堆棧為100個字節(jié),則SP自動設(shè)置為0064H20064H100個字節(jié)SP:0064H進棧:PUSHsrc出棧:POPdestMOVAX,1234HPUSHAX20000H20064H100個字節(jié)SP(1)SP-1

SPAH[SP]SP12H(2)SP-1

SPAL[SP]SP34H先減指針,再壓數(shù)據(jù),先高后低POPBX(1)[SP]BLSP+1SP(2)[SP]BHSP+1SP先出數(shù)據(jù),再加指針,先低后高BLBHSPSP只能對16位數(shù)進行操作,一次壓入彈出兩個字節(jié)PUSHAH必須對寄存器的內(nèi)容或內(nèi)存單元的內(nèi)容進行操作PUSH2000H設(shè)SP為0100H,SS為2000H,PUSHBP后,棧頂?shù)奈锢淼刂肥牵?0100H-2H=200FEH下列指令中,錯誤的是:PUSHDS B)POPCSC)PUSH30H[BX][SI] D)MOVSI,ES:[BP]B)POPCSMOVAX,1000HPUSHAXMOVBX,AXPUSH[BX]PUSH[1000H]POP[1002H]POPAXPOPBX12H34H56H78H9AHBCHDEHF0H21000H21001H21002H21003H21004H21005H21006H21007H30000H30001H………………30060H30061H30062H30063H30064HDS:2000HSS:3000HSP:0064HSP:0064H100個字節(jié)10H00HBX:1000H34H12H34H12H34H12HAX:3412HBX:1000H交換指令XCHGdest,srcdestsrc在寄存器之間,寄存器和內(nèi)存之間的8位,16位數(shù)據(jù)可以相互交換。XCHGAL,AHXCHGAX,[BX]內(nèi)存之間的數(shù)據(jù)不可相互交換

CS,IP不能參與交換段寄存器不能作為一個操作數(shù)

累加器專用指令(只與AX或AL有關(guān),與AH無關(guān))輸入輸出指令CPU存儲器輸入輸出INOUTAX或AL只能用IN、OUT指令向外設(shè)發(fā)命令;外設(shè)只能與CPU內(nèi)部寄存器AL或AX進行數(shù)據(jù)傳輸。INAL,40HOUT40H,ALINAX,40HOUT40H,AX8位16位(40H)AL(41H)AHAL(40H)AH(41H)INAL,352HOUT400H,AL當(dāng)外口地址大于8位(0FFH)時,用DX作間址MOVDX,352HINAL,DXMOVDX,400HOUTDX,ALIN,OUT只能對AL,AX操作,若傳送的數(shù)據(jù)為16位,則外口地址只能取偶數(shù)。INAX,35H表格查找指令(換碼指令)

XLAT使累加器AL中的一個值變換為存儲器表格中的某一個值,一般用來實現(xiàn)編碼碼制的轉(zhuǎn)換。用BX指向表的首地址,AL中的內(nèi)容為表中某一項與首地址之間的位移量。在執(zhí)行查表指令時,將BX與AL中的內(nèi)容相加,把得到的值作為地址,然后將此地址所對應(yīng)單元中的值取到AL中去。DS段表格首地址[BX+AL]AL11H…………20H…………33H22HBXALBX+0…………BX+AL…………BX+2BX+1AL執(zhí)行該指令前,應(yīng)該先建立一張表格,該表的最大容量為256字節(jié)。例:將十進制數(shù)字0~9變換成七段顯示碼的譯碼表01000000001111001140H79H40H79H24H30H19H12H02H78H00H10H0123456789例:從5號端口輸入十進制數(shù),轉(zhuǎn)換為7段碼后輸出到20號端口。40H79H24H30H19H12H02H78H00H10H01234567892000H2001H2002H2003H2004H2005H2006H2007H2008H2009HDS段MOVBX,2000HINAL,5HXLATOUT20H,AL例:向端口40H送字符35。40H79H24H30H19H12H02H78H00H10H01234567892000H2001H2002H2003H2004H2005H2006H2007H2008H2009HDS段MOVBX,2000HMOVAL,3XLATOUT40H,ALMOVAL,5XLATOUT40H,AL2.地址傳送指令取有效地址指令LEA:取存儲器單元的偏移地址LEAAX,[2728H];地址為2728H,AX為2728H功能:將存儲器地址送到一個寄存器。要求源操作數(shù)必須為存儲器單元地址,目的操作數(shù)必須為一個16位的通用寄存器。該指令通常用來使一個寄存器作為地址指針。LEABX,[BP+SI];BX為BP+SI

的值取內(nèi)存中的數(shù)

LDS將指定內(nèi)存中的4個字節(jié)(32位)分別裝入指定的寄存器和段寄存器DS中。30H19H…………79H40H24H2133H2134H…………2131H2130H2132HDS段例:2130H~2133H這4個單元中存放著一個地址[2130H][2131H]為該地址偏移量[2132H][2133H]為該地址段值LDSDI,[2130H]執(zhí)行后:DI:7940HDS:3024H取內(nèi)存中的數(shù)LES將指定內(nèi)存中的4個字節(jié)(32位)分別裝入指定的寄存器和段寄存器ES中。例:DS:1000HDI:0400H[10420H]=FFH[10421H]=00HLEAAX,20[DI];AX:0420HLEAAX,[DI];AX:0400H12H34H56H78H9AHBCHDEHF0H00H10H23000H23001H23002H23003H23004H23005H23006H23007H23008H23009H例:DS:2000HMOVBX,3004HMOVAL,02HXLATLEABX,[3000H]LESSI,[BX+04H]LDSDI,[BX+02H]AL:DEHBX:3000HSI:BC9AHES:F0DEHDI:7856HDS:BC9AH3.標(biāo)志傳送指令讀取標(biāo)志:LAHF(LoadAHwithFlags):將標(biāo)志寄存器FR中的低8位

AH中OFDFIFTFSFZFAFPFCF1514131211109876543210D7D6D4D2D0AH設(shè)置標(biāo)志:SAHF(SetFlagswithAH)上述指令的反向傳輸只提供8位標(biāo)志位指令,保持對8位機指令的兼容性標(biāo)志寄存器入棧命令:PUSHF將棧內(nèi)內(nèi)容進入標(biāo)志寄存器:POPF:只有這個命令可以改變TF的內(nèi)容。3.3.2算術(shù)運算指令概念:算術(shù)運算涉及兩種類型的數(shù)據(jù):有符號型和無符號型,對加減法這兩種類型采用同一套指令,對乘除法不能采用同一套指令。有符號數(shù)在計算機中以補碼的形式存儲。加減法:兩個加數(shù)或減數(shù)同為一種數(shù)據(jù)類型;兩種類型用不同的標(biāo)準比較大小。有符號數(shù)加減運算要考慮溢出。當(dāng)相同符號數(shù)相加但結(jié)果變號時,產(chǎn)生溢出標(biāo)志。例如:8+124000010000111110010000100結(jié)果:OF=1,CF=0例:8-5=8+(-5)0000100011111011100000011結(jié)果:OF=0,CF=1有符號數(shù)和無符號數(shù)指令相同,結(jié)果相同,但結(jié)果的意義不同。當(dāng)無符號數(shù)運算時,若CF=1,則超界。當(dāng)有符號數(shù)運算時,若OF=1,則溢出,結(jié)果錯誤若運算結(jié)果為0,則ZF=1若運算結(jié)果為負數(shù),則SF=1,即SF與最高位一致若運算結(jié)果中低8位有偶數(shù)個1,則PF=1若運算過程中低8位的位3向位4有進位,則AF=11.加減法指令一覽表加法指令1)不帶進位的加法ADDdest,srcdest+srcdest結(jié)果影響標(biāo)志位兩個操作數(shù)不可同為內(nèi)存單元ADD[BX+DI],[2000H]ADD[BX+DI],2000HADDDX,50H[BX+SI]設(shè)AX=C544H,執(zhí)行ADDAH,AL后,CF,OF?

C544109CF=1,OF=0MOVAX,5049HADDAX,0E2D7H5049E2D713320結(jié)果:CF=1,OF=0,ZF=0,SF=0,PF=0,AF=12)帶進位的加法ADCdest,srcdest+src+CFdest結(jié)果影響標(biāo)志位兩個操作數(shù)不可同為內(nèi)存單元ADC[BX+DI],[2000H]ADC[BX+DI],2000HADCDX,50H[BX+SI]該指令主要用于多字節(jié)數(shù)相加例:兩個四字節(jié)無符號數(shù)相加,這兩個數(shù)分別放在以2000H和3000H開始的存儲單元內(nèi),要求運算后得到的結(jié)果放在2000H開始的單元內(nèi)。40H79H24H30H2000H2001H2002H2003H40HB9HA4H30H3000H3001H3002H3003HCLCMOVSI,2000HMOVAX,[SI]SIADDAX,[3000H]MOV[SI],AXMOVAX,[SI+2]ADCAX,[3002H]MOV[SI+2],AX3)增量指令I(lǐng)NCdestdest+1dest不影響CF,影響AF,OF,PF,SF和ZFINCALINC[BX]MOVAL,0FFHCF=0,ZF=1減法指令1)不帶借位的減法SUBdest,srcdest-srcdest結(jié)果影響標(biāo)志位兩個操作數(shù)不可同為內(nèi)存單元SUB[BX+DI],[2000H]SUB[BX+DI],2000HSUBDX,50H[BX+SI]MOVAX,5049HSUBAX,0E2D7H5049E2D76D72結(jié)果:CF=1,OF=0,ZF=0,SF=0,PF=1,AF=02)帶借位的減法SBBdest,srcdest-src-CFdest結(jié)果影響標(biāo)志位兩個操作數(shù)不可同為內(nèi)存單元SBB[BX+DI],[2000H]SBB[BX+DI],2000HSBBDX,50H[BX+SI]該指令主要用于多字節(jié)數(shù)相加3)減量指令DECdestdest-1dest不影響CF,影響AF,OF,PF,SF和ZFDECALDEC[BX]MOVAL,00HCF=0,ZF=04)求補指令NEGdest;對操作數(shù)取補碼后送回0–destdestNEGALNEGCX指令影響標(biāo)志位AF,CF,OF,PF,SF和ZF,此指令執(zhí)行時,只有當(dāng)操作數(shù)為0時,CF為0,否則CF總為1。若操作數(shù)為80H或8000H,執(zhí)行求補指令后,結(jié)果沒有變化,但OF置1。5)比較指令CMPdest,src;dest-src

不送回結(jié)果,只影響標(biāo)志位

CMPAX,2000H;將AX內(nèi)容與2000H相比較,結(jié)果影響標(biāo)志位CMPAX,[BX+DI+100];比較結(jié)果影響標(biāo)志位AF,CF,OF,PF,SF和ZF。CMPAX,BX若結(jié)果ZF=1,可以判斷AX與BX相等;若AX與BX均為無符號數(shù),若CF為0,AX>BX;CF為1,AX<BX。若AX與BX均為有符號數(shù),若OF與SF相同(同為1或0),AX>BX;否則AX<BX。指令系統(tǒng)針對有符號數(shù)和無符號數(shù)的比較分別提供了不同的判斷指令。用戶只需在應(yīng)用時根據(jù)數(shù)據(jù)類型選擇不同的指令即可。將字節(jié)擴展成字的指令:CBW將AL中的符號位擴展到AH中。當(dāng)AL<80H,執(zhí)行CBW后,AH=0;當(dāng)AL>=80H時,AH=0FFH。當(dāng)遇到兩個字節(jié)相除時,要預(yù)先執(zhí)行CBW指令,擴展被除數(shù),否則不能正確執(zhí)行除法操作。將AX中的符號位擴展到DX中。當(dāng)AX<8000H,執(zhí)行CWD后,DX=0;當(dāng)AX>=8000H時,DX=0FFFFH。將字擴展成雙字的指令:CWD2.擴展指令3.乘法指令約定:兩個8位數(shù)相乘,有一個乘數(shù)在AL中,另一個乘數(shù)在寄存器或內(nèi)存中,乘積在AX中;兩個16位數(shù)相乘,有一個乘數(shù)在AX中,另一個乘數(shù)在寄存器或內(nèi)存中,乘積的高16位在DX中,低16位在AX中。乘法有有符號數(shù)和無符號數(shù)兩套指令8位數(shù)×8位數(shù)16位數(shù)16位數(shù)×16位數(shù)32位數(shù)無符號數(shù)乘法指令MULsrc;不出現(xiàn)AL或AXMULBL;AL×BLAXMULCX;AX×CXDX(高位),AX(低位)MULBYTEPTR[DI];AL×[DI]AXMULWORDPTR[SI];AX×[SI+1][SI]DX(高位),AX(低位)2)有符號數(shù)乘法指令I(lǐng)MULsrc;不出現(xiàn)AL或AXIMULBL;AL×BLAXIMULCX;AX×CXDX(高位),AX(低位)IMULBYTEPTR[DI];AL×[DI]AXIMULWORDPTR[SI];AX×[SI+1][SI]DX(高位),AX(低位)功能上與MUL相似,要求兩個乘數(shù)必須為有符號數(shù)乘法運算時,結(jié)果影響CF和OF,AF,PF,SF,ZF標(biāo)志位無意義。對MUL指令:當(dāng)乘積的高半部分不為0,CF=1,OF=1;否則,CF=0,OF=0。對IMUL指令:當(dāng)乘積的高半部分是低半部分最高位的擴展,乘積的高半部分每位與低半部分最高位相同時:CF=0,OF=0;否則,CF=1,OF=1。CF=1,OF=1表示高半部分包含有結(jié)果的有效數(shù)例:MOVAL,0FBHMOVBH,02HIMULBH結(jié)果:AX=0FFF6H,即-10,CF=0,OF=0MOVAL,0FBHMOVBH,02HMULBH結(jié)果:AX=01F6H,即502,CF=1,OF=14.除法指令約定:除數(shù)必須為被除數(shù)的一半字長被除數(shù)為16位,放在AX中,除數(shù)為8位,在寄存器或內(nèi)存中,8位商在AL中,8位余數(shù)AH中;被除數(shù)為32位,放在DX(高位),AX(低位)中,除數(shù)為16位,在寄存器或內(nèi)存中,16位商在AX中,16位余數(shù)DX中。除法有有符號數(shù)和無符號數(shù)兩套指令16位數(shù)÷8位數(shù)8位數(shù)32位數(shù)÷16位數(shù)16位數(shù)無符號數(shù)除法指令DIVsrc;不出現(xiàn)AX或DXAXDIVBL;AX÷BLAL(商),AH(余數(shù))DIVCX;DXAX÷CXAX(商),DX(余數(shù))DIVBYTEPTR[DI];AX÷[DI]AL(商)AH(余數(shù))DIVWORDPTR[SI];DXAX÷[SI+1][SI]AX(商),DX(余數(shù))2)有符號數(shù)除法指令I(lǐng)DIVsrc;不出現(xiàn)AX或DXAX功能上與DIV相似,要求被除數(shù),除數(shù)必須為有符號數(shù)。IDIVBL;AX÷BLAL(商),AH(余數(shù))注意:除法運算所有的標(biāo)志位都沒有意義;用IDIV指令時,如果是雙字除以一個字,則商的范圍為-32768~32767,如果是一個字除以一個字節(jié),則商的范圍為-128~127。如果超出這個范圍,會作為除數(shù)為0來處理,產(chǎn)生0號中斷;8086系統(tǒng)規(guī)定余數(shù)的符號和被除數(shù)相同;當(dāng)8位數(shù)除以8位數(shù),16位數(shù)除以16位數(shù)時,必須對被除數(shù)進行擴展。5)無符號數(shù)被除數(shù)擴展:將AH或DX清0。6)有符號數(shù)被除數(shù)擴展:對AH或DX符號擴展。5.BCD碼運算指令壓縮BCD碼:一個字節(jié)中有兩位BCD碼01000101非壓縮的BCD碼:一個字節(jié)只用低4位表示一位BCD碼,高4位為0。0000010000000101BCD碼:用二進制形式表示的十進制碼。每一位十進制數(shù)用4位二進制表示,運算規(guī)則是逢十進一。十進制BCD碼00000100012001030011401005010160110701118100091001BCD碼運算時,先用一般的二進制運算,然后再進行BCD碼調(diào)整。BCD碼加法十進制調(diào)整指令1)非壓縮BCD碼運算調(diào)整指令A(yù)AA兩個非壓縮BCD碼相加,結(jié)果在AL中,執(zhí)行該指令后將結(jié)果調(diào)整為十進制,放在AX中。MOVAL,7HADDAL,5HAAA;AL:0CH;AX:0102HCF=AF=1調(diào)整原則:在調(diào)整前若AL低半部包含的數(shù)值大于9或AF=1,則AAA完成下列操作:AL加6,AF和CF置1,AL的高4位清零。7+5=12用組合的BCD碼表示運算過程:000001110000010100001100BCD碼逢十進一,16進制逢16進1,因為低4位大于9,所以在個位上加6,使其產(chǎn)生進位,同時AF=1,CF=1。0000110000000110

0001001016進制加法AAA指令調(diào)整為10進制結(jié)果9+9=18用組合的BCD碼表示運算過程:000010010000100100010010BCD碼逢十進一,16進制逢16進1,因為低4位有進位,AF=1,所以在個位上加6,使其成為十進制運算結(jié)果,同時AF=1,CF=1。0001001000000110

0001100016進制加法AAA指令調(diào)整為10進制結(jié)果2)壓縮BCD碼運算調(diào)整指令DAA兩個壓縮BCD碼相加,結(jié)果在AL中,執(zhí)行該指令后將結(jié)果調(diào)整為十進制,放在AL中。MOVAL,56HADDAL,47HDAA;AL:9DH;AL:03HCF=1調(diào)整原則:如果AF=1或AL的低4位大于9,則AL加06H并置AF=1如果CF=1或AL的高4位大于9,則AL加60H并置CF=1。如果滿足上述2條,則AL加66H,并置AF=1,CF=1。MOVAX,1234HMOVBX,5678HADDAL,BLDAAMOVCL,ALMOVAL,AHADCAL,BHDAAMOVAH,ALMOVAL,CL;AL:ACH;AL:12HCF=1;CL:12H;AL:12H;AL:69H;AL:69HCF=0;AX:6912HCF=0MOVAX,‘8’ADDAL,‘9’AAA;AX:0038H;AX:0071HAF=1;AX:0107HAF=1因為AF=1,所以AH=1,CF=1,AF=1,AL高4位清零。BCD碼減法調(diào)整指令與加法調(diào)整指令類似,只是分別將加06H,60H,66H改為減06H,60H,66H。AAS:對非壓縮BCD碼減法調(diào)整DAS:對壓縮BCD碼減法調(diào)整必須緊跟在相對應(yīng)的加減法指令后進行調(diào)整。BCD碼乘法十進制調(diào)整指令A(yù)AM1)BCD碼均為無符號數(shù),故只有用MUL乘法指令才能調(diào)整(將AL中小于64H的二進制數(shù)變換為非壓縮BCD數(shù)送AX);2)BCD碼乘法調(diào)整指令只能對非壓縮BCD碼相乘結(jié)果進行調(diào)整;MOVAL,05HMOVBH,06HMULBHAAM;AX:001EH;AX:0300H1)BCD碼均為無符號數(shù),故只有用DIV除法指令才能調(diào)整,并且在兩個數(shù)相除前進行調(diào)整;2)BCD碼除法調(diào)整指令只能對非壓縮BCD碼相乘結(jié)果進行調(diào)整;MOVAX,0300HMOVBL,05HAADDIVBL;AX:001EH;AX:0300HBCD碼除法十進制調(diào)整指令A(yù)AD1.邏輯運算指令1)NOT按位取反NOTdestAX:73HDX:85HMOVAX,DXNOTAXADDAX,DXINCAX0000000010000101111111110111101011111111111111110000000000000000對標(biāo)志位沒有影響3.3.3邏輯運算和移位指令2)AND與,

OR或,

XOR異或ANDdest,srcdestANDsrcdest這三條指令執(zhí)行后,CF=0,OF=0,SF,PF,ZF發(fā)生變化。MOVAX,2050HANDAX,0FFHAX:0050HPF=1,SF=0,ZF=0XOR:相同出0,相異出1AL:00001111XORAL,0FFH000011111111111111110000XORAL,00H000011110000000000001111與0異或,狀態(tài)不變;與1異或,狀態(tài)相反。對某些位置1用OR;對某些位清零用AND;對某些位取反用XOR。假設(shè)BX=11100011B,變量VALUE的值為:01111001B,確定下列各條獨立指令的結(jié)果。XORBX,VALUEANDBX,VALUEORBX,VALUEXORBX,11111111B1001101001100001111000110111100101100001111110111001101011111011111000111111111100011100000111003)TESTTESTdest,src按位相與,結(jié)果只影響標(biāo)志位destANDsrc

影響標(biāo)志TESTCX,0FFFFHJZP1;檢驗CX是否為零;若標(biāo)志ZF=1,轉(zhuǎn)向P1

2.非循環(huán)移位指令SAL(ShiftArithmeticLeft):算術(shù)左移SHL(ShiftLogicLeft):邏輯左移0CF左移一位進CF,右邊補0,相當(dāng)于乘2。影響標(biāo)志若移位后最高位與CF不同,則OF=1,表示移位前后數(shù)據(jù)變號。若移位位數(shù)大于1,所移的位數(shù)用CL存放。MOVAL,02HSALAL,1;AL:00000010;AL:00000100MOVAL,02HSALAL,4MOVAL,02HMOVCL,4SALAL,CL;AL:00000010;AL:00100000SAR(ShiftArithmeticRight):算術(shù)右移CF最低位進CF,左邊重復(fù)最高位,即操作數(shù)符號不變。一般用于有符號數(shù)的右移,符號擴展。若移位位數(shù)大于1,所移的位數(shù)用CL存放。MOVAL,-4SARAL,1;AL:11111100;AL:11111110-2SHR(ShiftLogicRight):邏輯右移CF最低位進CF,左邊補0。一般用于無符號數(shù)的右移。若移位位數(shù)大于1,所移的位數(shù)用CL存放。MOVAL,8SHRAL,1;AL:00001000;AL:0000010040MOVSI,-1MOVCL,4SALSI,CLANDSI,7FFFHORSI,8000HNOTSI;SI:1111111111111111;SI:111111111111000011111111111100000111111111111111;SI:0111111111110000;SI:1111111111110000;SI:0000000000001111試分析下面程序完成什么任務(wù)MOVCL,4SHLDX,CLMOVBL,AHSHLAX,CLSHRBL,CLORDL,BLAX0BL0DX0DXAX03.循環(huán)移位指令ROL(RotateLeft):不帶進位循環(huán)左移CF若移位后最高位與CF不同,則OF=1,表示移位前后數(shù)據(jù)變號。若移位位數(shù)大于1,所移的位數(shù)用CL存放。ROR(RotateRight):不帶進位循環(huán)右移CF若移位位數(shù)大于1,所移的位數(shù)用CL存放。RCL(RotatethroughCFLeft):帶進位循環(huán)左移CFRCR(RotatethroughCFRight):帶進位循環(huán)右移CF可實現(xiàn)多字節(jié)的移位,將DX,AX左移1位SALAX,1RCLDX,1CFAX0CFDXCF假定DX:10111001B,CL:3,CF:1SHRDX,1SARDX,CLSHLDX,CLSHLDL,1RORDX,1RORDX,CLSALDH,1RCLDX,CLRCRDL,1;DX:01011100CF:1;DX:00010111CF:0;DX:10111001000CF:0;DX:01110010CF:1;DX:100000000101

1100CF:1;DX:0010000000010111CF:0;DX:0000000010111001CF:0;DX:0000010111001100CF:0;DX:0000000011011100CF:13.3.4串操作指令用一條指令實現(xiàn)對一串?dāng)?shù)據(jù)或字符的操作,字符或數(shù)據(jù)的個數(shù)在CX中,每執(zhí)行一次CX自動減1,直至減到零串操作自動停止;源操作數(shù)在DS:[SI]中,目的操作數(shù)在ES:[DI]中;源操作數(shù)和目的操作數(shù)都在內(nèi)存中,是唯一一條從內(nèi)存到內(nèi)存的指令;DF=1,地址自動由高至低,減量進行串運算;DF=0,地址自動由低至高,增量進行串運算。1.串操作指令串傳送指令MOVSB:每次傳送一個字節(jié);MOVSW:每次傳送一個字;將位于DS段,由SI所指出的存儲單元的字節(jié)或字傳送到位于ES段,由DI所指的存儲單元中,再根據(jù)DF修改SI和DI,從而指向下一個元素,繼續(xù)傳送,直到CX為0為止。DS:SIES:DIDS:SIES:DIDS:SIES:DIMOVSI,1000HMOVDI,2000HMOVCX,100CLDKKK:MOVSBDECCXJNZKKK假設(shè)DS與ES段已經(jīng)賦值;設(shè)置源操作數(shù)指針;設(shè)置目的操作數(shù)指針;傳送的元素個數(shù);DF=0,每傳送一次,地址自動加1,繼續(xù)傳送;每次傳送一個字節(jié);傳送一次,CX減1;CX不為0,繼續(xù)轉(zhuǎn)向KKK處MOVSB:相當(dāng)于[DS:SI][ES:DI]SI=SI+1DI=DI+1(DF=0)MOVSI,1000HMOVDI,2000HMOVCX,100CLDREPMOVSB通常,在串傳送指令前加段前綴REP,程序可自動計數(shù)并判別是否傳送完畢。REPMOVSB相當(dāng)于

[DS:SI][ES:DI]SI=SI+1DI=DI+1CX=CX-1CX!=0串比較指令CMPSB:每次比較一個字節(jié);CMPSW:每次比較一個字;將位于DS段由SI所指出的存儲單元的字節(jié)或字和ES段由DI所指的字節(jié)或字相比較,并且在比較之后根據(jù)DF自動修改SI和DI,通過段前綴的控制,可以實現(xiàn)在兩個字符串中尋找第一個不相等的元素或第一個相等的元素。依次比較兩個字符串是一個循環(huán)過程,這個循環(huán)過程有兩種退出條件,一是滿足比較條件,比如找到第一個相等字符或找到第一個不相等的字符;二是沒有滿足比較條件但已比較完所有的字符。串操作指令前綴CX不影響ZF1)REP:

無條件重復(fù)前綴2)REPE/REPZ:

相等時重復(fù)前綴3)REPNZ/REPNE:

比較結(jié)果不相等時重復(fù)前綴3. 加前綴的串操作指令重復(fù)串傳送REPMOVSBREPMOVSW重復(fù)串送存REPSTOSBREPSTOSW重復(fù)串裝入REPLODSBREPLODSW判斷一個微型機系統(tǒng)是否為初次加電,如果不是初次加電可以檢測到在RAM的400H單元開始的4個字節(jié)分別設(shè)置了加電標(biāo)志12,23,34,45。這4個字節(jié)的加電標(biāo)志是在初次加電時,由ROM區(qū)(位于0E2DH單元開始的4個字節(jié))復(fù)制過去的。當(dāng)然,ROM區(qū)中的E2DH處的加電標(biāo)志是永存的。假設(shè)ES指向RAM區(qū),DS指向ROM區(qū)MOVSI,0E2DHMOVDI,0400HMOVCX,4CLDREPZCMPSB

JZ

DONE

RETDONE:……;后續(xù)處理相等繼續(xù)比較如果4個字節(jié)都符合,表明設(shè)置好了加電標(biāo)志否則返回ZF與CX無關(guān)MOVSB/STOSB/LODSB指令完成后指針(SI,DI)自動增加或減少(DF);加上段前綴后CX自動減1,并判斷CX是否為0。若為0,終止循環(huán)。REPREPNZ/REPNEREPZ/REPECMPSBCMPSWMOVSW/STOSW/LODSW取字符串指令LODSB/LODSW(LoadString)將位于DS段SI所指的存儲單元的內(nèi)容取到AL或AX中。用LODSB時,每次取一個字節(jié),取完后,地址自動加1或減1;用LODSW時,每次取一個字,取完后,地址自動加2或減2。該指令一般不用段前綴,否則,AL或AX中的內(nèi)容會被后一次操作覆蓋,最后只能得到內(nèi)存中字符串的最后一個字節(jié)或字。ALLODSBDS:SIDS:SIDS:SIDS:SI存字符串指令STOSB/STOSW(StoreString)把AL或AX中的數(shù)據(jù)存放到位于ES段DI所指的存儲單元中,并自動修改地址指針。該指令可加段前綴,使內(nèi)存中連續(xù)的空間填滿相同的數(shù)據(jù)。將從0404H開始的256個單元清零CLDLEADI,[0404H]MOVCX,80HXORAX,AXREPSTOSW將從0700H單元開始的5個字節(jié)的內(nèi)容逐一取來,放在累加器中進行處理,處理完后再送到0700H的內(nèi)存區(qū)域。CLD MOVSI,0700H MOVDI,0700H MOVCX,5L1:

LODSB PUSHCX …… POPCX

STOSB DECCX JNZL1處理字符指令不用考慮指針DI,SI的變化字符串檢索指令SCASB/SCASW(ScanString)將AL或AX中的數(shù)據(jù)與位于ES段DI指針?biāo)傅膬?nèi)存單元的數(shù)據(jù)相比較,通過段前綴的控制,可以尋找到內(nèi)存單元中的第一個與AL(或AX)不同或相同的數(shù)據(jù)。REPNZSCASB:(AL)-[ES:DI],不為0(不相等)時繼續(xù)比較,DI自動加1或減1,CX自動減1,直到相等或CX為0時退出循環(huán)。尋找第一個相同的數(shù)據(jù)REPZSCASB:(AL)-[ES:DI],為0(相等)時繼續(xù)比較,DI自動加1或減1,CX自動減1,直到不相等或CX為0時退出循環(huán)。尋找第一個不同的數(shù)據(jù)。有一字符串放在以2000H單元為始地址的內(nèi)存中,從中搜索串結(jié)束符$,若有,將串長度x放入2100H單元,若沒有$,2100H單元放入0FFH。CLDMOVDI,2000HMOVCX,100MOVAL,‘$’REPNESCASBJZDONEMOVAL,0FFHJMPSTODONE:MOVBX,100 SUBBX,CX DECBLMOVAL,BLSTO:MOV[2100H],AL不等繼續(xù)比較若相等,轉(zhuǎn)向DONE比較完畢CX=0,不等,設(shè)立標(biāo)志計算字符串長度3.3.5控制轉(zhuǎn)移類指令1.轉(zhuǎn)移指令64KB內(nèi)段內(nèi)轉(zhuǎn)移,目標(biāo)指令與轉(zhuǎn)移指令在同一個代碼段CS,只改變IPCS:IP新CS:IP均不影響標(biāo)志位可以超過64KB段間轉(zhuǎn)移,目標(biāo)指令與轉(zhuǎn)移指令分別在不同的代碼段,轉(zhuǎn)移時需要改變CS和IP的值CS:IP新CS:IP格式:JMPtarget操作:將控制轉(zhuǎn)向目的標(biāo)號target:(1)target在段內(nèi):target的偏移地址→IP(2)target在段外:target的偏移地址→IPtarget的段首址→CS<1>.無條件直接轉(zhuǎn)移指令段內(nèi)直接轉(zhuǎn)移:轉(zhuǎn)移指令后直接給出目的指令處的地址。CS不變JMP立即數(shù)JMP2000H;立即數(shù)為16位或8位,是目的地的IP;IP=2000H段間直接轉(zhuǎn)移:轉(zhuǎn)移指令后直接給出目的指令處的地址CS:IP。JMP立即數(shù)JMP2000H:1236H;立即數(shù)為CS:IP的形式;CS=2000HIP=1236HJMP語句標(biāo)號(子程序名)語句標(biāo)號自動產(chǎn)生段間調(diào)用。

<2>.無條件間接轉(zhuǎn)移指令格式:JMPdest

操作:

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

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

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

段內(nèi)間接轉(zhuǎn)移:目的地指令處的地址存放在寄存器或內(nèi)存單元中,轉(zhuǎn)移指令后給出的是寄存器或內(nèi)存單元的地址。JMPdest;dest為寄存器或內(nèi)存單元地址JMPAX;AXIPJMPWORDPTR[2000H];[DS:2001H][DS:2000H]IPJMPWORDPTR[SI];[DS:SI+1][DS:SI]IP段間間接轉(zhuǎn)移:目的地指令處的地址存放在內(nèi)存單元中,一般用寄存器間接尋址。JMPDWORDPTR[SI];DS:[SI+3][SI+2]CSDS:[SI+1][SI]IPDS:SICSIP設(shè)DS:2000H,BX:1256H,SI:528FHTABLE:20A1H,[232F7H]=80H,[232F8H]=32H,[264E5H]=50H,[264E6H]=24HJMPBX;IP=1256HJMPTABLE[BX];IP=3280HJMP[BX][SI];IP=2450H<3>條件轉(zhuǎn)移指令:根據(jù)標(biāo)志位來判斷程序是否轉(zhuǎn)移。只能轉(zhuǎn)移到距當(dāng)前指令-128~127字節(jié)的范圍內(nèi),即一個字節(jié)的補碼范圍;比較兩數(shù)大小的指令,分有符號數(shù)和無符號數(shù)兩套指令。127128通用格式:Jcondshort_lable操作:若滿足條件,則OFFSETshort_lable→IP,實現(xiàn)轉(zhuǎn)移;否則順序執(zhí)行.short_lable→短標(biāo)號,條件轉(zhuǎn)移是相對轉(zhuǎn)移指令,即從當(dāng)前地址到目標(biāo)地址的偏移量為-128~127(從本指令則為-126~+129,因為條件轉(zhuǎn)移指令均為雙字節(jié)指令),故只能實現(xiàn)段內(nèi)轉(zhuǎn)移.根據(jù)5個標(biāo)志位來判斷,SF,ZF,PF,CF,OF共有10個狀態(tài),分別是:JS/JNSJZ/JNZJP/JNPJC/JNCJO/JNO為1/0轉(zhuǎn)移。JSrel;rel為8位補碼,在實際應(yīng)用中一般為指令標(biāo)號

判斷無符號數(shù)大小的指令(CF和ZF):JA/JNBEJAE/JNBJB/JNAEJBE/JNA判斷有符號數(shù)大小的指令(OF,SF和ZF):JG/JNLEJGE/JNLJL/JNGEJLE/JNG僅判斷一個標(biāo)志位實現(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標(biāo)志設(shè)置功能指令助記符簡單條件轉(zhuǎn)移指令無符號數(shù)條件轉(zhuǎn)移指令有4條指令助記符功能

JB/JNAE

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

JNB/JAE

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

JA/JNBE

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

JNA/JBE

不高于/低于等于轉(zhuǎn)移無符號數(shù)條件轉(zhuǎn)移指令有4條指令助記符功能

JB/JNAE

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

JNB/JAE

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

JA/JNBE

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

JNA/JBE

不高于/低于等于轉(zhuǎn)移JCXZrel;如CX中的值為0則轉(zhuǎn)移,判斷循環(huán)用下面程序段在什么情況下的執(zhí)行結(jié)果是AL=0BEGIN:INAL,5FHTESTAL,80HJZA1XORAX,AXJMPSTOPA1:MOVAL,0FFHSTOP:HLT當(dāng)5FH口的最高位為1時當(dāng)元素結(jié)果為0時,不能轉(zhuǎn)向標(biāo)號L1處的指令是:A)JAEL1B)JGEL1C)JNZL1D)JEL1設(shè)數(shù)據(jù)區(qū)1000H開始的區(qū)域中存放著50個字節(jié)的符號數(shù),要求找出其中最大的一個數(shù)并存放到0FFFH單元。MOVBX,1000HMOVAL,[BX]MOVCX,31HL1:INCBXCMPAL,[BX]JGEL2MOVAL,[BX]L2:DECCXJNEL1MOVBX,0FFFHMOV[BX],ALHLT可以用判斷指令強制跳轉(zhuǎn)循環(huán),也有專用的循環(huán)控制指令(3條)。3條指令循環(huán)范圍均在-128~127字節(jié)內(nèi);

循環(huán)前必須將循環(huán)次數(shù)賦值給CX。2.循環(huán)控制指令1)LOOP標(biāo)號CX-1CX,若CX不為0,轉(zhuǎn)移到標(biāo)號處繼續(xù)循環(huán)2)LOOPZ/LOOPE標(biāo)號CX-1CX,若CX≠0且ZF=1時繼續(xù)循環(huán)CX為0并不影響標(biāo)志位ZF,ZF是否為1是由循環(huán)指令前面的指令決定的。3)LOOPNZ/LOOPNE標(biāo)號CX-1CX,若CX≠0且ZF=0時繼續(xù)循環(huán)MOVCX,28HMOVSI,0FFFHNEXT:INCSICMPBYTEPTR[SI],0

LOOPZNEXTJNZOKKCALLDISPLAY1RETOKK:CALLDISPLAY2 RET下面的程序段用于在40個元素構(gòu)成的數(shù)組中尋址第一個非0元素,數(shù)組元素從數(shù)據(jù)段的1000H處開始存放。;元素個數(shù),循環(huán)次數(shù);首地址指針,加1開始;與0比較;ZF=1且CX≠0繼續(xù)循環(huán);退出循環(huán),若ZF≠1,說明找到;沒有找到,調(diào)用顯示信息;找到后,調(diào)用顯示信息已知AX:1,BX:8000H,CF:0,下面程序段執(zhí)行后,AX=?,BX=?NEGAXMOVCX,4LOP1:SHLAX,1RCLBX,1LOOPLOP1;AX:1111111111111111;AX:1111111111111110;BX:0000000000000001;循環(huán)4次AX:0FFF0HBX:000FH3.子程序調(diào)用和返回指令RET調(diào)用處子程序首地址子程序返回處返回指令同樣分段內(nèi)調(diào)用和段間調(diào)用,一般為直接調(diào)用主程序→調(diào)用子程序的程序

子程序調(diào)用→進入子程序的操作,子程序運行結(jié)束又回到主程序→即子程序返回

子程序→將某些重復(fù)的或經(jīng)常要使用的程序段設(shè)計成可供反復(fù)調(diào)用的獨立程序段參數(shù)→主﹑子程序互相傳遞的信息(可以是信息本身或信息的地址),分兩類:

入口參數(shù)→主程序提供給子程序以便加工處理的信息→原始數(shù)據(jù).出口參數(shù)→經(jīng)子程序加工處理后送回給主程序的信息→處理結(jié)果.傳遞方式→為了傳遞參數(shù),約定一種主子雙方都能接受的參數(shù)傳遞方式:主程序與子程序間的參數(shù)傳遞

(1)寄存器法

主程序與子程序間傳遞的參數(shù)都在約定的寄存器中—傳遞單元在CPU內(nèi)部.在調(diào)用子程序前主程序?qū)⑷肟趨?shù)送約定寄存器中,子程序直接從這些寄存器中取得參數(shù)進行計算處理,經(jīng)加工處理后得到的結(jié)果(出口參數(shù))也放在約定寄存器中,返回主程序后,主程序直接到該寄存器中取得結(jié)果.該法簡單﹑直觀,信息傳遞快,但寄存器個數(shù)有限,所以適用于參數(shù)較少的情況.入口和出口參數(shù)都放在堆棧中—傳遞單元在SS段.調(diào)用前,入口參數(shù)由主程序送入堆棧,子程序從堆棧中取得這些參數(shù)進行處理,處理后的結(jié)果又送到堆棧中.返回主程序后,主程序從堆棧取得結(jié)果.此法不占用公共寄存器,也無需另外開辟單元,但因為子程序的返回地址也在堆棧中,所以一定要小心計算參數(shù)與地址,否則出錯.

(2)堆棧法(3)參數(shù)賦值法

入口﹑出口參數(shù)存放在主程序的調(diào)用指令之后,即在CS段,書寫指令時,用偽指令定義參數(shù).—傳遞單元在CS段.此時一定要注意區(qū)分參數(shù)與代碼.參數(shù)—可以是信息本身→直接賦值法;若信息較多,可以是信息的地址→間接賦值法.有時主﹑子之間無參數(shù)傳遞,子程序只是完成一個特定動作→無參數(shù)子程序.以上參數(shù)的傳遞方法各有優(yōu)缺點,采用哪種方法,具體問題具體分析,有時,幾種方法混合使用.主程序和子程序公用寄存器的問題

子程序要進行計算處理,自然要使用一些寄存器.子程序執(zhí)行后,某些寄存器的內(nèi)容會發(fā)生變化.如果主程序在這些寄存器中已經(jīng)存放了有用信息,則子程序返回后,主程序的運行勢必因原存放信息被破壞而出錯,所以要保護寄存器中內(nèi)容不被破壞→保護現(xiàn)場;在子程序處理后,恢復(fù)寄存器的內(nèi)容→恢復(fù)現(xiàn)場.保護現(xiàn)場﹑恢復(fù)現(xiàn)場的工作可以在主程序中完成,也可以在子程序中完成:

PUSHAXPUSHBX保護現(xiàn)場

PUSHCX﹕子程序工作部分

POPCXPOPBX恢復(fù)現(xiàn)場(注:先進后出)

POPAXRET如:某子程序要用到AX﹑BX﹑CX,可用進棧﹑出棧實現(xiàn)保護與恢復(fù)現(xiàn)場.*(1)子程序中保護(一般用此法)→在子程序開始,將子程序用到的所有寄存器的內(nèi)容保護起來,在返回之前恢復(fù)這些寄存器的內(nèi)容.如:調(diào)用DEF子程序,主、子程序中均要使用AX,可用以下方法保護:

PUSHAX;保護現(xiàn)場

CALLDEFPOPAX;恢復(fù)現(xiàn)場**子程序結(jié)構(gòu):保護現(xiàn)場→取入口參數(shù)進行加工處理→存結(jié)果至指定單元(作出口準備)→恢復(fù)現(xiàn)場→返回*(2)在主程序中保護與恢復(fù)→在調(diào)用前保護某些寄存器的內(nèi)容,返回后再恢復(fù).RET調(diào)用處子程序首地址子程序返回處返回指令同樣分段內(nèi)調(diào)用和段間調(diào)用,一般為直接調(diào)用子程序調(diào)用格式:CALL子程序名段內(nèi)調(diào)用:子程序距調(diào)用語句不超過64KB,在同一個代碼段CS內(nèi),調(diào)用時,只改變IP即可。CALLRET3010H8050HSSCSSP1.將3010H入棧保護SP30H10HSP2.將IP賦值8050H3.執(zhí)行子程序4.執(zhí)行RET,堆棧內(nèi)容進入IP,SP還原5.繼續(xù)運行主程序SP段間調(diào)用:子程序距調(diào)用語句可以超過64KB,不在同一個代碼段,調(diào)用時,需要同時改變CS和IP。RET調(diào)用指令2000H:1500H3400H:2460HSS20H00HSP15H00H原CS原IP3400HCS2460HIP1500HIP2000HCS格式:CALL子程序名功能:將返回地址進棧,將程序控制轉(zhuǎn)移到子程序子程序名有類型屬性:NEAR→主﹑子在同一段內(nèi),F(xiàn)AR→主﹑子在不同段.段內(nèi)只改變IP,段間改變CS:IP,具體操作:段內(nèi)調(diào)用:IP→[SP-2],SP-2→SP,

OFFSET子程序名→IP

段間調(diào)用:CS→[SP-2],IP→[SP-4],SP-4→SPSEG子程序名→CS,OFFSE

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論