




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章8086/8088指令系統(tǒng)本章重點掌握匯編語言調試工具DEBUG和MASM的使用掌握8086的尋址方式掌握8086的指令系統(tǒng)-數(shù)據傳送指令-算術運算類指令
-邏輯運算和移位指令-控制類指令-串操作指令DEBUG命令行的使用
DEBUG命令行
DEBUG是DOS的一個內部命令,是操作系統(tǒng)專門為匯編語言提供的一種調試工具。
DEBUG程序的啟動在DOS提示符下,可鍵入命令:DEBUG[path][文件名][參數(shù)1][參數(shù)2]在DEBUG程序調入后,出現(xiàn)提示符“-”,此時,可鍵入所需的DEBUG命令。DEBUG的基本命令顯示和修改寄存器命令R,格式為:-R寄存器名
若省略寄存器名稱,則顯示所有寄存器的內容,否則將顯示指定寄存器中的內容。匯編命令A,格式為:-A[地址]
該命令從指定地址開始輸入匯編語句,把它們匯編成機器代碼相繼存放在從指定地址開始的存儲器中。若地址省略,則從CS段偏移量100(IP=100)的內存地址開始。在匯編狀態(tài)下輸入回車就返回了DEBUG命令狀態(tài)。運行命令G,格式為:-G[=地址1][地址2…]
其中地址1規(guī)定了運行起始地址,后面的若干地址均為斷點地址。若地址省略,則從CS段偏移量100(IP=100)的內存地址開始執(zhí)行代碼。追蹤命令T,格式為:-T[=起始地址]從指定地址起執(zhí)行一條指令后停下來,顯示所有寄存器內容及標志位的值,如未指定地址則從當前CS:1P開始執(zhí)行。退出命令Q,格式為:-Q
它退出DEBUG程序,返回DOS,但該命令本身并不把在內存中的文件存盤。DEBUG的基本命令顯示內存內容命令D,
格式為:-D起始地址[長度]在D命令中如不指出段地址,則其默認為DS段。若沒有給出起始地址,則從DS段偏移量100處顯示內存信息。若沒有指定長度范圍,則會從上一個D命令所顯示的最后地址接下來顯示128個字節(jié)。長度值用L10、L25的方式給出。修改內存內容命令E,
格式為:-E內存地址
該命令修改DS段指定偏移量地址的內存單元的數(shù)據。DEBUG的基本命令DEBUG的基本命令顯示標志寄存器命令R,格式為:-R標志名稱設置未設置標志名稱設置未設置溢出OV(溢出)NV(未溢出)零位ZR(等于零)NZ(不等于零)方向DN(減少)UP(增加)輔助進位AC(進位)NA(無進位)中斷EI(許可)DI(禁止)奇偶標志PE(偶)PO(奇)符號NG(負)PL(正)進位CY(設置進位)NC(清除進位)修改標志寄存器命令RF,格式為:-RF指令格式指令的內容由兩部分組成,即進行何種操作和從存儲器的那個單元取數(shù);前者稱為操作碼,后者稱為操作數(shù)。所以指令的一般格式為:操作碼操作數(shù)1操作數(shù)2操作碼:指出指令所進行的操作,如加、減、乘、除、取數(shù)和存數(shù)等等。操作數(shù):可以是操作數(shù)本身,也可以是操作數(shù)地址,還可以是操作數(shù)地址的計算方法,表示參加運算的數(shù)據應從存儲器的哪個單元取,運算的結果應存到哪個單元。3.18086的指令格式和尋址方式匯編語言的程序中,每一個語句的格式如下:
<標號:>指令助記符目標操作數(shù)<,源操作數(shù)><;注釋>
Start:MOVAX,1090H;將16進制數(shù)1090H送入AX<標識符>
表達式
<注解>標識符和表達式用冒號隔開表達式和注解用分號隔開存放結果的操作數(shù)匯編指令基本格式立即數(shù)尋址操作數(shù)就在指令中提供,叫立即數(shù)尋址方式。比如: MOV AL,80H ;將16進制數(shù)80H送入AL MOV AX,1090H
;將1090H送AX,AH中為10H,AL中為90H采用立即數(shù)尋址方式主要是為了給寄存器賦值,不需要總線周期,速度快。立即數(shù)可以是8位或16位,若為16位立即數(shù),則低字節(jié)在低地址,高字節(jié)在高地址。8086的尋址方式寄存器尋址
操作數(shù)在CPU的內部寄存器中,寄存器名在指令中直接給出
MOVAX,BX ;將BX中的數(shù)據送AX中
MOVBL,CL;將CL的內容送BL中采用寄存器尋址方式由于操作數(shù)在寄存器中不需要訪問內存,不需要總線周期,速度快。寄存器可以是8位或者16位。直接尋址方式數(shù)據在存儲器中,存儲單元的有效地址(EA)由指令直接給出,是存儲器訪問的最簡單的辦法。注意:采用直接尋址方式,如果指令前沒有指明操作數(shù)在哪個段,默認的段寄存器為數(shù)據段寄存器DS。如果對其他段的內存直接尋址,在指令前必須用前綴指明段寄存器。比如:ES:MOVAX,[3000H];將ES段的3000H和3001H;兩單元的內容取到AX中比如:MOVAX,[2000H];將DS段的2000H和2001H;兩單元的內容取到AX中內存地址寄存器間接尋址采用寄存器間接尋址方式,操作數(shù)所在的存儲單元的有效地址(EA)由寄存器指出。這些寄存器可以是BX、BP、SI、DI。比如:MOVAX,[BX]
設DS=5000H,BX=3000H,本指令將53000H和53001H兩個單元內容送寄存器AX。注意:采用寄存器間接尋址方式,如果指令前沒有指明操作數(shù)在哪個段,默認段寄存器為數(shù)據段寄存器DS;如果寄存器為BP時,對應的段寄存器為堆棧段寄存器SS。通常我們把BX和BP稱為基址寄存器,將SI和DI稱為變址寄存器,以BX和BP進行的寄存器間接尋址稱為基址尋址。以SI和DI進行的寄存器間接尋址稱為變址尋址。MOVAX,[BX]基址尋址MOVAX,[SI]變址尋址MOVAX,[BP]基址尋址MOVAX,[DI]變址尋址寄存器相對尋址采用寄存器相對尋址方式,允許在指令中給出一個位移量,操作數(shù)所在的存儲單元的有效地址由寄存器的內容加上位移量得到(位移量可以是8位可以是16位)。這些寄存器可以是BX、BP、SI、DI。比如:
MOVAX,[SI+0050H]
設DS=5000H,SI=3000H,本指令將53050H和53051H兩個單元內容送寄存器AX。對BX、SI、DI寄存器來說,默認的段寄存器為DS,對BP來說,默認的段寄存器是SS。基址加變址尋址將BX、BP(基址寄存器)和SI、DI(變址寄存器)組合起來構成的尋址方式我們稱為基址加變址尋址。操作數(shù)的有效地址(EA)由一個基址寄存器內容加上一個變址寄存器的內容得到。比如:
MOVAX,[BX+SI]
設DS=1000H,BX=5000H,SI=2000H,EA為7000H,本指令將17000H和17001H兩個單元內容送寄存器AX。EA=[BP][BX][DI][SI]+相對基址加變址尋址在基址加變址尋址方式中允許在指令中給出一個位移量,操作數(shù)所在的存儲單元的有效地址(EA)由由一個基址寄存器內容加上一個變址寄存器的內容再加上位移量得到(位移量可以是8位可以是16位)。比如:
MOVAX,[BX+SI+0050H]
設DS=1000H,BX=5000H,SI=2000H,EA為7050H,本指令將17050H和17051H兩個單元內容送寄存器AX。EA=[BP][BX][DI][SI]++16位偏移量8位偏移量指出下列指令的尋址方式及默認的段寄存器
MOVSI,[1250H]MOVBX,1234HMOVDX,BXMOVDX,[DI]MOVAX,[BP]MOVDX,[BX+1234H]MOVCX,[BX+DI]MOVDX,[BP+DI+0050H]直接內存尋址,段寄存器DS立即數(shù)尋址,無段寄存器寄存器尋址,無段寄存器寄存器間接尋址,段寄存器DS寄存器間接尋址,段寄存器SS寄存器相對尋址,段寄存器DS基址加變址尋址,段寄存器DS相對基址加變址尋址,段寄存器SS相對尋址方式中的偏移量在寄存器相對尋址和相對基址加變址尋址方式中,其偏移量不僅可用常量表示,也可用符號表示。這個符號可以是變量名,例如WVAR變量,而且支持多種表達形式。MOVAX,[DI+100H]
等同于
MOVAX,100H[DI]等同于
MOVAX,[DI]100HMOVAX,[BX+SI+WVAR]等同于MOVAX,[BX+SI]WVAR等同于MOVAX,WVAR[BX+SI]等同于MOVAX,WVAR[BX][SI]等同于MOVAX,[BX]WVAR[SI]等同于MOVAX,[BX][SI]WVAR若(BX)=0313H,(SI)=1123H,(DI)=0606H,(DS)=2000H,(SS)=6800H,(BP)=0100H。指出下列指令中畫線的操作數(shù)的尋址方式,如果為存儲器操作數(shù),請計算該操作數(shù)的有效地址與物理地址。;立即尋址①MOV AX,1117H②MOV BX,SP③MOV DX,[BX];寄存器尋址EA=0313H,PA=20000H+0313H=20313H;寄存器間接尋址;寄存器相對尋址④MOV AX,[BP]100H⑤MOV AX,100H[SI];寄存器相對尋址EA=0100H+100H=0200H,PA=68000H+0200H=68200HEA=1123H+100H=1223H,PA=20000H+1223H=21223H若(BX)=0313H,(SI)=1123H,(DI)=0606H,(DS)=2000H,(SS)=6800H,(BP)=0100H。指出下列指令中畫線的操作數(shù)的尋址方式,如果為存儲器操作數(shù),請計算該操作數(shù)的有效地址與物理地址。;基址變址尋址⑥MOV AL,[BX][SI]⑦MOV AX,[BP+SI+100H];相對基址加變址尋址EA=0313H+1123H=1436H,PA=20000H+1436H=21436HEA=0100H+1123H+100H=1323H,PA=68000H+1323H=69323H若(BX)=0313H,(SI)=1123H,(DI)=0606H,(DS)=2000H,(SS)=6800H,(BP)=0100H。指出下列指令中畫線的操作數(shù)的尋址方式,如果為存儲器操作數(shù),請計算該操作數(shù)的有效地址與物理地址。3.2數(shù)據傳送類指令基本數(shù)據傳送指令MOV
MOV指令是形式最簡單,用的最多的指令,它可以實現(xiàn)CPU內部寄存器的數(shù)據傳遞,寄存器和內存的數(shù)據傳遞,還可以把一個立即數(shù)送給內部寄存器或者內存單元。
MOVAL,BLMOVAX,[BX]MOV[1000],CXMOVBL,40H;將BL中的8位數(shù)據送AL;將BX和BX+1所指內存單元的數(shù)據送AX;將CX的值送DS段1000H和1001H單元;將立即數(shù)40H送BL注意:(1)在傳送指令MOV中,源寄存器和目標寄存器的類型必須匹配,不能一個為字,一個為字節(jié)。(2)不能在兩個內存單元中直接傳送數(shù)據。
MOV[0200],[0300]錯誤!修改為:MOVAL,[0300]
MOV[0200],AL(3)在傳送指令MOV中,寄存器可以是源操作數(shù),也可以是目的操作數(shù),但CS和IP不能是目的操作數(shù)MOVIP,3090H錯誤?。?)不能用立即數(shù)尋址方式為段寄存器傳輸,兩個段寄存器之間不能用MOV指令直接傳送數(shù)據。堆棧操作指令PUSH和POP在子程序調用和中斷調用時,要保存斷點地址(即IP指令指針寄存器的值)和保護現(xiàn)場(通用寄存器的值),調用結束時,要恢復斷點地址(即IP指令指針寄存器的值)和恢復現(xiàn)場(通用寄存器的值),這些功能要通過堆棧來完成。寄存器值的保存和恢復要用入棧指令PUSH和出棧指令POP。比如:
PUSHAX;將AX內容推入堆棧PUSH[BX];將BX和BX+1所指內存單元的值入棧同樣還有彈出指令:
POPBX;將棧頂兩單元彈出送BX8086的堆棧操作SS的值×1600000HFFFFFH堆棧段首址堆棧指針SP2357PUSHAX假設AX的值為2357H,BX的值為41A6H堆棧指針SP棧底棧頂A641堆棧指針SP棧頂PUSHBX……SS段寄存器記錄堆棧段的段首地址,棧頂由SP指定,堆??偸菑母叩刂废虻偷刂贩较蜓由欤擲P為最大值時為空棧,當SP為0時棧滿。注意:(1)8086的堆棧操作總是按字進行,沒有字節(jié)操作指令。
PUSHAL錯誤?。。?)每執(zhí)行1條入棧指令,堆棧指針SP的值減2,推入堆棧的數(shù)據在棧頂,高字節(jié)在高地址先入棧,低字節(jié)在低地址后入棧,即低字節(jié)是真正的棧頂;出棧操作過程相反。如果用[A]表示寄存器A的內容,SP表示堆棧指示器,Msp表示堆棧指示的存儲器棧頂單元,入棧操作和出棧操作可以表示為:入棧:[SP]-2→SP,[A]→Msp
出棧:[Msp]→A,[SP]+2→SP(3)CS的值可以入棧,但不能彈出一個值到CS寄存器。標志傳送指令(1)讀取標志指令LAHF 將標志寄存器的低8位送AH。1514131211109876543210OFDFIFTFSFZFAFPFCFD7D6D4D2D0AH(2)設置標志指令SAHF將AH寄存器的相應位送標志寄存器的低8位。(3)對標志寄存器的堆棧操作指令
PUSHF將標志寄存器的值推入堆棧頂部。
POPF從堆棧彈出一個字送標志寄存器。交換指令XCHE
交換指令可以實現(xiàn)寄存器之間或者內存與寄存器之間的數(shù)據交換??梢允亲止?jié)交換,也可以是字交換
XCHEAX,BX;AX和BX之間進行字交換XCHECH,AL;CH和AL之間進行字節(jié)交換
XCHE[2530],BL;2530單元和BL之間進行字節(jié)交換注意:(1)目的操作數(shù)和源操作數(shù)不能同為內存單元(2)CS和IP不能用于交換指令(3)段寄存器不能參加交換地址傳送指令(1)取有效地址指令(LEA)將存儲器的偏移地址送到一個寄存器。例如:LEABX,[2728];將內存單元的偏移量2728送BXLEASP,[0482];將內存單元的偏移量0482送SPBUFFER數(shù)據區(qū)LEABX,BUFFER將存儲區(qū)域BUFFER的偏移地址送BXMOVBX,BUFFER將存儲區(qū)域BUFFER的數(shù)據送BX(2)裝入地址指令 (LDS)功能:將4字節(jié)的地址指針(一個段地址和一個偏移量)傳送到兩個目的寄存器,其中地址指針的后兩個字節(jié)即段地址一定送到DS中。比如:LDS DI,[2130H];使2130H和2131H中的偏移量送DI,
;使2132H和2133H中的段地址DS。字符串首址偏移量字符串首址段地址2130H(3)裝入地址指令 (LES)功能:將4字節(jié)的地址指針(一個段地址和一個偏移量)傳送到兩個目的寄存器,其中地址指針的后兩個字節(jié)即段地址一定送到ES中。比如:LES DI,[2130H];使2130H和2131H中的偏移量送DI,
;使2132H和2133H中的段地址ES。字符串首址偏移量字符串首址段地址2130H3.3輸入/輸出指令
8086系統(tǒng)和外部設備之間通過I/O芯片聯(lián)系的,每一個I/O芯片都有一個8位寄存器和幾個8位寄存器,系統(tǒng)要為每個寄存器分配一個地址,此地址叫端口號。
8086系統(tǒng)中可以有64K個8位端口,相鄰編號的兩個端口可以組合成為一個16的端口。8086采用存儲器與I/O端口獨立編址方式,即內存單元和I/O端口從0單元開始編址。當M/IO為高電平時訪問存儲器,當M/IO為低電平時訪問I/O端口。
8086有專門的訪問I/O端口的指令(IN和OUT),當8086在執(zhí)行訪問I/O端口的輸入(IN)指令和輸出(OUT)指令時,就會使M/IO信號處于低電平,結合RD和WR信號產生出對相應的I/O端口的讀/寫操作。
8086系統(tǒng)中允許有65536個8位端口,兩個8位端口可以組合成16位的端口。執(zhí)行輸入(IN)輸出(OUT)指令時,CPU可以從一個8位端口讀入(寫出)一個字節(jié)到AL中,或者從一個16位端口讀入(寫出)一個字到AX中。(1)直接輸入/輸出指令端口號為0~255,用一個立即數(shù)表示(00H~FFH)INAL,50H;將50H端口的字節(jié)讀入ALINAX,70H;分別將70H、71H端口的內容讀入AL、AHOUT44H,AL;將AL中的內容輸出到44H端口
OUT80H,AX;將AL、AH中的內容分別輸出;到80H、81H兩端口(2)間接的輸入輸出指令當端口號大于FFH時,這些端口號不能用在指令中用立即數(shù)的形式給出,端口號放在DX寄存器中。例如:將數(shù)據C6H送到端口100HMOVDX,100HMOVAL,C6HOUTDX,AL
INAL,DX;從DX所指的端口中讀取INAX,DX;從DX和DX+1所指出的兩個端口中讀取OUTDX,AL;將AL中的字節(jié)輸出到DX所指的端口中OUTDX,AX;將AL中的字節(jié)輸出到DX所指的端口中;將AH中的字節(jié)輸出到DX+1所指的端口中注意:①只能用累加器(AX)作為執(zhí)行輸入輸出的機構②尋址范圍:直接輸入輸出指令為0~255(0H~FFH)。端口號在指令中可以用立即數(shù)的形式直接給出
間接輸入輸出指令為0~65535(0H~64K)。端口號在寄存器DX中給出,必須是寄存器DX。③在運行I/O指令的程序時,如果沒有硬件的支持可能造成計算機死機。3.4算術運算類指令算術運算指令能夠對字節(jié),字,雙字的數(shù)據進行加、減、乘、除運算,涉及兩種類型的數(shù)據。無符號數(shù)8位無符號數(shù)的范圍為0~25516位無符號數(shù)的范圍為0~65535有符號數(shù)8位有符號數(shù)的范圍為-128~+12716位有符號數(shù)的范圍為-32768~+32767
算術運算指令大都對標志位有影響,有時利用標志位才能得到正確的結果。進位標志CF(CarryFlag)
計算機執(zhí)行加法運算使最高位產生進位時CF為1。溢出標志OF(OverflowFlag)
計算機加法運算時,當?shù)臀煌罡呶划a生進位,但最高位沒有往前進位時;或者反過來,當?shù)臀煌罡呶粵]有產生進位,而最高位往前卻有進位時;此時產生了溢出,使OF為1。000001010000101000001111無符號數(shù):5+10=15有符號數(shù):(+5)+(+10)=(+15)CF=0,OF=0000010001111101100000011無符號數(shù):8+251=3有符號數(shù):(+8)+(-5)=(+3)CF=1,OF=01000010000111110010000100無符號數(shù):8+124=132有符號數(shù):(+8)+(+124)=(-124)CF=0,OF=1100001111111010101111100無符號數(shù):135+245=124有符號數(shù):(-121)+(-11)=(+124)CF=1,OF=11結論:如果CF=1,那么無符號數(shù)產生溢出。指的是字節(jié)運算的結果范圍超出了255,字運算的結果范圍超過了65535。結論:如果OF=1,那么有符號數(shù)產生溢出。指的是字節(jié)運算的結果范圍超出了-128~+127,字運算的結果范圍超過了-32768~+32767。算術運算對標志位的影響有如下規(guī)律:
當無符號數(shù)運算產生溢出時,CF為1;當有符號數(shù)運算產生溢出時,OF為1;如運算結果為0,則ZF=1;
如運算結果為負數(shù),則SF=1;
如運算結果中有偶數(shù)個1,則PF=1。加法指令不帶進位位的加法指令ADD
例如:ADDAL,50H ;AL和50H相加,結果放在AL中ADDDI,SI ;DI和SI的內容相加,結果在DI不帶進位位的加法指令ADD用來實現(xiàn)一個或兩個字節(jié)的相加操作;結果放在目的操作數(shù)的地方。帶進位位的加法指令ADC例如:ADCAX,SI;AX和SI以及CF的值相加,結果在AXADCDX,[SI];SI和SI+1所指的單元的內容和DX的內容;以及CF的值相加,結果在DX例如:兩個4字節(jié)的無符號數(shù)相加,這兩個數(shù)分別為放在內存單元的2000H和3000H開始的存儲單元,低位在前,高位在后,第一個數(shù)為:10008423H,第二個數(shù)為:20007F00H,得到的和放在2000H單元。運算過程如下:1000010000100011011111110000000000000011001000111CF利用ADD指令完成兩個低16位8423H和7F00H的相加0001000000000000001000000000000000110000000000011CF利用ADC指令完成兩個高16位1000H和2000H的相加注意:帶進位位的加法指令ADC可以實現(xiàn)多字節(jié)的加法運算。指令序列如下:MOVSI,2000HMOVAX,[SI];取第1個數(shù)的低16位送AXMOVDI,3000HADDAX,[DI];第1個數(shù)和第2個數(shù)低16位相加MOV[SI],AX;低16位和送2000H和2001H單元MOVAX,[SI+2];取第1個數(shù)的高16位送AXADCAX,[DI+2];高16位連同進位標志相加MOV[SI+2],AX;高16位和送2002H和2003H單元增量指令INC增量指令僅有目的操作數(shù),作用是將操作數(shù)的內容加1,再送回操作數(shù)。例如:INCAL;將AL中的內容加1INCCX;將CX中的內容加1匯編語言的程序中,每一個語句的格式如下:
<標號:>指令助記符目標操作數(shù)<,源操作數(shù)><;注釋>存放結果的操作數(shù)減法指令不考慮借位的減法指令SUB
該指令完成一個或兩個字節(jié)的相減運算。例如:SUBBX,CX;將BX中的內容減去CX中的內容,結果在BX中SUBAL,20H;將AL中的值減去20,結果放在AL中考慮借位的減法指令SBB
該指令為實現(xiàn)多字節(jié)的相減提供了方便。例如:SBBAX,2030H;將AX的內容減去2030H,并減去CF值減量指令DEC
減量指令僅有目的操作數(shù),作用是將操作數(shù)的內容減1,再送回操作數(shù)。例如:DECAX ;將AX的內容減1,結果送回AX中DECBL ;將BL的內容減1,結果送回BL中求補指令NEG
該指令使操作數(shù)取補碼例如:NEGAL ;將AL中的數(shù)取補碼NEGCX ;將CX中的內容取補碼
比較指令指令格式:
CMP操作數(shù)1,操作數(shù)2注意:比較指令CMP執(zhí)行兩個數(shù)的相減操作,但不送回相減的結果。影響標志位AF、CF、OF、PF、SF、ZF。條件轉移指令通過判斷比較后的標志位進行轉移。例如:CMPAX,2000H;將AX的內容和2000H相比較,結果影響標志位CMPAL,50H;將AL中的數(shù)和50H比較,結果影響標志位00000101+1111011011111011有符號數(shù):5-10=-5
被減數(shù)小SF=1,OF=000001010+1111101100000101有符號數(shù):10-5=5
被減數(shù)大SF=0,OF=011111011+1111011011110001有符號數(shù):(-5)-10=-15
被減數(shù)小SF=1,OF=000000101+0000101000001111有符號數(shù):5-(-10)=15
被減數(shù)大SF=0,OF=0結論:如果SF≠OF,被減數(shù)小。結論:如果SF=OF,被減數(shù)大。(1)無符號數(shù)的比較
a.操作數(shù)相等,則ZF=1。
b.CF=0,則無借位,被減數(shù)大;
CF=1,則有借位,被減數(shù)??;(2)有符號數(shù)的比較
a.操作數(shù)相等,則ZF=1。
b.如果OF=SF,則被減數(shù)大;如果OF≠SF,則被減數(shù)小;乘法指令0011×111000101010=42將1110理解為14則該式為:3×14=42將1110理解為-2的補碼,則該式不正確在執(zhí)行乘法運算時,為了使無符號數(shù)取得正確的結果,有符號數(shù)就得不到正確的結果,應此8086提供了無符號數(shù)相乘的指令和有符號數(shù)相乘的兩套指令。無符號數(shù)乘法指令MUL
8086在執(zhí)行乘法指令時,有一個乘數(shù)總是放在AL(8位)或者AX(16位)中,如果兩個8位數(shù)相乘,得到的16位乘積放在AX中,如果兩個16位數(shù)相乘,得到的32位乘積放在DX和AX中,其中DX放乘積的高16位,AX放乘積的低16位。例如:MULBL;AL中數(shù)和BL中數(shù)相乘,結果在AX中MULCX;AX中數(shù)和CX中數(shù)相乘,結果在DX和AX中有符號數(shù)乘法指令IMUL無符號數(shù)除法指令DIV
8086在執(zhí)行除法指令時,當被除數(shù)是16位,除數(shù)是8位時,被除數(shù)放在AX中,得到的8位商放在AL中,8位的余數(shù)放在AH中;當被除數(shù)是32位,除數(shù)是16位時,被除數(shù)放在DX和AX中,DX放被除數(shù)的高16位,AX放被除數(shù)的低16位。得到的16位商放在AX中,16位的余數(shù)放在DX中;除法指令DIVCL;AX中的數(shù)據除以CL中的數(shù)據,;商在AL中,余數(shù)在AH中有符號數(shù)的除法指令IDIV在計算機中,可以用4位二進制數(shù)表示1位十進制數(shù),這種代碼稱為BCD碼。4位2進制數(shù)BCD碼00000000110010200113010040101501106011171000810019BCD碼只有0~9十種編碼,對于2進制編碼1010~1111在BCD碼中無意義BCD碼運算指令BCD碼有兩類:1)一個字節(jié)只用低4位表示BCD碼,高4位為0。稱為非組合(非壓縮)的BCD碼。2)一個字節(jié)的8位用來表示2位BCD碼,稱為組合(壓縮)的BCD碼。000000010000001012AX:16位0001001012AL:8位非組合BCD碼組合BCD碼BCD碼BCD碼+-×÷二進制的運算指令=非BCD碼結果=BCD碼結果專門指令調整結果14+28=3C=42ADD指令BCD調整指令BCD碼運算過程BCD碼十進制調整00001000+0000011100001111(0F)例如:8+7=15BCD碼是逢10進1,4位二進制數(shù)是逢16進1,若運算產生了非BCD碼的結果,可以補加一個6調整結果。+00000110
00010101(15)BCD碼調整原理一:如果1位BCD碼所對應的4位二進制數(shù)超過9,因該補加一個6產生進位來進行調整。BCD碼十進制調整00001001+0000100100010010(12)例如:9+9=184位二進制數(shù)是逢16進1,BCD碼是逢10進1,若運算產生進位則意味丟失了6,應給低位補加一個6。+00000110
00011000(18)BCD碼調整原理二:如果低4位向高4位產生進位時,因該在低4位補加一個6進行調整。BCD碼的加法十進制調整指令AAA對非組合BCD碼相加結果進行調整。DAA對組合的BCD碼相加結果進行調整,
注意:所有的BCD碼調整指令都只有一個目的操作數(shù)并且隱含為AL,將AL中的數(shù)據調整為BCD碼并將結果放在AL中。例如:MOVAL,14;組合的BCD碼MOVBL,28;組合的BCD碼ADDAL,BL;AL中為相加的結果3CDAA;對組合的BCD碼相加結果調整,跟在加法;指令后面AL中為調整的結果42BCD碼的減法十進制調整指令AAS對非組合BCD碼相減結果進行調整DAS對組合的BCD碼相減結果進行調整注意:緊跟在減法指令后面BCD碼的乘法十進制調整指令AAM
對BCD數(shù)據進行乘法運算時,要求乘數(shù)和被乘數(shù)都用非組合的BCD碼表示,否則無法調整結果,所以只有將非組合BCD碼相乘結果調整的指令。注意:緊跟在乘法指令后面BCD碼的除法十進制調整指令AAD注意:緊跟在除法指令后面符號擴展指令將字節(jié)擴展成字指令CBW該指令將AL的最高位擴展到AH;如果AL的最高位為0,則AH=00H,如果AL最高位為1,則AH=FFH。將字擴展成雙字的命令CWD該指令將AX的最高位擴展到DX;如果AX的最高位為0,則DX=0000H,如果AX最高位為1,則DX=FFFFH。
這兩條指令主要用于除法指令中,在除法運算時,除數(shù)必須是被除數(shù)的一半,當被除數(shù)和除數(shù)都為8位時,必須把被除數(shù)擴展成16位;當被除數(shù)和除數(shù)都為16位時,必須把被除數(shù)擴展成32位;3.5邏輯運算指令和移位指令邏輯運算指令:AND(與)、OR(或)、NOT(非)、XOR(異或)、TEST(測試)指令例如:
AND AL,0FH ;AL中內容和0FH相與,結果在AL中ORAX,00F0H ;AX中內容和00F0H相或,結果在AX中 XOR AX,AX ;AX內容本身進行異或,結果在AX中
NOT AL ;AL中內容求反,結果在AL中AND指令用來對一個數(shù)據的指定位清0。OR指令用來對一個數(shù)據的指定位置1。XOR指令常常用在程序開始使某個寄存器清零。NOT指令用來求取某個數(shù)的反碼,加1得到補碼。TEST和AND執(zhí)行同樣操作,但TEST指令不送回操作結果,而僅僅影響標志位。TESTAX,8000H;如AX的最高位為1,則ZF=0,;如AX的最高位為0,則ZF=1,
TEST指令經常用來進行位測試,檢測指定位是1還是0,以實現(xiàn)程序的轉移。例如:如果AL中的數(shù)為偶數(shù),則轉入LABEL標號的指令。LABEL:…………TESTAL,01H;如AL的最低位為0,則ZF=1
JZLABEL……
移位指令非循環(huán)移位指令 4條移位指令:算術左移指令SAL邏輯左移指令SHL算術右移指令SAR邏輯右移指令SHRS:Shift的縮寫L:leftR:rightA:Arithmetic算術
H:Logic邏輯SAL指令:最低位補0,最高位進CF,相當于有符號數(shù)乘2。SHL指令:最低位補0,最高位進CF,相當于無符號數(shù)乘2。SAR指令:最高位不變,高位入低位,最低位入CF,相當于有符號數(shù)除2SHR指令:最高位補0,高位入低位,最低位入CF,相當于無符號數(shù)除2指令格式:SALSHLSARSHR
寄存器或內存單元
(8位或者16位),移位的位數(shù)注意:如果移動1位,指令直接給出;否則移位的位數(shù)必須放在CL中。例如:SALDX,1;將DX的內容算術左移1位。SHRAX,CL;將AX的內容邏輯右移若干位,CL
;中給出右移的位數(shù)。
移位指令常用來替代乘除法指令,會使程序運行的速度提高5~6倍。下面的程序使AL中的數(shù)乘以10SHLAL,1;將AL中的數(shù)左移1位,得到2XMOVBL,AL;2X保存在BL中MOVCL,2;移位次數(shù)置CL中SHLAL,CL;2X左移2位,得到8XADDAL,BL;2X加8X得到10X循環(huán)移位指令 4條循環(huán)移位指令:不帶CF的循環(huán)左移指令ROL不帶CF的循環(huán)右移指令ROR帶CF的循環(huán)左移指令RCL帶CF的循環(huán)右移指令RCRR:Rotate的縮寫L:leftR:rightO:OnlyC:進位標志CFROL:低位入高位,最高位移到最低位形成循環(huán),同時最高位移至CF。ROR:高位入低位,最低位移到最高位形成循環(huán),同時最低位移至CF。RCL:低位入高位,最高位移到CF,CF移至最低位形成循環(huán)。RCR:高位入低位,最低位移到CF,CF移至最高位形成循環(huán)。
指令格式:ROLRORRCLRCR
寄存器或內存單元
(8位或者16位),移位的位數(shù)注意:如果移動1位,指令直接給出;否則移位的位數(shù)必須放在CL中。例如:將DX和AX中32位數(shù)值作為一個整體左移一位SHLAX,1RCLDX,1無條件轉移指令JMP格式:JMP地址值或標號使程序的執(zhí)行轉入指令中規(guī)定的目標地址。轉移方式:1.段內直接轉移:偏移量由指令直接給出。
JMP0300H;偏移量IP由指令直接給出2.段內間接轉移:偏移量由寄存器或內存單元給出。
JMPCX;偏移量IP在寄存器CX中間接給出3.段間直接轉移:段地址和偏移量由指令直接給出。
JMP2000H:0500H;段地址CS和偏移量IP由指令直接給出4.段間間接轉移:段地址和偏移量由寄存器或內存單元給出JMPDWORDPTR[SI];段地址CS和偏移量IP在SI、SI+1
;SI+2、SI+3四個內存單元中。3.6控制轉移指令過程調用與返回指令子程序是完成特定功能的一段程序當主程序(調用程序)需要執(zhí)行這個功能時,采用CALL調用指令轉移到該子程序的起始處執(zhí)行當運行完子程序功能后,采用RET返回指令回到主程序繼續(xù)執(zhí)行
轉移指令有去無回子程序調用需要返回,其中利用堆棧保存返回地址1.子程序調用指令CALLCALL指令分成4種類型(類似JMP)CALLNEAR_PROC ;段內調用、直接尋址CALLR16/M16 ;段內調用、間接尋址CALLFAR_PROC ;段間調用、直接尋址CALLMEM32 ;段間調用、間接尋址CALL指令需要保存返回地址:段內調用——斷點偏移地址IP入棧SP←SP-2,SS:[SP]←IP段間調用——斷點偏移地址IP和段地址CS入棧SP←SP-2,SS:[SP]←CSSP←SP-2,SS:[SP]←IP2.子程序返回指令RET根據段內和段間、有無參數(shù),分成4種類型RET ;無參數(shù)段內返回RETi16 ;有參數(shù)段內返回RET ;無參數(shù)段間返回RETi16 ;有參數(shù)段間返回需要彈出CALL指令壓入堆棧的返回地址段內返回——斷點偏移地址IP出棧IP←SS:[SP],SP←SP+2段間返回——斷點偏移地址IP和段地址CS出棧IP←SS:[SP],SP←SP+2CS←SS:[SP],SP←SP+2條件轉移指令條件轉移指令根據某一個標志位的值作為判斷是否跳轉的依據,如果滿足條件則跳轉,否則不跳轉。注意:①條件轉移指令只能采用段內直接跳轉,只能使用8位的位移量,只能在本指令為中心的-128~127字節(jié)范圍內跳轉。②條件轉移指令相當一部分指令是比較2個數(shù)的大小后,根據比較(CMP指令)的結果決定是否跳轉。通常條件轉移指令緊跟在CMP指令后。無符號數(shù)之間用“高于”、“低于”和“等于”的概念,有符號數(shù)之間用“大于”、“小于”和“等于”的概念。無符號數(shù)等于ZF=1高于CF=0低于CF=1有符號數(shù)等于ZF=1大于SF=OF小于SF≠OF根據標志位根據比較結果JZ/JE零標志ZF為1則轉移(結果為0)JG大于則跳轉JNZ/JNE零標志ZF為0則轉移(結果不為0)JNG不大于則跳轉JS符號標志SF為1則跳轉JL小于則跳轉JNS符號標志SF為0則跳轉JNL不小于則跳轉JO溢出標志OF為1則跳轉JA高于則跳轉JNO溢出標志OF為0則跳轉JNA不高于則跳轉JC進位標志CF為1則跳轉JB低于則跳轉JNC進位標志CF為0則跳轉JNB不低于則跳轉例:寫出指令序列完成如下功能:比較AX、BX、CX中存放的無符號數(shù),將最大的數(shù)放在AX中。CMPAX,BX;比較AX和BXJNBNEXT1;不低于則跳轉
MOVAX,BX;否則將較大數(shù)送AXNEXT1:CMPAX,CX;比較AX和CXJNBNEXT2;不低于則跳轉MOVAX,CX;否則將較大數(shù)送AXNEXT2:INT20H;程序正常結束循環(huán)控制指令(1)LOOP指令
格式:LOOP地址值或者標號
LOOP指令在執(zhí)行時,先將CX的內容自動減1,判斷CX的值是否為0,不為0繼續(xù)循環(huán);否則退出循環(huán)。因此LOOP指令前一定有對寄存器CX賦初值的指令。(2)LOOPZ/LOOPE指令將CX減1,在CX≠0并且ZF=1時繼續(xù)循環(huán)。(3)LOOPNZ/LOOPNE指令將CX減1,在CX≠0并且ZF=0時繼續(xù)循環(huán)。
XORAX,AX;AX寄存器清零MOVCX,64H;送循環(huán)次數(shù)NEXT:ADDAX,CX;計算累加和LOOPNEXTMOV[200],AX;送結果INT20H;程序正常結束例如:計算1+2+……+100將和存放到DS:200的字單元利用DEBUG編寫指令序列計算5!并將和存放到數(shù)據段DS:400的字節(jié)單元。MOVSI,400;偏移地址送SIMOVCX,09;比較的次數(shù)送CXMOVAL,[SI];取第一個數(shù)送ALLABLE:INCSI;偏移量加1,指向下一個數(shù)
CMPAL,[SI];比較第N個數(shù)和第N+1個數(shù)
JNBNEXT;不低于則轉入NEXTMOVAL,[SI];否則將大數(shù)送ALNEXT:LOOPLABLE;繼續(xù)下一次比較,直到CX為0MOV[200],AL;最大數(shù)送DS:200單元
INT20H利用DEBUG編寫指令序列將DS:400開始的連續(xù)10個字節(jié)單元中存放的無符號數(shù)最大的送DS:200單元。中斷指令INT
8086有一個強有力的中斷系統(tǒng),最多可以調用256個不同功能的中斷處理子程序,256個中斷處理子程序對應中斷類型碼0~255(FF)。程序員可以通過中斷指令調用任何1個中斷處理子程序。中斷調用的指令格式為:INTn例:INT20H;程序正常退出
INT21H;DOS的系統(tǒng)功能調用溢出中斷調用的指令格式為:
INTO
這條指令的功能是檢查溢出標志OF,如果OF=1,則啟動中斷類型碼為4的中斷處理子程序,INTO相當于INT4。中斷返回的指令格式為:
IRET21H中斷是DOS的功能系統(tǒng)調用,它包含了從00H到57H共88個最常用的功能子程序。調用號功能入口參數(shù)出口參數(shù)01H鍵盤輸入字符AL=輸入字符02H顯示器顯示字符DL=輸出字符09H顯示字符串DS:DX=緩沖區(qū)首址0AH輸入字符串DS:DX=緩沖區(qū)首址2CH取時間CX和DX為時間4CH中止程序并返回21H中斷調用格式:(1)在指定寄存器中設置入口參數(shù);(2)將子程序編號送入AH寄存器;(3)執(zhí)行中斷指令:INT21H。例:02H號調用,作用是顯示字符,其調用方式是:1.
DL←要輸出顯示的ACSII字符代碼(入口參數(shù))2.
AH←02H(調用的子程序編號)3.
INT21H(中斷指令)調用21H中斷,顯示ACSII碼為01的符號
MOVDL,01
;將數(shù)值01h裝入DL寄存器(待顯示字符的ACSII碼)
MOVAH,02
;將數(shù)值02h裝入AH寄存器(調用的子程序編號)
INT21
;調用DOS21H中斷2號功能(顯示裝入DL的字符)MOVCX,100H;裝入循環(huán)次數(shù)MOVDL,0;裝入第一個ASCII碼NEXT:MOVAH,2INT21H;調用21H中斷的2號功能顯示字符
INCDL;將數(shù)據寄存器DL內的數(shù)值加1,裝入新碼LOOPNEXT;循環(huán)指令執(zhí)行一次,CX減1,直到CX為0.
INT20H;程序正常結束例:編寫指令序列顯示所有ASCII碼對應的字符調用21H中斷,從鍵盤輸入一個字符
MOVAH,01;將數(shù)值01h裝入AH寄存器(調用的子程序編號)
INT21;調用DOS21H中斷1號功能(從鍵盤接收字符)例:編寫一個指令序列,判別鍵盤上輸入的字符:若是回車字符(0DH),則結束程序,否則ASCII碼加1輸出。START:MOVAH,1INT21H;調用21H中斷的1號功能輸入字符CMPAL,0DH;和回車符比較JZDONE;若是回車,轉入DONEADDAL,1;否則,ASCII碼加1MOVDL,ALMOVAH,2INT21H;調用21H中斷的2號功能輸出字符JMPSTART;轉入START繼續(xù)接收新字符DONE:MOVAH,4CHINT21H;調用21H中斷的4號功能結束并返回3.7字符串操作指令8086的字符串操作的特點是:可以對字節(jié)串操作,也可以對字串操作所有的串操作指令的源操作數(shù)都假定在DS段中,偏移量由SI指出,目的操作數(shù)都假定在ES段中,偏移量由的DI指出,串操作指令是唯一一組源操作數(shù)和目的操作數(shù)都在內存的指令
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025園林景觀設計合同
- 2025年HED-系列厚膜陰極電泳涂料項目建議書
- 2025合同電纜橋架安裝規(guī)范
- 2025安置房的買賣合同
- 2025方案設計委托合同范本方案設計委托合同格式
- 2025職場英語口語熟練運用合同條款
- 2025年月桂醇聚醚磷酸鉀項目建議書
- 2025長期重大疾病保險合同示范文本
- 2025合同簽訂要點全面解析
- 2025版本的鐵路交通運輸合同示范文本
- 集體備課培訓講座
- 危廢處置方案
- 2025年全國會展策劃師崗位職業(yè)技能資格知識考試題庫與答案
- 貴州省考試院2025年4月高三年級適應性考試歷史試題及答案
- 兒童暴發(fā)性心肌炎診治專家建議(2025)解讀課件
- GB/T 320-2025工業(yè)用合成鹽酸
- 企業(yè)危險源辨識與風險評估降低風險措施清單
- 天鵝藝術漆施工方案
- 腦卒中患者口腔健康素養(yǎng)的研究進展
- 廣東省廣州市白云區(qū)2024-2025學年高三下學期2月統(tǒng)測英語試卷(含答案)
- 2025至2030年中國煤氣渣數(shù)據監(jiān)測研究報告
評論
0/150
提交評論