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

下載本文檔

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

文檔簡介

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

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

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

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

堆棧段偏移地址為0020H的地址中的內(nèi)容傳送到AX中去MOVES:[0100H],BX如果不加段超越,默認(rèn)為數(shù)據(jù)段的偏移地址。也可以傳送內(nèi)存中其他段的數(shù)據(jù),在相應(yīng)的偏移地址前加段超越符“(4)寄存器間接尋址操作數(shù)存放在內(nèi)存中,但其偏移地址存放寄存器中。在指令中只給出這個寄存器。MOVAX,[BX]BX中存放操作數(shù)的偏移地址其中,作為間址的寄存器只能有4個:BX,SI,DI,BP,其他寄存器無此功能。用BP尋址,段基址默認(rèn)為堆棧段SS,其余3個的段基址默認(rèn)為數(shù)據(jù)段DS,同時指令允許段超越。(4)寄存器間接尋址操作數(shù)存放在內(nèi)存中,但其偏移地址存放寄存………………12H34H56H…………碼段堆棧段數(shù)據(jù)段……0000H0001H……0020H0021H0022H…………DS:0000H偏移地址內(nèi)存內(nèi)容MOVAX,[BX]AXAHAL3412AX:3412HMOVBX,0020H………………12H34H56H…………碼段堆棧段數(shù)據(jù)段……0MOVAX,ES:[BX];傳送的操作數(shù)在附加段ES中,偏移地址存放在BX中。MOV[BP],BX;將BX中的內(nèi)容傳送到堆棧段中,其目的地的偏移地址存放在BP中。MOV[DI],2000H;將立即數(shù)2000H傳送到數(shù)據(jù)段中,其目的地的偏移地址存放在DI中。MOVAX,ES:[BX];傳送的操作數(shù)在附加段(5)寄存器相對尋址操作數(shù)存放在內(nèi)存中,但其偏移地址需要計(jì)算。偏移地址=寄存器內(nèi)容+指令中給定的偏移量MOVAX,[SI+0200H];欲傳送的操作數(shù)在數(shù)據(jù)段中,其偏移地址是SI寄存器中的內(nèi)容加上0200H同樣,作為變址的寄存器只能有4個:BX,SI,DI,BP,其他寄存器無此功能。(5)寄存器相對尋址操作數(shù)存放在內(nèi)存中,但其偏移地址需要計(jì)算用BP尋址,段基址默認(rèn)為堆棧段SS,其余3個的段基址默認(rèn)為數(shù)據(jù)段DS,同時指令允許段超越。MOVAX,0200H[BX]變址尋址可以有多種格式:MOVAX,[BX+0200H]MOVAX,0200H+[BX]例如:DS:3000H,BX:1000H數(shù)據(jù)所在的地址:高位:31201H低位:31200H用BP尋址,段基址默認(rèn)為堆棧段SS,其余3個的段基址默認(rèn)為數(shù)(6)基址加變址尋址操作數(shù)存放在內(nèi)存中,但其偏移地址由兩部分相加而成:基址寄存器內(nèi)容+變址寄存器內(nèi)容MOVAX,[BX+SI];欲傳送的操作數(shù)在數(shù)據(jù)段中,其偏移地址是BX寄存器中的內(nèi)容加上SI寄存器中的內(nèi)容基址寄存器只有2個:BX,默認(rèn)的段基址為DS;BP,默認(rèn)的段基址為SS。(6)基址加變址尋址操作數(shù)存放在內(nèi)存中,但其偏移地址由兩部分變址寄存器只有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ù)在堆棧段變址寄存器只有2個:SI和DI。允許段超越。MOVAX,(7)相對基址加變址尋址操作數(shù)存放在內(nèi)存中,但其偏移地址是由三部分相加而成:基址寄存器內(nèi)容+變址寄存器內(nèi)容+偏移量MOVAX,[BX+SI+0200H];欲傳送的操作數(shù)在數(shù)據(jù)段中,其偏移地址是BX寄存器中的內(nèi)容加上SI寄存器中的內(nèi)容加上0200H基址寄存器只有2個:BX,默認(rèn)的段基址為DS;BP,默認(rèn)的段基址為SS。(7)相對基址加變址尋址操作數(shù)存放在內(nèi)存中,但其偏移地址是由變址寄存器只有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ù)在堆棧段變址寄存器只有2個:SI和DI。允許段超越。MOVAX,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:F0DEH12H34H56H78H9AHBCHDEHF0H21000H3.38086/8088指令系統(tǒng)數(shù)據(jù)傳送指令算術(shù)運(yùn)算指令邏輯指令串操作指令程序控制指令處理機(jī)控制指令3.38086/8088指令系統(tǒng)數(shù)據(jù)傳送指令微機(jī)原理及單片機(jī)應(yīng)用技術(shù)第3章--匯編語言與匯編程序設(shè)計(jì)基礎(chǔ)課件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,src3.3.1數(shù)據(jù)傳送指令1.通用數(shù)據(jù)傳送指令所有的MOVMOVBL,AXMOV100,CXMOV[SI],AXMOVCS,AXMOV[SI],[DI]MOVBX,2[DI]MOVAX,CSMOVSS,2400HMOVAX,[BP+4]錯誤,不匹配錯誤,立即數(shù)不能賦值正確錯誤,CS不能賦值錯誤,內(nèi)存間不能直接傳送正確正確錯誤,段寄存器不能賦立即數(shù)正確MOVBL,AX錯誤,不匹配堆棧操作指令:堆棧是按先進(jìn)后出的原則組織的一段內(nèi)存區(qū)域,一般作臨時存儲器用(倉庫)。其指針SP為16位的寄存器,始終指向棧頂(貨物堆放的位置)。堆棧的空間大小是用戶指定的。SS:2000H;堆棧段的段基址;表示堆棧從20000H處開始20000H假設(shè)用戶定義堆棧為100個字節(jié),則SP自動設(shè)置為0064H20064H100個字節(jié)SP:0064H進(jìn)棧:PUSHsrc出棧:POPdest堆棧操作指令:堆棧是按先進(jìn)后出的原則組織的一段內(nèi)存區(qū)域,一般MOVAX,1234HPUSHAX20000H20064H100個字節(jié)SP(1)SP-1SPAH[SP]SP12H(2)SP-1SPAL[SP]SP34H先減指針,再壓數(shù)據(jù),先高后低POPBX(1)[SP]BLSP+1SP(2)[SP]BHSP+1SP先出數(shù)據(jù),再加指針,先低后高BLBHSPSPMOVAX,1234H20000H20064H100個只能對16位數(shù)進(jìn)行操作,一次壓入彈出兩個字節(jié)PUSHAH必須對寄存器的內(nèi)容或內(nèi)存單元的內(nèi)容進(jìn)行操作PUSH2000H設(shè)SP為0100H,SS為2000H,PUSHBP后,棧頂?shù)奈锢淼刂肥牵?0100H-2H=200FEH下列指令中,錯誤的是:PUSHDS B)POPCSC)PUSH30H[BX][SI] D)MOVSI,ES:[BP]B)POPCS只能對16位數(shù)進(jìn)行操作,一次壓入彈出兩個字節(jié)PUSHAHMOVAX,1000HPUSHAXMOVBX,AXPUSH[BX]PUSH[1000H]POP[1002H]POPAXPOPBX12H34H56H78H9AHBCHDEHF0H21000H21001H21002H21003H21004H21005H21006H21007H30000H30001H………………30060H30061H30062H30063H30064HDS:2000HSS:3000HSP:0064HSP:0064H100個字節(jié)10H00HBX:1000H34H12H34H12H34H12HAX:3412HBX:1000HMOVAX,1000H12H34H56H78H9AHB交換指令XCHGdest,srcdestsrc在寄存器之間,寄存器和內(nèi)存之間的8位,16位數(shù)據(jù)可以相互交換。XCHGAL,AHXCHGAX,[BX]內(nèi)存之間的數(shù)據(jù)不可相互交換

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

累加器專用指令(只與AX或AL有關(guān),與AH無關(guān))輸入輸出指令CPU存儲器輸入輸出INOUTAX或AL只能用IN、OUT指令向外設(shè)發(fā)命令;外設(shè)只能與CPU內(nèi)部寄存器AL或AX進(jìn)行數(shù)據(jù)傳輸。累加器專用指令(只與AX或AL有關(guān),與AH無關(guān))輸入輸出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,ALINAL,40HOUT40H,ALIN,OUT只能對AL,AX操作,若傳送的數(shù)據(jù)為16位,則外口地址只能取偶數(shù)。INAX,35HIN,OUT只能對AL,AX操作,若傳送的數(shù)據(jù)為16表格查找指令(換碼指令)

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

的值2.地址傳送指令取有效地址指令LEA:取存儲器單元的偏取內(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ù)LDS將指定內(nèi)存中的4個字節(jié)(32位)分別取內(nèi)存中的數(shù)LES將指定內(nèi)存中的4個字節(jié)(32位)分別裝入指定的寄存器和段寄存器ES中。例:DS:1000HDI:0400H[10420H]=FFH[10421H]=00HLEAAX,20[DI];AX:0420HLEAAX,[DI];AX:0400H取內(nèi)存中的數(shù)LES將指定內(nèi)存中的4個字節(jié)(32位)分別12H34H56H78H9AHBCHDEHF0H00H10H23000H23001H23002H23003H23004H23005H23006H23007H23008H23009H例:DS:2000HMOVBX,3004HMOVAL,02HXLATLEABX,[3000H]LESSI,[BX+04H]LDSDI,[BX+02H]AL:DEHBX:3000HSI:BC9AHES:F0DEHDI:7856HDS:BC9AH12H34H56H78H9AHBCHDEHF0H00H10H3.標(biāo)志傳送指令讀取標(biāo)志:LAHF(LoadAHwithFlags):將標(biāo)志寄存器FR中的低8位AH中OFDFIFTFSFZFAFPFCF1514131211109876543210D7D6D4D2D0AH設(shè)置標(biāo)志:SAHF(SetFlagswithAH)上述指令的反向傳輸只提供8位標(biāo)志位指令,保持對8位機(jī)指令的兼容性3.標(biāo)志傳送指令讀取標(biāo)志:LAHF(LoadAHw標(biāo)志寄存器入棧命令:PUSHF將棧內(nèi)內(nèi)容進(jìn)入標(biāo)志寄存器:POPF:只有這個命令可以改變TF的內(nèi)容。標(biāo)志寄存器入棧命令:PUSHF3.3.2算術(shù)運(yùn)算指令概念:算術(shù)運(yùn)算涉及兩種類型的數(shù)據(jù):有符號型和無符號型,對加減法這兩種類型采用同一套指令,對乘除法不能采用同一套指令。有符號數(shù)在計(jì)算機(jī)中以補(bǔ)碼的形式存儲。加減法:兩個加數(shù)或減數(shù)同為一種數(shù)據(jù)類型;兩種類型用不同的標(biāo)準(zhǔn)比較大小。有符號數(shù)加減運(yùn)算要考慮溢出。3.3.2算術(shù)運(yùn)算指令概念:算術(shù)運(yùn)算涉及兩種類型的數(shù)據(jù):有微機(jī)原理及單片機(jī)應(yīng)用技術(shù)第3章--匯編語言與匯編程序設(shè)計(jì)基礎(chǔ)課件當(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ù)相加但結(jié)果變號時,產(chǎn)生溢出標(biāo)志。例如:8+124當(dāng)無符號數(shù)運(yùn)算時,若CF=1,則超界。當(dāng)有符號數(shù)運(yùn)算時,若OF=1,則溢出,結(jié)果錯誤若運(yùn)算結(jié)果為0,則ZF=1若運(yùn)算結(jié)果為負(fù)數(shù),則SF=1,即SF與最高位一致若運(yùn)算結(jié)果中低8位有偶數(shù)個1,則PF=1若運(yùn)算過程中低8位的位3向位4有進(jìn)位,則AF=1當(dāng)無符號數(shù)運(yùn)算時,若CF=1,則超界。1.加減法指令一覽表1.加減法指令一覽表加法指令1)不帶進(jìn)位的加法ADDdest,srcdest+srcdest結(jié)果影響標(biāo)志位兩個操作數(shù)不可同為內(nèi)存單元ADD[BX+DI],[2000H]ADD[BX+DI],2000HADDDX,50H[BX+SI]加法指令A(yù)DDdest,srcdest+src設(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=1設(shè)AX=C544H,執(zhí)行ADDAH,AL后,2)帶進(jìn)位的加法ADCdest,srcdest+src+CFdest結(jié)果影響標(biāo)志位兩個操作數(shù)不可同為內(nèi)存單元ADC[BX+DI],[2000H]ADC[BX+DI],2000HADCDX,50H[BX+SI]該指令主要用于多字節(jié)數(shù)相加2)帶進(jìn)位的加法ADCdest,srcdest例:兩個四字節(jié)無符號數(shù)相加,這兩個數(shù)分別放在以2000H和3000H開始的存儲單元內(nèi),要求運(yùn)算后得到的結(jié)果放在2000H開始的單元內(nèi)。40H79H24H30H2000H2001H2002H2003H40HB9HA4H30H3000H3001H3002H3003HCLCMOVSI,2000HMOVAX,[SI]SIADDAX,[3000H]MOV[SI],AXMOVAX,[SI+2]ADCAX,[3002H]MOV[SI+2],AX例:兩個四字節(jié)無符號數(shù)相加,這兩個數(shù)分別放在以2000H和33)增量指令I(lǐng)NCdestdest+1dest不影響CF,影響AF,OF,PF,SF和ZFINCALINC[BX]MOVAL,0FFHCF=0,ZF=13)增量指令I(lǐng)NCdestdest+1dest減法指令1)不帶借位的減法SUBdest,srcdest-srcdest結(jié)果影響標(biāo)志位兩個操作數(shù)不可同為內(nèi)存單元SUB[BX+DI],[2000H]SUB[BX+DI],2000HSUBDX,50H[BX+SI]減法指令SUBdest,srcdest-srcMOVAX,5049HSUBAX,0E2D7H5049E2D76D72結(jié)果:CF=1,OF=0,ZF=0,SF=0,PF=1,AF=0MOVAX,5049H50496D2)帶借位的減法SBBdest,srcdest-src-CFdest結(jié)果影響標(biāo)志位兩個操作數(shù)不可同為內(nèi)存單元SBB[BX+DI],[2000H]SBB[BX+DI],2000HSBBDX,50H[BX+SI]該指令主要用于多字節(jié)數(shù)相加2)帶借位的減法SBBdest,srcdest-3)減量指令DECdestdest-1dest不影響CF,影響AF,OF,PF,SF和ZFDECALDEC[BX]MOVAL,00HCF=0,ZF=03)減量指令DECdestdest-1dest不4)求補(bǔ)指令NEGdest;對操作數(shù)取補(bǔ)碼后送回0–destdestNEGALNEGCX指令影響標(biāo)志位AF,CF,OF,PF,SF和ZF,此指令執(zhí)行時,只有當(dāng)操作數(shù)為0時,CF為0,否則CF總為1。若操作數(shù)為80H或8000H,執(zhí)行求補(bǔ)指令后,結(jié)果沒有變化,但OF置1。4)求補(bǔ)指令NEGdest;對操作數(shù)取補(bǔ)碼后送回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。5)比較指令CMPdest,src;desCMPAX,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ù)類型選擇不同的指令即可。CMPAX,BX若結(jié)果ZF=1,可以判斷AX與BX將字節(jié)擴(kuò)展成字的指令:CBW將AL中的符號位擴(kuò)展到AH中。當(dāng)AL<80H,執(zhí)行CBW后,AH=0;當(dāng)AL>=80H時,AH=0FFH。當(dāng)遇到兩個字節(jié)相除時,要預(yù)先執(zhí)行CBW指令,擴(kuò)展被除數(shù),否則不能正確執(zhí)行除法操作。將AX中的符號位擴(kuò)展到DX中。當(dāng)AX<8000H,執(zhí)行CWD后,DX=0;當(dāng)AX>=8000H時,DX=0FFFFH。將字?jǐn)U展成雙字的指令:CWD2.擴(kuò)展指令將字節(jié)擴(kuò)展成字的指令:CBW將AL中的符號位擴(kuò)展到AH中。當(dāng)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ù)3.乘法指令約定:8位數(shù)×8位數(shù)16位數(shù)16位數(shù)×無符號數(shù)乘法指令MULsrc;不出現(xiàn)AL或AXMULBL;AL×BLAXMULCX;AX×CXDX(高位),AX(低位)MULBYTEPTR[DI];AL×[DI]AXMULWORDPTR[SI];AX×[SI+1][SI]DX(高位),AX(低位)無符號數(shù)乘法指令MULsrc;不出現(xiàn)AL或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ù)2)有符號數(shù)乘法指令I(lǐng)MULsrc;不出現(xiàn)乘法運(yùn)算時,結(jié)果影響CF和OF,AF,PF,SF,ZF標(biāo)志位無意義。對MUL指令:當(dāng)乘積的高半部分不為0,CF=1,OF=1;否則,CF=0,OF=0。對IMUL指令:當(dāng)乘積的高半部分是低半部分最高位的擴(kuò)展,乘積的高半部分每位與低半部分最高位相同時:CF=0,OF=0;否則,CF=1,OF=1。CF=1,OF=1表示高半部分包含有結(jié)果的有效數(shù)乘法運(yùn)算時,結(jié)果影響CF和OF,AF,PF,SF,ZF例:MOVAL,0FBHMOVBH,02HIMULBH結(jié)果:AX=0FFF6H,即-10,CF=0,OF=0MOVAL,0FBHMOVBH,02HMULBH結(jié)果:AX=01F6H,即502,CF=1,OF=1例:MOVAL,0FBH結(jié)果:AX=0FFF6H,即4.除法指令約定:除數(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ù)4.除法指令約定:除數(shù)必須為被除數(shù)的一半字長16位數(shù)÷8位無符號數(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ù))無符號數(shù)除法指令DIVsrc;不出現(xiàn)AX或2)有符號數(shù)除法指令I(lǐng)DIVsrc;不出現(xiàn)AX或DXAX功能上與DIV相似,要求被除數(shù),除數(shù)必須為有符號數(shù)。IDIVBL;AX÷BLAL(商),AH(余數(shù))2)有符號數(shù)除法指令I(lǐng)DIVsrc;不出現(xiàn)注意:除法運(yùn)算所有的標(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ù)進(jìn)行擴(kuò)展。5)無符號數(shù)被除數(shù)擴(kuò)展:將AH或DX清0。6)有符號數(shù)被除數(shù)擴(kuò)展:對AH或DX符號擴(kuò)展。注意:5)無符號數(shù)被除數(shù)擴(kuò)展:將AH或DX清0。6)5.BCD碼運(yùn)算指令壓縮BCD碼:一個字節(jié)中有兩位BCD碼01000101非壓縮的BCD碼:一個字節(jié)只用低4位表示一位BCD碼,高4位為0。0000010000000101BCD碼:用二進(jìn)制形式表示的十進(jìn)制碼。每一位十進(jìn)制數(shù)用4位二進(jìn)制表示,運(yùn)算規(guī)則是逢十進(jìn)一。十進(jìn)制BCD碼00000100012001030011401005010160110701118100091001BCD碼運(yùn)算時,先用一般的二進(jìn)制運(yùn)算,然后再進(jìn)行BCD碼調(diào)整。5.BCD碼運(yùn)算指令壓縮BCD碼:一個字節(jié)中有兩位BCDBCD碼加法十進(jìn)制調(diào)整指令1)非壓縮BCD碼運(yùn)算調(diào)整指令A(yù)AA兩個非壓縮BCD碼相加,結(jié)果在AL中,執(zhí)行該指令后將結(jié)果調(diào)整為十進(jìn)制,放在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位清零。BCD碼加法十進(jìn)制調(diào)整指令1)非壓縮BCD碼運(yùn)算調(diào)整指令A(yù)7+5=12用組合的BCD碼表示運(yùn)算過程:000001110000010100001100BCD碼逢十進(jìn)一,16進(jìn)制逢16進(jìn)1,因?yàn)榈?位大于9,所以在個位上加6,使其產(chǎn)生進(jìn)位,同時AF=1,CF=1。0000110000000110

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

0001100016進(jìn)制加法AAA指令調(diào)整為10進(jìn)制結(jié)果9+9=18用組合的BCD碼表示運(yùn)算過程:000012)壓縮BCD碼運(yùn)算調(diào)整指令DAA兩個壓縮BCD碼相加,結(jié)果在AL中,執(zhí)行該指令后將結(jié)果調(diào)整為十進(jìn)制,放在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。2)壓縮BCD碼運(yùn)算調(diào)整指令DAA兩個壓縮BCD碼相加,結(jié)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,1234H;AL:ACH;ALMOVAX,‘8’ADDAL,‘9’AAA;AX:0038H;AX:0071HAF=1;AX:0107HAF=1因?yàn)锳F=1,所以AH=1,CF=1,AF=1,AL高4位清零。MOVAX,‘8’;AX:0038H;AXBCD碼減法調(diào)整指令與加法調(diào)整指令類似,只是分別將加06H,60H,66H改為減06H,60H,66H。AAS:對非壓縮BCD碼減法調(diào)整DAS:對壓縮BCD碼減法調(diào)整必須緊跟在相對應(yīng)的加減法指令后進(jìn)行調(diào)整。BCD碼減法調(diào)整指令與加法調(diào)整指令類似,只是分別將加06H,BCD碼乘法十進(jìn)制調(diào)整指令A(yù)AM1)BCD碼均為無符號數(shù),故只有用MUL乘法指令才能調(diào)整(將AL中小于64H的二進(jìn)制數(shù)變換為非壓縮BCD數(shù)送AX);2)BCD碼乘法調(diào)整指令只能對非壓縮BCD碼相乘結(jié)果進(jìn)行調(diào)整;MOVAL,05HMOVBH,06HMULBHAAM;AX:001EH;AX:0300HBCD碼乘法十進(jìn)制調(diào)整指令A(yù)AM1)BCD碼均為無符1)BCD碼均為無符號數(shù),故只有用DIV除法指令才能調(diào)整,并且在兩個數(shù)相除前進(jìn)行調(diào)整;2)BCD碼除法調(diào)整指令只能對非壓縮BCD碼相乘結(jié)果進(jìn)行調(diào)整;MOVAX,0300HMOVBL,05HAADDIVBL;AX:001EH;AX:0300HBCD碼除法十進(jìn)制調(diào)整指令A(yù)AD1)BCD碼均為無符號數(shù),故只有用DIV除法指令才能調(diào)整1.邏輯運(yùn)算指令1)NOT按位取反NOTdestAX:73HDX:85HMOVAX,DXNOTAXADDAX,DXINCAX0000000010000101111111110111101011111111111111110000000000000000對標(biāo)志位沒有影響3.3.3邏輯運(yùn)算和移位指令1.邏輯運(yùn)算指令1)NOT按位取反NOT2)AND與,

OR或,

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

2.非循環(huán)移位指令SAL(ShiftArithmeticLeft):算術(shù)左移SHL(ShiftLogicLeft):邏輯左移0CF左移一位進(jìn)CF,右邊補(bǔ)0,相當(dāng)于乘2。影響標(biāo)志若移位后最高位與CF不同,則OF=1,表示移位前后數(shù)據(jù)變號。若移位位數(shù)大于1,所移的位數(shù)用CL存放。2.非循環(huán)移位指令SAL(ShiftArithmeticMOVAL,02HSALAL,1;AL:00000010;AL:00000100MOVAL,02HSALAL,4MOVAL,02HMOVCL,4SALAL,CL;AL:00000010;AL:00100000MOVAL,02H;AL:00000010SAR(ShiftArithmeticRight):算術(shù)右移CF最低位進(jìn)CF,左邊重復(fù)最高位,即操作數(shù)符號不變。一般用于有符號數(shù)的右移,符號擴(kuò)展。若移位位數(shù)大于1,所移的位數(shù)用CL存放。MOVAL,-4SARAL,1;AL:11111100;AL:11111110-2SAR(ShiftArithmeticRight):算SHR(ShiftLogicRight):邏輯右移CF最低位進(jìn)CF,左邊補(bǔ)0。一般用于無符號數(shù)的右移。若移位位數(shù)大于1,所移的位數(shù)用CL存放。MOVAL,8SHRAL,1;AL:00001000;AL:0000010040SHR(ShiftLogicRight):邏輯右移CFMOVSI,-1MOVCL,4SALSI,CLANDSI,7FFFHORSI,8000HNOTSI;SI:1111111111111111;SI:111111111111000011111111111100000111111111111111;SI:0111111111110000;SI:1111111111110000;SI:0000000000001111MOVSI,-1;SI:1111111111試分析下面程序完成什么任務(wù)MOVCL,4SHLDX,CLMOVBL,AHSHLAX,CLSHRBL,CLORDL,BLAX0BL0DX0DXAX0試分析下面程序完成什么任務(wù)MOVCL,4AX0BL03.循環(huán)移位指令ROL(RotateLeft):不帶進(jìn)位循環(huán)左移CF若移位后最高位與CF不同,則OF=1,表示移位前后數(shù)據(jù)變號。若移位位數(shù)大于1,所移的位數(shù)用CL存放。3.循環(huán)移位指令ROL(RotateLeft):不帶進(jìn)ROR(RotateRight):不帶進(jìn)位循環(huán)右移CF若移位位數(shù)大于1,所移的位數(shù)用CL存放。ROR(RotateRight):不帶進(jìn)位循環(huán)右移CF若RCL(RotatethroughCFLeft):帶進(jìn)位循環(huán)左移CFRCL(RotatethroughCFLeft):帶RCR(RotatethroughCFRight):帶進(jìn)位循環(huán)右移CF可實(shí)現(xiàn)多字節(jié)的移位,將DX,AX左移1位SALAX,1RCLDX,1CFAX0CFDXCFRCR(RotatethroughCFRight):假定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:1假定DX:10111001B,CL:3,C3.3.4串操作指令用一條指令實(shí)現(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,地址自動由高至低,減量進(jìn)行串運(yùn)算;DF=0,地址自動由低至高,增量進(jìn)行串運(yùn)算。1.串操作指令3.3.4串操作指令用一條指令實(shí)現(xiàn)對一串?dāng)?shù)據(jù)或字符的操作串傳送指令MOVSB:每次傳送一個字節(jié);MOVSW:每次傳送一個字;將位于DS段,由SI所指出的存儲單元的字節(jié)或字傳送到位于ES段,由DI所指的存儲單元中,再根據(jù)DF修改SI和DI,從而指向下一個元素,繼續(xù)傳送,直到CX為0為止。DS:SIES:DIDS:SIES:DIDS:SIES:DI串傳送指令MOVSB:每次傳送一個字節(jié);將位于DS段MOVSI,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,1000H假設(shè)MOVSI,1000HMOVDI,2000HMOVCX,100CLDREPMOVSB通常,在串傳送指令前加段前綴REP,程序可自動計(jì)數(shù)并判別是否傳送完畢。REPMOVSB相當(dāng)于

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

無條件重復(fù)前綴串操作指令前綴CX不影響ZF1)REP:無條件重復(fù)前綴2)REPE/REPZ:

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

比較結(jié)果不相等時重復(fù)前綴3)REPNZ/REPNE:比較結(jié)果不相等時重復(fù)前綴3. 加前綴的串操作指令重復(fù)串傳送REPMOVSBREPMOVSW重復(fù)串送存REPSTOSBREPSTOSW重復(fù)串裝入REPLODSBREPLODSW3. 加前綴的串操作指令重復(fù)串傳送判斷一個微型機(jī)系統(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)判斷一個微型機(jī)系統(tǒng)是否為初次加電,如果不是初次加電可以檢測到MOVSB/STOSB/LODSB指令完成后指針(SI,DI)自動增加或減少(DF);加上段前綴后CX自動減1,并判斷CX是否為0。若為0,終止循環(huán)。REPREPNZ/REPNEREPZ/REPECMPSBCMPSWMOVSW/STOSW/LODSWMOVSB/STOSB/LODSB指令完成后指針(SI,D取字符串指令LODSB/LODSW(LoadString)將位于DS段SI所指的存儲單元的內(nèi)容取到AL或AX中。用LODSB時,每次取一個字節(jié),取完后,地址自動加1或減1;用LODSW時,每次取一個字,取完后,地址自動加2或減2。該指令一般不用段前綴,否則,AL或AX中的內(nèi)容會被后一次操作覆蓋,最后只能得到內(nèi)存中字符串的最后一個字節(jié)或字。取字符串指令LODSB/LODSW(LoadStrALLODSBDS:SIDS:SIDS:SIDS:SIALLODSBDS: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存字符串指令STOSB/STOSW(StoreSt將從0700H單元開始的5個字節(jié)的內(nèi)容逐一取來,放在累加器中進(jìn)行處理,處理完后再送到0700H的內(nèi)存區(qū)域。CLD MOVSI,0700H MOVDI,0700H MOVCX,5L1:

LODSB PUSHCX …… POPCX

STOSB DECCX JNZL1處理字符指令不用考慮指針DI,SI的變化將從0700H單元開始的5個字節(jié)的內(nèi)容逐一取來,放在累加器中字符串檢索指令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ù)。字符串檢索指令SCASB/SCASW(ScanSt有一字符串放在以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)志計(jì)算字符串長度有一字符串放在以2000H單元為始地址的內(nèi)存中,從中搜索串結(jié)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)志位3.3.5控制轉(zhuǎn)移類指令1.轉(zhuǎn)移指令64KB內(nèi)段內(nèi)轉(zhuǎn)移可以超過64KB段間轉(zhuǎn)移,目標(biāo)指令與轉(zhuǎn)移指令分別在不同的代碼段,轉(zhuǎn)移時需要改變CS和IP的值CS:IP新CS:IP可以超過64KB段間轉(zhuǎn)移,目標(biāo)指令與轉(zhuǎn)移指令分別在不同的代碼格式:JMPtarget操作:將控制轉(zhuǎn)向目的標(biāo)號target:(1)target在段內(nèi):target的偏移地址→IP(2)target在段外:target的偏移地址→IPtarget的段首址→CS<1>.無條件直接轉(zhuǎn)移指令格式:JMPtarget<1>.無條件直接轉(zhuǎn)移指令段內(nèi)直接轉(zhuǎn)移:轉(zhuǎn)移指令后直接給出目的指令處的地址。CS不變JMP立即數(shù)JMP2000H;立即數(shù)為16位或8位,是目的地的IP;IP=2000H段內(nèi)直接轉(zhuǎn)移:JMP立即數(shù)JMP2000H;立即數(shù)為段間直接轉(zhuǎn)移:轉(zhuǎn)移指令后直接給出目的指令處的地址CS:IP。JMP立即數(shù)JMP2000H:1236H;立即數(shù)為CS:IP的形式;CS=2000HIP=1236HJMP語句標(biāo)號(子程序名)語句標(biāo)號自動產(chǎn)生段間調(diào)用。段間直接轉(zhuǎn)移:JMP立即數(shù)JMP2000H:1236

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

操作:

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

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

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

<2>.無條件間接轉(zhuǎn)移指令格式:JMPdest段內(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段內(nèi)間接轉(zhuǎn)移:JMPdest;dest為寄存器或內(nèi)存單段間間接轉(zhuǎn)移:目的地指令處的地址存放在內(nèi)存單元中,一般用寄存器間接尋址。JMPDWORDPTR[SI];DS:[SI+3][SI+2]CSDS:[SI+1][SI]IPDS:SICSIP段間間接轉(zhuǎn)移:JMPDWORDPTR[SI];DS設(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設(shè)DS:2000H,BX:1256H,SI:528<3>條件轉(zhuǎn)移指令:根據(jù)標(biāo)志位來判斷程序是否轉(zhuǎn)移。只能轉(zhuǎn)移到距當(dāng)前指令-128~127字節(jié)的范圍內(nèi),即一個字節(jié)的補(bǔ)碼范圍;比較兩數(shù)大小的指令,分有符號數(shù)和無符號數(shù)兩套指令。127128<3>條件轉(zhuǎn)移指令:只能轉(zhuǎn)移到距當(dāng)前指令-128~12通用格式:Jcondshort_lable操作:若滿足條件,則OFFSETshort_lable→IP,實(shí)現(xiàn)轉(zhuǎn)移;否則順序執(zhí)行.short_lable→短標(biāo)號,條件轉(zhuǎn)移是相對轉(zhuǎn)移指令,即從當(dāng)前地址到目標(biāo)地址的偏移量為-128~127(從本指令則為-126~+129,因?yàn)闂l件轉(zhuǎn)移指令均為雙字節(jié)指令),故只能實(shí)現(xiàn)段內(nèi)轉(zhuǎn)移.通用格式:Jcondshort_lable根據(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位補(bǔ)碼,在實(shí)際應(yīng)用中一般為指令標(biāo)號

判斷無符號數(shù)大小的指令(CF和ZF):JA/JNBEJAE/JNBJB/JNAEJBE/JNA判斷有符號數(shù)大小的指令(OF,SF和ZF):JG/JNLEJGE/JNLJL/JNGEJLE/JNG根據(jù)5個標(biāo)志位來判斷,SF,ZF,PF,CF,OF僅判斷一個標(biāo)志位實(shí)現(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為負(fù)轉(zhuǎn)移JSCF=0無進(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è)置功能指令助記符簡單條件轉(zhuǎn)移指令僅判斷一個標(biāo)志位實(shí)現(xiàn)轉(zhuǎn)移.PF=0奇轉(zhuǎn)移JNP/JPOPF=無符號數(shù)條件轉(zhuǎn)移指令有4條指令助記符功能

JB/JNAE

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

JNB/JAE

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

JA/JNBE

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

JNA/JBE

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

JB/JNAE

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

JNB/JAE

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

JA/JNBE

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

JNA/JBE

不高于/低于等于轉(zhuǎn)移無符號數(shù)條件轉(zhuǎn)移指令有4條JCXZrel;如CX中的值為0則轉(zhuǎn)移,判斷循環(huán)用下面程序段在什么情況下的執(zhí)行結(jié)果是AL=0BEGIN:INAL,5FHTESTAL,80HJZA1XORAX,AXJMPSTOPA1:MOVAL,0FFHSTOP:

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論