版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
數據傳送程式4.1數據的傳送4.1.1
MOV指令(傳送位元組或字)格式:MOV目的運算元,源運算元通用寄存器,記憶體,段寄存器,(CS除外),不能為立即數。通用寄存器,段寄存器,記憶體或立即運算元通用寄存器,段寄存器。記憶體或立即運算元MOV指令所能完成的功能:1.寄存器與寄存器間的數據傳送
注意:當源運算元是立即運算元時,目的運算元不能是段寄存器,目的運算元和源運算元不能同時為記憶體。注意:1.代碼段基址寄存器CS和指令指針IP不能作為目的運算元。
2.段寄存器間不能直接傳送。例如:MOV
AX,BXMOVDI,BXMOVAL,DHMOVDS,AX4.1數據的傳送4.1.1
MOV指令(傳送位元組或字)格式:MOV目的運算元,源運算元通用寄存器,段寄存器。記憶體或立即運算元MOV指令所能完成的功能:1.寄存器與寄存器間的數據傳送
MOV
AX,BX2.立即數送到通用寄存器即給AX,BX,CX,DX,
BP,SP,SI,DI賦值。例:MOV
AH,02H
MOV
SI,0
MOV
CX,5MOVAH,4CH4.1數據的傳送3.寄存器與記憶體之間的傳送。例:MOV
AL,DATA1
MOV
SI,[BX]
MOV
AX,S2[DI]
MOV[BX][SI],AX
MOV
AX,[BX+SI+4]4.立即數送到記憶體例:MOV
DATA1,34H
MOV
BYTEPTR[SI],00H4.1.2各種尋址方式編制數據塊傳送程式例4.1將以SS1為起始地址的30個字元依次傳送到同數據段的以SS2為起始地址的一塊記憶體區域中。方法一:數據塊是用DB定義的一個字串。DATASEGMENT SS1DB'1234567890ABCDEFGHIJKLMNOPQRST’SS2DB30DUP(?) DATAENDS CODESEGMENTASSUMECS:CODE,DS:DATA START:MOVAX,DATAMOVDS,AX LOOPNEXT;(CX)-1=>CX,若(CX)≠0,則轉NEXT,實際上本句與MOVCX,30共同完成了將LOOP與標號NEXT之間的指令迴圈執行30次的功能
MOVAH,4CHINT21HCODEENDSENDSTARTMOVSI,OFFSETSS1;SS1的位移量=>SI MOVDI,OFFSETSS2;SS2的位移量=>DI MOVAL,[SI] MOV[DI],AL INCSI;(SI)+1=>SI INCDI;(DI)+1=>DI MOVCX,30;迴圈次數30=>CX NEXT:方法二:用DB定義30個位元組的字元數據表的方法來定義的數據塊SS1.DATASEGMENTSS1DB’1’,’2’,’3',’4’,’5’,’6’,’7’,’8’,’9’,’0’,'A’,’B’,’,C’,’D’,’E’,’F’
DB’G’,’H’,’I’,’J’,’K’,’L’,’M’,’N’,’O’,’P’,’Q’,’R’,’S’,’T’SS2DB30DUP(?) DATAENDS
這種定義和方法一定義的存儲方式完全相同.採用變址尋址,用變址寄存器SI來尋址SS1和SS2。這裏SI是相對位移量,相當於高級語言數組的下標,可以用SS1[SI],SS2[SI]來訪問SS1、SS2中的各位元組。因此,SI的值應從0~29,每迴圈一次,SI加1。用CX寄存器控制迴圈30次。1:選定準備定位的圖示2:打開“修改”菜單下的“圖示”/“屬性”對話框3:在“設計”項定位:“位置”欄選定“在預定區域內”“可移動性”欄中選定“在預定區域內”點擊“起點”欄後再點擊對象/最後點擊“終點”欄後再點擊對象4:點擊“確定”退出CODESEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX MOVSI,0 MOVCX,30;迴圈次數30=>CX NEXT:MOVAL,SS1[SI] MOVSS2[SI],AL
INCSI;(SI)+1=>SI LOOPNEXT;(CX)-1=>CX,若(CX)≠0,則轉NEXT;
MOVAH,4CH
INT21H CODEENDS
ENDSTART
方法三:基址尋址DATASEGMENT
SS1DB'1234567890ABCDEFGHIJKLMNOPQRST‘
SS2DB30DUP(?)
DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATAMOVDS,AX MOVBX,OFFSETSS1;SS1的位移量=>SI
MOVCX,30 NEXT:MOVAL,[BX] MOV[BX+30],AL INCBX LOOPNEXT
方法四:基址+變址尋址
MOVSI,0
MOVBX,OFFSETSS1
MOVCX,30NEXT:MOVAL,[BX+SI]
MOV[BX+SI+30],AL
INCSI
LOOPNEXT
方法五:數據塊採用DW偽指令定義15個字的數據表,每次分配兩個字元
DATASEGMENT SS1 DW'21’,’43’,’65’,’87’,’09’,’BA’,’DC’,’FE’,DW’HG’,’JI’,’LK’,’NM’, ’PO’,’RQ’,’TS' SS2 DW15DUP(?) DATAENDS 方法五:數據塊採用DW偽指令定義15個字的數據表,每次分配兩個字元
MOVSI,0 MOVBX,OFFSETSS1
MOVCX,15;迴圈次數是15次 NEXT:MOVAX,[BX+SI] MOV[BX+SI+30],AX
INCSI;因為是對字(兩個位元組)操作,所以SI需加2INCSI
LOOPNEXT
4.2數據的輸入和輸出4.2.1常用DOS功能調用1、字元的輸入從鍵盤輸入一個字元的方法:發中斷21H來請求DOS的功能調用,將AH中送上功能調用號,鍵盤輸入一個字元的功能調用號是1。在程式中需要輸入一個字元的地方寫上指令:
MOVAH,01HINT21H鍵入的數據都是一個字元的ASCII碼。假如你按數字鍵4,則在AL裏得到的不是數值而是字元4的ASCII碼34H。2、字元的輸出
顯示一個字元的功能調用號為02H,發21H類中斷,就會在螢幕上的當前位置顯示寄存器DL中的一個字元。因此,事先必須將要顯示的字元的ASCII碼送入DL。例如:要想顯示輸出字元‘B’,需要寫指令:
MOVDL,’B’MOVAH,02HINT21H要想顯示輸出5,則需要寫指令:MOVDL,35H;DL裏存放要輸出字元‘5’的ASCII碼
MOVAH,02HINT21H3、字串的輸出要想輸出一個字串,可以採用中斷21H的09H號功能調用。調用方式:
MOVAH,09HINT21H要求:字串必須是以‘$’字元結尾的字串,在調用之前,應將DS:DX指向記憶體中以‘$’字元結尾的字串。
4.2.2程式舉例
例4.2將一字串‘HOWAREYOU?’輸出。DATASEGMENTBUFDB‘HOWAREYOU?$’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSETBUF
MOVAH,09HINT21H
MOVAH,4CHINT21HCODEENDSENDSTART執行完畢,則輸出字串“HOWAREYOU?”
例4.3從鍵盤上鍵入20個字元,然後與鍵入字元的先後相同的順序顯示出來。分析:從鍵盤上輸入的字元,分配了一個20個位元組的記憶體緩衝區,假設這個緩衝區的起始地址名為STR。我們將從鍵盤上輸入的字元依次存放在這片記憶體裏,然後再從第一個字元開始,依次把它們顯示出來。DATASEGMENTSTRDB20DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETSTRMOVCX,20NEXT1:MOVAH,01HINT21HMOV[SI],ALINCSILOOPNEXT1
MOVDL,0DH;輸出回車
MOVAH,02HINT21HMOVDL,0AH;輸出換行
MOVAH,02HINT21H
MOVSI,OFFSETSTRMOVCX,20NEXT2:MOVDL,[SI]MOVAH,02HINT21HINCSILOOPNEXT2MOVAH,4CHINT21HCODEENDSENDSTART例4.4將LI4_3稍作改動,變為與鍵入字元的先後相反的順序顯示出來。又如何來編寫程式呢?分析:我們還是採用一個20個位元組的記憶體緩衝區存放從鍵盤上輸入的字元。將從鍵盤上輸入的字元依次存放在這片記憶體裏,然後再從最後一個字元開始,依次把它們顯示出來。只要把輸出部分改為:
MOVSI,OFFSETSTR+20-1;最後一個字元
MOVCX,20;的偏移地址送SINEXT2:MOVDL,[SI]MOVAH,02HINT21HDECSI;從後向前輸出,所以SI減1LOOPNEXT24.3堆疊4.3.1堆疊的定義及操作指令1、堆疊的基本概念堆疊是一組暫存單元,處理機可以向其中存入或取出資訊。堆疊可以由寄存器或是記憶體存儲單元構成。硬堆疊:由寄存器構成的堆疊叫做硬堆疊(或級聯隊棧)。軟堆疊:由記憶體存儲單元構成的堆疊叫做軟堆疊(或記憶體堆疊)。堆疊的特點是:先進後出,後進先出。記憶體堆疊:就是在內存中開闢一段存儲區域,它可以通過PUSH指令將數據壓入棧中,
或是通過POP指令將數據彈出,也可以用任何訪問記憶體的指令去訪問棧中的數據。堆疊指針SP:用來指示記憶體堆疊的棧頂。它始終指向堆疊的棧頂數據元素。2、堆疊的操作指令PUSH進棧指令格式:PUSH源運算元執行操作:首先將堆疊指針減2,即(SP)-2=>SP,然後將源運算元=>(SP)+1,SP。記憶體運算元、寄存器、段寄存器、且必須是字例如:PUSHAX;(SP)-2=>SP,(AX)=>(SP)+1,SP。PUSHCS;將段寄存器CS的值壓入堆疊PUSHBETA;將BETA存儲字的內容壓入堆疊PUSH[SI];將[SI]指向的存儲單元的字壓入堆疊例如:AX=1234HPUSHAX執行情況如右圖:POP出棧指令格式:POP目的運算元例如:恢復上面程式段保存的寄存器、記憶體的程式段為:POP[SI];將棧頂元素(字)彈出至[SI]指向的存儲單元POPBETA;將棧頂元素(字)彈出至BETA指向的存儲單元執行操作:首先將棧頂的字送入目的運算元,然後堆疊指針加2,即(SP)+2=>SP。其中,目的運算元可以為記憶體運算元、寄存器、段寄存器,但不能是CS。POPB;因為POPCS非法,所以把原來CS的值送入一個存儲單元B中POPAX;將棧頂元素(字)彈出至AXPUSH和POP指令都不影響狀態標誌。例如:POPAX指令執行情況如圖所示:4.3.2用堆疊存儲數據實例例4.5我們用堆疊來實現例4.4從鍵盤上鍵入20個字元,然後與鍵入字元的先後相反的順序顯示出來。分析:因為堆疊的特點實後進先出,我們可以利用堆疊作為輸入緩衝區,輸入字元,壓入堆疊,直至輸入完畢。然後再依次從棧頂將數據彈出輸出,就完成了數據的反序輸出。MYSTACKSEGMENTSTACK
DW30DUP(?)
STACK_TOPLABELWORDMYSTACKENDSCODESEGMENT
ASSUMECS:CODE,SS:MYSTACKSTART:MOVAX,MYSTACK
MOVSS,AXMOVSP,OFFSETSTACK_TOPMOVCX,20IN_S:MOVAH,01H
INT21HPUSHAXLOOPIN_S
MOVDL,0DH;輸出回車
MOVAH,02HINT21HMOVDL,0AH;輸出換行
MOVAH,02HINT21H
MOVCX,20OUT_S:POPDXMOVAH,02HINT21HLOOPOUT_S
MOVAH,4CHINT21HCODEENDSENDSTART4.4換碼程式
4.4.1XLAT指令格式:XLAT換碼表或XLAT功能:[(BX)+(AL)]=>AL;即是用換碼表中一個位元組的內容置換AL寄存器的內容。要求:在此指令之前,BX寄存器中存放換碼表的起始地址,AL的內容為要換碼的位元組在換碼表中的下標。即是以[BX]為起點的換碼表中,以(AL)為相對位移,取一位元組裝入AL。例如:設(BX)=0040H,(AL)=03H,(DS)=170AH如果所記憶體中建立的表換碼表如下圖所示:執行指令XLAT則把[(BX)+(AL)]的內容即把實際地址為170A0+0040+0003H=170E3H的內容送入AL寄存器,所以指令執行後,(AL)=34H,即指令把AL中的代碼替換為34H。4.4.2換碼程式舉例例4.6利用XLAT指令將二進位描述的十六進制數字轉換成ASCII碼顯示出來。TABLESEGMENTTAB_DADB'01234567890ABCDEF'TAB_HEXDB0,1,2,3,4,5,6,7,8,9,0AH,0BH,DB0CH,0DH,0EH,0FHTABLEENDSCODESEGMENTASSUMECS:CODE,DS:TABLESTART:MOVAX,TABLEMOVDS,AXMOVCX,16MOVBX,OFFSETTAB_DAMOVSI,OFFSETTAB_HEXNEXT:MOVAL,[SI]XLATTAB_DAMOVDL,ALMOVAH,02HINT21HINCSILOOPNEXTMOVAH,4CHINT21HCODEENDS4.5其他傳送指令
1、XCHG交換指令(exchange)
格式:XCHG目的運算元,源運算元功能:目的運算元
源運算元該指令的兩個運算元必須有一個在寄存器中,不允許使用段寄存器,允許字或位元組操作。該指令可用除立即數外的任何尋址方式,且不影響標誌位。
例如:XCHGBX,[BP+SI]例如:XCHGBX,AX;BX、AX內容互換2、地址傳送指令LEA(loadeffectiveaddress)有效地址送寄存器LDS(loadDSwithpointer)指針送寄存器和DSLES(loadESwithpointer)指針送寄存器和ES這一組指令完成把地址送到指定寄存器的功能。1)LEA有效地址送寄存器指令(loadeffectiveaddress)格式:LEA寄存器,源運算元功能:指令把源運算元的有效地址送到指定的寄存器中目的運算元可用16位寄存器(AX,BX,CX,DX,SP,BP,SI,DI之一)但不能使用段寄存器。源運算元可使用除立即數和寄存器外的任一種記憶體尋址方式。不影響標誌位。例如:LEABX,VAR1;把變數VAR1的有效地址送給寄存器BXLEABX,[BX+SI+0004H];如果指令執行前(BX)=0400H,(SI)=003CH,則指令之行後(BX)=0400+003C+0004H=0480H注意:在這裏BX寄存器得到的是有效地址而不是該存儲單元的內容。如果指令為:
MOVBX,[BX+SI+0004H]
則BX中得到的是偏移地址為0480H單元的內容而不是其偏移地址。2)LDS(loadDSwithpointer)指針送寄存器和DS格式:LDS寄存器,源運算元功能:將雙字長源運算元的低地址中的字(變數或標號在它所在段的位移量)傳送給目的寄存器;將雙字長源運算元的高地址中的字(變量或標號所在段的基址)傳送至DS寄存器。目的運算元寄存器為16位的通用寄存器之一,源運算元是雙字長存儲器指針。例如:數據的定義為
ADB‘K’BDDA若寫指令:LDSBX,B;將A的位移量=>BX
;將A所在段基址=>DSMOVAL,[BX];將’K’送至AL3)LES(loadESwithpointer)指針送寄存器和ES
把雙字指針中的段基址傳送值ES段寄存器,不是
DS段寄存器外,其他與LDS指令完全相同。3、標誌寄存器傳送指令LAHF(1oadAHwithflags)標誌送
AHSAHF(storeAHintoflags)AH送標誌寄存器PUSHF(Pushtheflags)標誌進棧POPF(poptheflags)標誌出棧1)LAHF指令(狀態標誌位元組送AH)格式:LAHF
功能:將標誌寄存器FLAGS低位位元組送AH寄存器。1514131211109876543210OFDFIFTFSFZFAFPFCF2)SAHF指令(將AH存入狀態標誌寄存器)格式:SAHF
功能:AH的內容送至標誌寄存器(即與LAHF
指令傳送方向相反)。3)PUSHF指令(將標誌寄存器推人堆疊)格式:PUSHF
功能:先將堆疊指針減2(即(SP)-2=>SP),然後將整個標誌寄存器(16位)壓入SP
所指向的棧頂。1514131211109876543210OFDFIFTFSFZFAFPFCF4)POPF指令(標誌退棧)格式:POPF功能:先將堆疊頂的內容,即((SP)+1,(SP))傳送至標誌寄存器(16位)。然後將堆疊指針SP加2,即(SP)+2=>SP.4、輸入/輸出指令輸入指令IN(輸入位元組或字)輸出指令OUT(輸出位元組或字)
IN累加器,端口
OUT端口,累加器輸入指令將端口內容輸入到AL(位元組)或AX(字),端口地址在64KI/O空間之間(0000H-FFFFH),
若端口地址在0000H-00FFH之間,則可使用直接尋址或間接尋址,否則只能用間接尋址,例如:
IN
AX,
21H
MOV
DX,210H
IN
AL,
DX輸出指令將AX中的16位數據或AL中的8位數據輸出到輸出端口,端口地址在00000H-FFFFH範圍內,尋址方式的規定同輸入指令,例如:
MOVDX,61H
OUTDX,AX
OUT22H,AL
算術邏輯運算程式5.1帶符號和無符號二進位數加減運算5.1.1加減運算指令1、ADD指令(位元組或字相加)格式:ADD目的運算元,源運算元功能:將目的運算元加上源運算元,和送至目的運算元。注意:目:寄存器、記憶體運算元。源:寄存器、記憶體運算元和立即數。二者類型要一致,即同時為字,或同時為位元組。但不能同時為記憶體運算元。
影響狀態標誌:AF、CF、OF、PF、SF、ZF1)寄存器----寄存器例:ADDAX,BX;(AX)+(BX)=>AXADDCX,DXADDBX,DI2)記憶體----寄存器
例:ADDCX,A;A用DW定義
ADDAX,BETA[SI];BETA用DW定義
ADDBX,[BX][SI]3)寄存器----記憶體
例:ADDA,CX;A用DW定義
ADDBETA[SI],AX4)立即數累加到寄存器/記憶體
例:ADDAL,3ADDAX,356ADDCX,100ADDBETA[SI],34狀態標誌位:ZF:當運算結果為0時,置1。SF:結果為負時,置1。CF:執行加法指令時,CF是根據最高有效位是否有向高位進位設置的。有進位時CF置1OF:據運算元的符號及其變化情況來定,若兩操作數符號相同而結果符號與之相反時,OF=1。也既是如果結果溢出,則OF置1。
ADDDX,0F0F0H(DX)=4652H則:0100011001010010+111100001111000010011011101000010(DX)=3742H,ZF=0,SF=0,CF=1,OF=0OFOV/NV1/0有/無DFDN/UP減/增IFEI/DI開/關SFNG/PL負/正ZFZR/NZ0/非0AFAC/NA有/無PFPE/PO偶/奇CFCY/NC有/無格式:同ADD
功能:源運算元加目的運算元再加進位標誌CF的和送至目的運算元。即:如果進位標誌位被置位則兩個運算元相加的結果在存入目的運算元之前再加1,否則,再加0。影響狀態標誌位:AF,CF,OF,PF,SF,ZF。ADD和ADC指令既適用於無符號二進位數也適用於有符號的。但它們的兩個運算元必須同時為字節(8位)或字(16位)。2、ADC指令(帶進位的加法指令)addwithcarry3、INC指令(位元組或字加1)increment格式:INC目的運算元功能:目的運算元加1後送至目的運算元。例:INCCXINCA;A為變數名INCWORDPTR[SI];注意INC[SI]是錯的。注意:目的運算元可以為通用寄存器,也可以記憶體,但不能是立即數。本指令主要用在迴圈程式中修改地址指針和迴圈次數等。指令執行結果影響AF,OF,PF,SF,ZF。但不影響CF。4、SUB指令(位元組或字相減)subtract格式:SUB目的運算元,源運算元功能:目的運算元減源運算元,結果送目的運算元。影響狀態標誌位:AF,CF,OF,PF,SF,ZF。5、SBB指令(帶借位的減法指令)subtractwithborrow格式:SBB目的運算元,源運算元功能:目的運算元減源運算元,再減去進位標誌CF的值,結果送目的運算元。影響AF,CF,OF,PF,SF,ZF.本指令主要用於多位元組運算元相減。在行減法運算時(SUB或SBB)若有高位的借位就置CF為1;例:MOVAL,64HMOVBL,03HSBBAL,BL;AL-BL-CF=>AL,若CF=1,則AL結果為60H6、DEC指令(位元組或字相減)decrement格式:DEC目的運算元功能:將目的運算元的值減1,在將結果送回目的運算元。注意:運算元不能是立即數,在相減時把運算元作為一個無符號二進位數來對待。影響:AF,OF,PF,SF,ZF,但不影響CF。7、NEG指令(求補)negate格式:NEG目的運算元功能:使目的運算元的符號變反,即0減去目的運算元後送目的運算元,例+1變為-1。影響AF,CF,OF,PF,SF,ZF。但注意若運算元為0,指令執行後CF置0,否則置1。5.1.2程式舉例例:5.1計算356+789和0B4H-25HDATASEGMENTADW356BDW789CDW?DDB0B4HEDB25HFDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
MOVAX,AADDAX,BMOVC,AXMOVAL,DSUBAL,EMOVF,ALMOVAH,4CHINT21HCODEENDSENDSTART例5.2多位元組二進位加法,求兩個無符號的六位元組十六進制數的加法運算。
A03487EA6B14H+78659D4789FCH筆算:A03487EA6B14H+78659D4789FCH-------------------------------------------------------1189A2531F510H因為電腦中無如此大的寄存器,所以把其分解成8位或16位的數據從最低有效位開始,連續的進行反復加法運算。第一步第六步FIRSTDB14H,6BH,0EAH,87H,34H,0A0H,00HSECONDDB0FCH,89H,47H,9DH,65H,78H:
L1:MOVAL,SECOND[SI]ADCFIRST[SI],ALINCSILOOPL1MOVCX,6CLC;CF<=0MOVAL,0ADCAL,0MOVFIRST[SI],ALMOVSI,0為了不單獨處理進位,可用增加一次迴圈加法來解決,如下:
FIRSTDB14H,6BH,0EAH,87H,34H,0A0H,00HAECONDDB0FCH,89H,47H,9DH,65H,78H,00H:MOVCX,7MOVSI,0CLC;0=>CFL1:MOVAL,SECOND[SI]ADCFIRST[SI],ALINCSILOOPL1:5.2帶符號和無符號二進位數乘除法運算5.2.1乘除運算指令1、MUL無符號二進位數相乘unsignedmultiple格式:MUL源運算元目的運算元隱含為AL(位元組乘)或AX(字乘)。源運算元可以為寄存器也可以記憶體。8086/8088規定:如果源運算元為8位無符號數,則AL中的8位無符號數與源運算元相乘,得到16位乘積送至AX;如果源運算元為16位無符號數,則AX中的16位無符號數與源運算元相乘,得到32位乘積放在DX,AX中,乘積的高16位送至寄存器DX,低16位送至AX。如下頁圖:AL源運算元*AHAL(8位)(8位)(16位)AX源運算元AXDX*(16位)(16位)(32位)乘法運算的情形影響標誌:OF,CF。如果乘積的高一半是0,則CF,OF都置0,否則CF和OF均為1。2、IMUL帶符號二進位數相乘signedmultiple格式:IMUL源運算元功能:執行的操作與MUL相同,但這裏的運算元被看作是帶符號數。影響標誌:OF,CF。
如果乘積的高一半是低一半的符號擴展,則CF,OF都置0,否則CF和OF均為1。例:(AL)=0A4H,(BL)=0AH那麼求執行指令MULBL和IMULBL後的乘積值。(AL)=0A4H為無符號數的164D,帶符號的-92D(BL)=0AH為無符號數的10D,帶符號的10D
則執行MULBL和IMULBL後的結果分別為(AX)=0668H=1640d,CF=OF=1(AX)=0FC68H=-920D,CF=OF=13、DIV指令(無符號的位元組或字除法)unsigneddivide格式:DIV源運算元功能:將累加器及其擴展寄存器中的雙倍長度的無符號的被除數除以源運算元中的無符號除數。對於8位除數的除法運算,被除數在AH和AL中,對於16位除數的除法運算,被除數在DX和AX中。運算後將單倍長度的商送回累加器AL或AX,將單倍長度的餘數送到擴展器AH或DX。
如下頁圖:如果除法指令產生的結果(商的值)超出了保存它的目的寄存器的範圍,溢出並置OF為1,產生溢出中斷。8位AHALAHAL商餘數除數被除數DXAXAXDX16位商餘數除數被除數4、IDIV指令(帶符號的位元組或字除法)signeddivide
規定餘數和被除數的符號相同。因此使得商和餘數是唯一的。例:設(AX)=0400H,(BL)=09DH
即(AX)為無符號數的1024D,帶符號數的+1024D(BL)為無符號數的157D,帶符號數的-99D
執行DIVBL的結果是:(AH)=52H=82D餘數(AL)=06H=6D商執行IDIVBL的結果是:(AH)=22H=34D餘數(AL)=0F6H=-10D商5、CBW和CWDconvertbytetoword,convertwordtodoubleword格式:CBWCWD功能:進行帶符號的8位除法時,需要將AL裏的符號位擴展至AH裏,CBW將AL裏的8位帶符號數擴展為16位數即將AH裏擴展為AL的符號位。
CWD有時將AX中的符號位擴展到DX中去。例:設(AX)=0400H,(BL)=OFDH即(AX)為帶符號數的1024D,(BL)為帶符號數的-3D。
執行IDIVBL結果溢出,因此採用字除:
MOVAX,0400HCWD;將被除數符號擴展到DX中MOVBX,0FFFDH;將除數的符號位也擴展成為一個字IDIVBX;結束後,(AX)=OFEABH=-341D(DX)=0001H5.2.2程式舉例例5.3:將16位無符號二進位數用除10取餘法化為十進位數,並輸出結果。分析:假設無符號二進位數為11001000,即是十進位數的456。考慮16位數以10商仍可能是16位,即有可能AL裏放不下商而溢出,所以採用32位除以16位的除法動算:將被除數放在AX寄存器裏,DX清零。除數10放在BX寄存器裏,除完後的餘數即是想要的十進位數字,保存起來,商如果不為0,繼續除。我們將無符號二進位數用變數NUM存放,將除之後得到的十進位數字用D_NUM存放,則程式如下:DATASEGMENTD_NUMDB6_DUP(?);存放除完後得到的10進制數字NUMDW0000000011001000B;要轉換的無符號DATAENDS二進位數。CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
MOVBX,10;除數10MOVSI,OFFSETD_NUMMOVAX,NUM;存放被除數L1:MOVDX,0DIVBXMOV[SI],DL;將存放在DL中的有效十INCSI進制數字送至D_NUM。CMPAX,0JEL2JMPL1L2:MOVCX,SI;將十進位數字的個數送CXOUT_L:DECSIMOVDL,[SI]ORDL,30HMOVAH,02HINT21HLOOPOUT_LMOVAH,4CHINT21HCODEENDSENDSTART5.3十進位數算術運算5.3.1壓縮的BCD碼調整指令1、DAA加法的十進位調整decimaladjustforaddition格式:DAA功能:用在ADD或ADC指令之後,對兩個BCD碼數相加後的結果(在AL中)進行調整,使之成為正確的非壓縮BCD碼結果。影響狀態標誌位:AF,CF,PF,SF,ZF,不影響OF。例:求89+48=?用壓縮BCD碼實現。則實現的程式段為:MOVAL,89HMOVBL,48HADDAL,BL;此指令執行完後(AL)=0D1H,CF=0DAA;指令執行完後(AL)=37H,且CF=12、DAS減法的十進位調整decimaladjustforsubtraction格式:DAS功能:與DAA相似,只是對減法進行調整,使之成為正確的壓縮BCD碼結果。5.3.2壓縮型BCD碼加法舉例:例:計算:56743829+95744856=?用壓縮BCD碼存儲計算分析:用壓縮型BCD碼存儲計算,每兩位占一個位元組採用低位存放低地址位元組。實現兩個多位元組BCD碼相加,和多位元組二進位數的加法類似,從低位元組開如加,每次加完用DAA調整。程式如下:DATASEGMENTNUM1DB29H,38H,74H,56H,00HNUM2DB56H,48H,74H,95H,00HDATAENDSADD_BCDSEGMENTASSUMECS:ADD_BCD,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAH,4CHINT21HADD_BCDENDSENDSTART插入處理程式MOVCX,5MOVSI,0CLC;由於用的是ADC指令,必須事先;將CF清零,才保證結果正確。L1:MOVAL,NUM2[SI]ADCAL,NUM1[SI]DAA
MOVNUM1[SI],ALINCSILOOPL1(結果並未輸出)5.3.3非壓縮型BCD碼(ASCII碼)的加法調整指令1、AAA加法的ASCII碼調整ASCIIadjustforaddition格式:AAS功能:與AAA相似,只是對減法進行調整,使之成為正確的非壓縮BCD碼結果。格式:AAA功能:在ADD指令後,對兩個非壓縮BCD碼相加後存
放於AL中的和進行調整,以獲得正確的非壓縮BCD碼結果。注意:只要低四位大於9,CF就置1,即記錄進位。2、AAS減法的ASCII碼調整ASCIIadjustforsubtraction
3、AAM乗法的ASCII碼調整ASCIIadjustformultiplication格式:AAM功能:用在8位無符號二進位乘法MUL指令後。對兩個非壓縮型BCD碼相乘後存放於AX中的乘積進行調整,以得到正確的BCD碼乘積。例:MOVAL,07HMOVBL,05H
MULBL;此指令執行完後(AX)=35D=0000000000100011B=0023HAAM;此指令執行完後(AX)=0000001100000101B=0305H4、AAD除法的ASCII碼調整ASCIIadjustfordivision格式:AAD功能:用在除法指令之前,將AX中的兩位非壓縮碼轉換成真正的二進位數。例如:計算34/5
MOVAX,0304H;AX中存放34D的非壓縮BCD碼
ADD;將AX的內容調整為0000000000100010B即0022H
MOVBL,05H
DIVBL;除完後,餘數(AH)=04H,商(AL)=06H5.3.4非壓縮型BCD碼程式舉例例5.4.2計算56743829+95744856=?用非壓縮型BCD碼存儲計算,並輸出。分析:因為用非壓縮型BCD碼計算,所以採用從低到高的存儲方法。存儲方式或為以下幾種:1、NUM1DB09H,02H,。。05H,00H2、NUM1DB9,2,8,3,4,7,6,5,03、NUM1DB‘928347650’實現程式如下:DATASEGMENTNUM1DB‘928347650’NUM2DB‘658447590’DATAENDSASC_ADDSEGMENTASSUMECS:ASC_ADD,DS:DATASTART:MOVAX,DATAMOVDS,AX
MOVSI,OFFSETNUM1MOVDI,OFFSETNUM2MOVCX,9CLCL1:MOVAL,[SI]ADCAL,[DI]AAALAHF;因為下一條指令OR將改變標誌CF的值,;所以要先將狀態標誌保存至AHORAL,30H;將結果拼成ASCII碼SAHF;恢復狀態標誌寄存器的值,即將保存在AH;中的標誌送標誌寄存器MOV[DI],AL;(AL)=>[DI]INCSIINCDILOOPL1;CX-1=>CX,CX=0?如果不等,繼續迴圈MOVCX,9CLCL1:MOVAL,[SI]ADCAL,[DI]AAA
;下麵完成計算結果從高位到低位的輸出MOVAH,02HMOVCX,9DECDIL2:MOVDL,[DI]INT21HDECDILOOPL2MOVAH,4CHINT21HASC_ADDENDSENDSTART5.4邏輯運算程式5.4.1邏輯指令AND邏輯與OR邏輯或NOT邏輯非XOR異或TEST測試邏輯運算可對字或位元組運算,並且是按位操作,所以,其運算元應該是位串而不是數。1、AND邏輯與指令
格式:ANDDST,SRC
執行的操作:(DST)<=(DST)^(SRC)2、OR邏輯或指令
格式:ORDST,SRC
執行的操作:(DST)<=(DST)(SRC)4、XOR異或指令
格式:XORDST,SRC
執行的操作:(DST)<=(DST)+(SRC)3、NOT邏輯非指令
格式:NOTOPR
執行的操作:(OPR)<=(OPR)5、TEST測試指令
格式:TESTOPR1,OPR2
執行的操作:(OPR1)^(OPR2)注意:在以上五種指令中,NOT不能使立即數,其他四條除非運算元是立即數,至少有一個運算元必須放在寄存器中另一個操作數則可以使用任意尋址方式。它們對標誌位的影響是NOT指令不影響標誌位,其他4種將使CF位和OF位為0,AF位無定義,而SF,ZF位和PF位則根據運算結果設置。5.4.2移位指令SHL(shiftlogicalleft)邏輯左移SAL(shiftarithmeticleft)算術左移SHR(shiftlogicalright)邏輯右移SAR(Shiftarithmeticright)算術右移ROL(rotateleft)迴圈左移ROR(rotateright)迴圈右移RCL(rotateleftthroughcarry)帶進位迴圈左移RCR(rotaterightthroughcarry)帶進位迴圈右移下麵分三組來說明這十條指令:1、移位指令①SHL邏輯左移指令格式:SHL目的運算元,CNT執行的操作如下圖所示:其中目的運算元用除立即數外的任何尋址方式,移位次數由CNT決定,在8086中它可以是1或CL,CNT為1時只移一位,如果需要移位的次數大於1,則可以在該移位指令前把移位次數置於CL寄存器中,而移位指令中的CNT寫為CL即可。SAL算術左移指令格式:SAL目的運算元,CNT執行的操作與SHL相同。③SHR邏輯右移指令格式:SHR目的運算元,CNT執行的操作如圖5.4所示。④SAR邏輯右移指令格式:SAR目的運算元,CNT執行的操作如圖5.5所示。5.4.3程式舉例
例5.5從鍵盤讀入一個十進位數,設此數以“;”為結束,且小於一個字大小,將其轉化成它所代表的二進位數據。分析:(1)從鍵盤讀入的是ASCII碼,首先轉換成對應的十進位數字(2)按照習慣,從高位輸入,只需將先輸入的數*10,加上現在輸入的數即可。DATASEGMENTBUFDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX::END_L:MOVAH,4CHINT21HCODEENDSENDSTART
MOVBUF,0IN_L:MOVAH,01HINT21HCMPAL,’;’JEEND_LANDAL,0FHSALBUF,1MOVBX,BUFSALBUF,1SALBUF,1ADDBUF,BXMOVAH,0ADDBUF,AXJMPIN_L例5.6從鍵盤上輸入一個十進位數(設有偶數個數字位),以壓縮型BCD碼的方式存入記憶體緩衝區。分析:1)首先將鍵入的數字字元以ASCII碼的方式存入內存緩衝區。2)將ASCII碼轉換為壓縮型BCD碼程式如下:DATASEGMENTASC_NUMDB30DUP(?)BCD_NUMDB20DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETASC_NUM;輸入並將ASCII碼存儲到ASC_NUM中
MOVCX,0;CX用於記錄輸入字元的個數IN_ASC:MOVAH,01HINT21HCMPAL,0DH;和回車比較,如果相等,轉L2JEL2MOV[SI],ALINCSIINCCXJMPIN_ASC
L2:SHRCX,1
;壓縮型BCD碼所占位元組數為字元個數/2L3:MOVSI,OFFSETASC_NUMMOVDI,OFFSETBCD_NUMLOOPER:MOVDL,[SI]SHLDL,1SHLDL,1SHLDL,1SHLDL,1MOVAL,[SI+1]ANDAL,0FHORDL,ALMOV[DI],DLINCSIINCSIINCDILOOPLOOPER
MOVAH,4CHINT21HCODEENDSENDSTART例5.7壓縮型BCD碼的輸出,設壓縮型BCD碼的存放是高位位元組存放在高地址,低位位元組存放在低地址,輸出時按照習慣從高位到低位輸出。分析:一個位元組裏存放了兩位十進位數字,因此需要將其分離出來,分離方法:先輸出高位,將存放在DL裏的壓縮型BCD碼右移四位,再拼成ASCII碼輸出即可,然後再將低位拼成ASCII碼,輸出。
程式如下:
DATASEGMENT
BCD_NUMDB34H,56H,78H,94H
COUNTEQU$-OFFSETBCD_NUM
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETBCD_NUM+3
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
MOVCX,COUNTL1:MOVDL,[SI]MOVBX,CX;下麵用到CX,先將CX保存起來
MOVCX,4SHRDL,CL;將存在DL裏的壓縮型BCD碼右移4位
ORDL,30HMOVAH,02HINT21H;輸出高位
MOVDL,[SI]ANDDL,0FHORDL,30HMOVAH,02H
INT21H;输出低位
DECSIMOVCX,BX;恢復CX的值
LOOPL1
迴圈與分支程式設計**6.1迴圈程式設計JCXZ:當CX為0時跳轉的條件轉移指令;LOOP:使CX的值遞減並且產生一個無條件跳轉的迴圈指令;LOOPE/LOOPZ,LOOPNE/LOOPNZ
條件迴圈迭代控制指令,根據零狀態標誌位的狀態,決定是否繼續進行迴圈操作。迴圈控制指令可用來控制迴圈。它們用CX寄存器作為計數器,來控制迴圈次數。並且都是短距離轉移指令。
*1、LOOP指令(執行迴圈直到計數為0)格式:LOOP短距離標號例如:L1:…..┆
LOOPL1功能:CX-1=>CX,若CX不為0,則將控制轉移到目標運算元(指定標號處);否則順序執行LOOP指令之後的指令。程式舉例例6.l一組數求和,假設有20個16位二進位數,要對這20個數求和(假設和值<65536)程式如下:*DATASEGMENTARRY DW123CH,3DH,100H,90H,345H,12H,DW0A5H,4BH,89H DW87H,234H,64H,35H,20H,21H,50H,DW88H,92H,11H,0FFHDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATAMOVDS,AX
**MOVCX,20MOVSI,0MOVAX,0NEXT: ADDAX,ARRY[SI]INCSIINCSILOOPNEXTMOVAH,4CHINT21HCODEENDSENDSTART**2、LOOPE/LOOPZ(如果相等/如果為0則迴圈)格式:LOOPE/LOOPZ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年渣男战术测试题及答案
- 2026年逻辑电平测试题及答案
- 2026年望洞庭刘禹锡测试题及答案
- 2026年面试搞心理测试题及答案
- 2026年工商外勤会计测试题及答案
- 2026年《时间管理》测试题及答案
- 2026年孤独症教育测试题及答案
- 2026年给老板的测试题及答案
- Abaqus之岩土专题讲座
- 某纺织厂原材料储存办法
- 种猪引种隔离管理制度
- JG/T 194-2018住宅厨房和卫生间排烟(气)道制品
- 慢性病的居家护理
- 工地消防安全知识培训
- 贷款培训课件下载
- 船舶检验工作整改方案
- 竞聘护理部副主任
- 高中部编版教材 必修上册 必背篇目
- 城区初中教师选调考试初中数学试题
- 有机化学课件
- JC-T 896-2002 玻璃纤维短切原丝
评论
0/150
提交评论