微機原理及單片機應用技術第3章-匯編語言與匯編程序設計基礎課件_第1頁
微機原理及單片機應用技術第3章-匯編語言與匯編程序設計基礎課件_第2頁
微機原理及單片機應用技術第3章-匯編語言與匯編程序設計基礎課件_第3頁
微機原理及單片機應用技術第3章-匯編語言與匯編程序設計基礎課件_第4頁
微機原理及單片機應用技術第3章-匯編語言與匯編程序設計基礎課件_第5頁
已閱讀5頁,還剩447頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

標號:操作碼,操作數

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

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

堆棧段偏移地址為0020H的地址中的內容傳送到AX中去MOVES:[0100H],BX如果不加段超越,默認為數據段的偏移地址。也可以傳送內存中其他段的數據,在相應的偏移地址前加段超越符“(4)寄存器間接尋址操作數存放在內存中,但其偏移地址存放寄存器中。在指令中只給出這個寄存器。MOVAX,[BX]BX中存放操作數的偏移地址其中,作為間址的寄存器只能有4個:BX,SI,DI,BP,其他寄存器無此功能。用BP尋址,段基址默認為堆棧段SS,其余3個的段基址默認為數據段DS,同時指令允許段超越。(4)寄存器間接尋址操作數存放在內存中,但其偏移地址存放寄存………………12H34H56H…………碼段堆棧段數據段……0000H0001H……0020H0021H0022H…………DS:0000H偏移地址內存內容MOVAX,[BX]AXAHAL3412AX:3412HMOVBX,0020H………………12H34H56H…………碼段堆棧段數據段……0MOVAX,ES:[BX];傳送的操作數在附加段ES中,偏移地址存放在BX中。MOV[BP],BX;將BX中的內容傳送到堆棧段中,其目的地的偏移地址存放在BP中。MOV[DI],2000H;將立即數2000H傳送到數據段中,其目的地的偏移地址存放在DI中。MOVAX,ES:[BX];傳送的操作數在附加段(5)寄存器相對尋址操作數存放在內存中,但其偏移地址需要計算。偏移地址=寄存器內容+指令中給定的偏移量MOVAX,[SI+0200H];欲傳送的操作數在數據段中,其偏移地址是SI寄存器中的內容加上0200H同樣,作為變址的寄存器只能有4個:BX,SI,DI,BP,其他寄存器無此功能。(5)寄存器相對尋址操作數存放在內存中,但其偏移地址需要計算用BP尋址,段基址默認為堆棧段SS,其余3個的段基址默認為數據段DS,同時指令允許段超越。MOVAX,0200H[BX]變址尋址可以有多種格式:MOVAX,[BX+0200H]MOVAX,0200H+[BX]例如:DS:3000H,BX:1000H數據所在的地址:高位:31201H低位:31200H用BP尋址,段基址默認為堆棧段SS,其余3個的段基址默認為數(6)基址加變址尋址操作數存放在內存中,但其偏移地址由兩部分相加而成:基址寄存器內容+變址寄存器內容MOVAX,[BX+SI];欲傳送的操作數在數據段中,其偏移地址是BX寄存器中的內容加上SI寄存器中的內容基址寄存器只有2個:BX,默認的段基址為DS;BP,默認的段基址為SS。(6)基址加變址尋址操作數存放在內存中,但其偏移地址由兩部分變址寄存器只有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];欲取的數據在堆棧段變址寄存器只有2個:SI和DI。允許段超越。MOVAX,(7)相對基址加變址尋址操作數存放在內存中,但其偏移地址是由三部分相加而成:基址寄存器內容+變址寄存器內容+偏移量MOVAX,[BX+SI+0200H];欲傳送的操作數在數據段中,其偏移地址是BX寄存器中的內容加上SI寄存器中的內容加上0200H基址寄存器只有2個:BX,默認的段基址為DS;BP,默認的段基址為SS。(7)相對基址加變址尋址操作數存放在內存中,但其偏移地址是由變址寄存器只有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];欲取的數據在堆棧段變址寄存器只有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指令系統數據傳送指令算術運算指令邏輯指令串操作指令程序控制指令處理機控制指令3.38086/8088指令系統數據傳送指令微機原理及單片機應用技術第3章--匯編語言與匯編程序設計基礎課件3.3.1數據傳送指令

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

MOVDS,2000H內存單元間不能直接傳送MOV[SI],[2000H]立即數不能作為目的操作數MOV1000H,AXMOVdest,src3.3.1數據傳送指令1.通用數據傳送指令所有的MOVMOVBL,AXMOV100,CXMOV[SI],AXMOVCS,AXMOV[SI],[DI]MOVBX,2[DI]MOVAX,CSMOVSS,2400HMOVAX,[BP+4]錯誤,不匹配錯誤,立即數不能賦值正確錯誤,CS不能賦值錯誤,內存間不能直接傳送正確正確錯誤,段寄存器不能賦立即數正確MOVBL,AX錯誤,不匹配堆棧操作指令:堆棧是按先進后出的原則組織的一段內存區域,一般作臨時存儲器用(倉庫)。其指針SP為16位的寄存器,始終指向棧頂(貨物堆放的位置)。堆棧的空間大小是用戶指定的。SS:2000H;堆棧段的段基址;表示堆棧從20000H處開始20000H假設用戶定義堆棧為100個字節,則SP自動設置為0064H20064H100個字節SP:0064H進棧:PUSHsrc出棧:POPdest堆棧操作指令:堆棧是按先進后出的原則組織的一段內存區域,一般MOVAX,1234HPUSHAX20000H20064H100個字節SP(1)SP-1SPAH[SP]SP12H(2)SP-1SPAL[SP]SP34H先減指針,再壓數據,先高后低POPBX(1)[SP]BLSP+1SP(2)[SP]BHSP+1SP先出數據,再加指針,先低后高BLBHSPSPMOVAX,1234H20000H20064H100個只能對16位數進行操作,一次壓入彈出兩個字節PUSHAH必須對寄存器的內容或內存單元的內容進行操作PUSH2000H設SP為0100H,SS為2000H,PUSHBP后,棧頂的物理地址是:20100H-2H=200FEH下列指令中,錯誤的是:PUSHDS B)POPCSC)PUSH30H[BX][SI] D)MOVSI,ES:[BP]B)POPCS只能對16位數進行操作,一次壓入彈出兩個字節PUSHAHMOVAX,1000HPUSHAXMOVBX,AXPUSH[BX]PUSH[1000H]POP[1002H]POPAXPOPBX12H34H56H78H9AHBCHDEHF0H21000H21001H21002H21003H21004H21005H21006H21007H30000H30001H………………30060H30061H30062H30063H30064HDS:2000HSS:3000HSP:0064HSP:0064H100個字節10H00HBX:1000H34H12H34H12H34H12HAX:3412HBX:1000HMOVAX,1000H12H34H56H78H9AHB交換指令XCHGdest,srcdestsrc在寄存器之間,寄存器和內存之間的8位,16位數據可以相互交換。XCHGAL,AHXCHGAX,[BX]內存之間的數據不可相互交換

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

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

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

的值2.地址傳送指令取有效地址指令LEA:取存儲器單元的偏取內存中的數

LDS將指定內存中的4個字節(32位)分別裝入指定的寄存器和段寄存器DS中。30H19H…………79H40H24H2133H2134H…………2131H2130H2132HDS段例:2130H~2133H這4個單元中存放著一個地址[2130H][2131H]為該地址偏移量[2132H][2133H]為該地址段值LDSDI,[2130H]執行后:DI:7940HDS:3024H取內存中的數LDS將指定內存中的4個字節(32位)分別取內存中的數LES將指定內存中的4個字節(32位)分別裝入指定的寄存器和段寄存器ES中。例:DS:1000HDI:0400H[10420H]=FFH[10421H]=00HLEAAX,20[DI];AX:0420HLEAAX,[DI];AX:0400H取內存中的數LES將指定內存中的4個字節(32位)分別12H34H56H78H9AHBCHDEHF0H00H10H23000H23001H23002H23003H23004H23005H23006H23007H23008H23009H例:DS:2000HMOVBX,3004HMOVAL,02HXLATLEABX,[3000H]LESSI,[BX+04H]LDSDI,[BX+02H]AL:DEHBX:3000HSI:BC9AHES:F0DEHDI:7856HDS:BC9AH12H34H56H78H9AHBCHDEHF0H00H10H3.標志傳送指令讀取標志:LAHF(LoadAHwithFlags):將標志寄存器FR中的低8位AH中OFDFIFTFSFZFAFPFCF1514131211109876543210D7D6D4D2D0AH設置標志:SAHF(SetFlagswithAH)上述指令的反向傳輸只提供8位標志位指令,保持對8位機指令的兼容性3.標志傳送指令讀取標志:LAHF(LoadAHw標志寄存器入棧命令:PUSHF將棧內內容進入標志寄存器:POPF:只有這個命令可以改變TF的內容。標志寄存器入棧命令:PUSHF3.3.2算術運算指令概念:算術運算涉及兩種類型的數據:有符號型和無符號型,對加減法這兩種類型采用同一套指令,對乘除法不能采用同一套指令。有符號數在計算機中以補碼的形式存儲。加減法:兩個加數或減數同為一種數據類型;兩種類型用不同的標準比較大小。有符號數加減運算要考慮溢出。3.3.2算術運算指令概念:算術運算涉及兩種類型的數據:有微機原理及單片機應用技術第3章--匯編語言與匯編程序設計基礎課件當相同符號數相加但結果變號時,產生溢出標志。例如:8+124000010000111110010000100結果:OF=1,CF=0例:8-5=8+(-5)0000100011111011100000011結果:OF=0,CF=1有符號數和無符號數指令相同,結果相同,但結果的意義不同。當相同符號數相加但結果變號時,產生溢出標志。例如:8+124當無符號數運算時,若CF=1,則超界。當有符號數運算時,若OF=1,則溢出,結果錯誤若運算結果為0,則ZF=1若運算結果為負數,則SF=1,即SF與最高位一致若運算結果中低8位有偶數個1,則PF=1若運算過程中低8位的位3向位4有進位,則AF=1當無符號數運算時,若CF=1,則超界。1.加減法指令一覽表1.加減法指令一覽表加法指令1)不帶進位的加法ADDdest,srcdest+srcdest結果影響標志位兩個操作數不可同為內存單元ADD[BX+DI],[2000H]ADD[BX+DI],2000HADDDX,50H[BX+SI]加法指令ADDdest,srcdest+src設AX=C544H,執行ADDAH,AL后,CF,OF?

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

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

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

0001100016進制加法AAA指令調整為10進制結果9+9=18用組合的BCD碼表示運算過程:000012)壓縮BCD碼運算調整指令DAA兩個壓縮BCD碼相加,結果在AL中,執行該指令后將結果調整為十進制,放在AL中。MOVAL,56HADDAL,47HDAA;AL:9DH;AL:03HCF=1調整原則:如果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碼運算調整指令DAA兩個壓縮BCD碼相加,結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因為AF=1,所以AH=1,CF=1,AF=1,AL高4位清零。MOVAX,‘8’;AX:0038H;AXBCD碼減法調整指令與加法調整指令類似,只是分別將加06H,60H,66H改為減06H,60H,66H。AAS:對非壓縮BCD碼減法調整DAS:對壓縮BCD碼減法調整必須緊跟在相對應的加減法指令后進行調整。BCD碼減法調整指令與加法調整指令類似,只是分別將加06H,BCD碼乘法十進制調整指令AAM1)BCD碼均為無符號數,故只有用MUL乘法指令才能調整(將AL中小于64H的二進制數變換為非壓縮BCD數送AX);2)BCD碼乘法調整指令只能對非壓縮BCD碼相乘結果進行調整;MOVAL,05HMOVBH,06HMULBHAAM;AX:001EH;AX:0300HBCD碼乘法十進制調整指令AAM1)BCD碼均為無符1)BCD碼均為無符號數,故只有用DIV除法指令才能調整,并且在兩個數相除前進行調整;2)BCD碼除法調整指令只能對非壓縮BCD碼相乘結果進行調整;MOVAX,0300HMOVBL,05HAADDIVBL;AX:001EH;AX:0300HBCD碼除法十進制調整指令AAD1)BCD碼均為無符號數,故只有用DIV除法指令才能調整1.邏輯運算指令1)NOT按位取反NOTdestAX:73HDX:85HMOVAX,DXNOTAXADDAX,DXINCAX0000000010000101111111110111101011111111111111110000000000000000對標志位沒有影響3.3.3邏輯運算和移位指令1.邏輯運算指令1)NOT按位取反NOT2)AND與,

OR或,

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

2.非循環移位指令SAL(ShiftArithmeticLeft):算術左移SHL(ShiftLogicLeft):邏輯左移0CF左移一位進CF,右邊補0,相當于乘2。影響標志若移位后最高位與CF不同,則OF=1,表示移位前后數據變號。若移位位數大于1,所移的位數用CL存放。2.非循環移位指令SAL(ShiftArithmeticMOVAL,02HSALAL,1;AL:00000010;AL:00000100MOVAL,02HSALAL,4MOVAL,02HMOVCL,4SALAL,CL;AL:00000010;AL:00100000MOVAL,02H;AL:00000010SAR(ShiftArithmeticRight):算術右移CF最低位進CF,左邊重復最高位,即操作數符號不變。一般用于有符號數的右移,符號擴展。若移位位數大于1,所移的位數用CL存放。MOVAL,-4SARAL,1;AL:11111100;AL:11111110-2SAR(ShiftArithmeticRight):算SHR(ShiftLogicRight):邏輯右移CF最低位進CF,左邊補0。一般用于無符號數的右移。若移位位數大于1,所移的位數用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試分析下面程序完成什么任務MOVCL,4SHLDX,CLMOVBL,AHSHLAX,CLSHRBL,CLORDL,BLAX0BL0DX0DXAX0試分析下面程序完成什么任務MOVCL,4AX0BL03.循環移位指令ROL(RotateLeft):不帶進位循環左移CF若移位后最高位與CF不同,則OF=1,表示移位前后數據變號。若移位位數大于1,所移的位數用CL存放。3.循環移位指令ROL(RotateLeft):不帶進ROR(RotateRight):不帶進位循環右移CF若移位位數大于1,所移的位數用CL存放。ROR(RotateRight):不帶進位循環右移CF若RCL(RotatethroughCFLeft):帶進位循環左移CFRCL(RotatethroughCFLeft):帶RCR(RotatethroughCFRight):帶進位循環右移CF可實現多字節的移位,將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串操作指令用一條指令實現對一串數據或字符的操作,字符或數據的個數在CX中,每執行一次CX自動減1,直至減到零串操作自動停止;源操作數在DS:[SI]中,目的操作數在ES:[DI]中;源操作數和目的操作數都在內存中,是唯一一條從內存到內存的指令;DF=1,地址自動由高至低,減量進行串運算;DF=0,地址自動由低至高,增量進行串運算。1.串操作指令3.3.4串操作指令用一條指令實現對一串數據或字符的操作串傳送指令MOVSB:每次傳送一個字節;MOVSW:每次傳送一個字;將位于DS段,由SI所指出的存儲單元的字節或字傳送到位于ES段,由DI所指的存儲單元中,再根據DF修改SI和DI,從而指向下一個元素,繼續傳送,直到CX為0為止。DS:SIES:DIDS:SIES:DIDS:SIES:DI串傳送指令MOVSB:每次傳送一個字節;將位于DS段MOVSI,1000HMOVDI,2000HMOVCX,100CLDKKK:MOVSBDECCXJNZKKK假設DS與ES段已經賦值;設置源操作數指針;設置目的操作數指針;傳送的元素個數;DF=0,每傳送一次,地址自動加1,繼續傳送;每次傳送一個字節;傳送一次,CX減1;CX不為0,繼續轉向KKK處MOVSB:相當于[DS:SI][ES:DI]SI=SI+1DI=DI+1(DF=0)MOVSI,1000H假設MOVSI,1000HMOVDI,2000HMOVCX,100CLDREPMOVSB通常,在串傳送指令前加段前綴REP,程序可自動計數并判別是否傳送完畢。REPMOVSB相當于

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

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

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

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

JZ

DONE

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

LODSB PUSHCX …… POPCX

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

<2>.無條件間接轉移指令格式:JMPdest

操作:

目的操作數為寄存器→寄存器內容送IP

目的操作數為字變量→字變量內容送IP

目的操作數為雙字變量→雙字變量內容送CS和IP

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

判斷無符號數大小的指令(CF和ZF):JA/JNBEJAE/JNBJB/JNAEJBE/JNA判斷有符號數大小的指令(OF,SF和ZF):JG/JNLEJGE/JNLJL/JNGEJLE/JNG根據5個標志位來判斷,SF,ZF,PF,CF,OF僅判斷一個標志位實現轉移.PF=0奇轉移JNP/JPOPF=1偶轉移

JP/JPEOF=0無溢出轉移JNOOF=1溢出轉移JOSF=0為正轉移JNSSF=1為負轉移JSCF=0無進(借)位轉移JNCCF=1有進(借)位轉移JCZF=0不相等/不等于0轉移JNE/JNZZF=1相等/等于0轉移JE/JZ標志設置功能指令助記符簡單條件轉移指令僅判斷一個標志位實現轉移.PF=0奇轉移JNP/JPOPF=無符號數條件轉移指令有4條指令助記符功能

JB/JNAE

低于/不高于等于轉移

JNB/JAE

不低于/高于等于轉移

JA/JNBE

高于/不低于等于轉移

JNA/JBE

不高于/低于等于轉移無符號數條件轉移指令有4條無符號數條件轉移指令有4條指令助記符功能

JB/JNAE

低于/不高于等于轉移

JNB/JAE

不低于/高于等于轉移

JA/JNBE

高于/不低于等于轉移

JNA/JBE

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

溫馨提示

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

評論

0/150

提交評論