




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、14.1 4.1 測試和控制指令測試和控制指令 4.2 4.2 選擇結構程序選擇結構程序4.3 4.3 循環結構程序循環結構程序2指令指令 3指令指令 2順序結構順序結構 入口入口指令指令 1 出口出口分支結構分支結構入口入口滿足滿足條件條件? 分支分支 1 出口出口YN 分支分支 2循環結構循環結構入口入口 指令指令 修改條件修改條件條件滿足否?條件滿足否?Y 出口出口N結構化程序設計的結構化程序設計的“基本結構基本結構”3IPCSn指令存放在內存中指令存放在內存中,處理器從內存取指令分析執行處理器從內存取指令分析執行n處理器用處理器用CS:IP計算下一條要執行的指令在內存的物理地址計算下一
2、條要執行的指令在內存的物理地址 PA=CS*16+IPn指令一般是從前到后順序執行的指令一般是從前到后順序執行的CPU執行當前指令時,執行當前指令時,IP被更改為被更改為下一條指令下一條指令的地址的地址CS和和IP不能用不能用MOV等傳送指令直接修改等傳送指令直接修改nCPU通過執行通過執行轉移控制類指令轉移控制類指令改變它們的值,從而改變指令改變它們的值,從而改變指令的順序執行。的順序執行。回顧:回顧:8086/8088CPU專用寄存器專用寄存器下一條指令的段地址下一條指令的段地址下一條指令的偏移地址下一條指令的偏移地址44.1.1 4.1.1 無條件轉移指令無條件轉移指令4.1.2 4.1
3、.2 比較和測試指令比較和測試指令 4.1.3 4.1.3 條件轉移指令條件轉移指令 54.1.1 無條件轉移指令無條件轉移指令n轉到轉到label指定的目標地址處,執行那里的指令指定的目標地址處,執行那里的指令n目的地址目的地址label的位置有的位置有2種情形:種情形:n和和JMP指令在同一個段,叫做指令在同一個段,叫做段內轉移,段內轉移,轉移時轉移時 CPU只只改變改變IP;n和和JMP指令不在同一個段,叫做指令不在同一個段,叫做段間轉移,段間轉移,轉移時轉移時CPU既要更改既要更改IP又要更改又要更改CS,n目的地址目的地址label有兩種表示方式:有兩種表示方式:nlabel是目標地
4、址處指令的標號,叫做是目標地址處指令的標號,叫做直接尋址直接尋址nlabel是寄存器或內存單元,跳轉目的地址在寄存器或內是寄存器或內存單元,跳轉目的地址在寄存器或內存中,叫做存中,叫做間接尋址間接尋址JMP labelJMP label 段內轉移、直接尋址段內轉移、直接尋址 段內轉移、間接尋址段內轉移、間接尋址 段間轉移、直接尋址段間轉移、直接尋址 段間轉移、間接尋址段間轉移、間接尋址6段內轉移、直接尋址段內轉移、直接尋址JMP labelJMP labelcode1 segment jmp again ;轉到;轉到again處執行處執行again: dec cx ;again處的指令處的指令
5、code1 ends執行執行JMP指令時:指令時:CS的內容不變,將以的內容不變,將以again為標號的指令的偏移地址裝入為標號的指令的偏移地址裝入IP。7段內轉移、間接尋址段內轉移、間接尋址JMP r16/m16 JMP r16/m16 n將將1616位寄存器或內存字單元內容位寄存器或內存字單元內容IPIP寄存器,寄存器,CSCS內容保持不變。內容保持不變。例例1:假設假設AX存放了段內某條指令的偏移地址,則存放了段內某條指令的偏移地址,則 jmp ax ;IPAX例例2:假設:假設DS:2000H存放了某條指令的偏移地址,則存放了某條指令的偏移地址,則 jmp word ptr 2000h
6、 ;IPDS:2000hcode1 segmentlea ax,again jmp ax ;轉到;轉到again處執行處執行again: dec cx ;again處的指令處的指令code1 ends81)JMP ONE;近程直接轉移;近程直接轉移假設假設ONE是程序中某條指令的標號,是程序中某條指令的標號,并且并且已在數據段定義字變量已在數據段定義字變量“TARGET”如下如下 :TAEGETDW ONE下面四種方法都可以實現同一個代碼段中向標號下面四種方法都可以實現同一個代碼段中向標號“ONE”的跳轉:的跳轉:段內轉移舉例段內轉移舉例2)LEA DX, ONE JMP DX;寄存器間接段內
7、轉移;寄存器間接段內轉移3)LEA BX, TARGET JMP WORD PTRBX ;存儲器間接段內轉移;存儲器間接段內轉移4)JMP TARGET;存儲器間接段內轉移;存儲器間接段內轉移9段間轉移、直接尋址段間轉移、直接尋址JMP far ptr labelJMP far ptr label;IPlabelIPlabel的偏移地址的偏移地址;CSlabelCSlabel的段地址的段地址n將標號所在段的段地址將標號所在段的段地址CS,標號處指令的偏移地址,標號處指令的偏移地址IP;CPU轉移到指定代碼段標號處執行轉移到指定代碼段標號處執行code1 segment assume cs:co
8、de1 start:mov ax,20 mov bx,10 add ax,bx jmp far ptr exitcode1 endscode2 segment assume cs:code2 exit:mov ax,4c00h int 21hcode2 ends end start10段間轉移、間接尋址段間轉移、間接尋址JMP far ptr memJMP far ptr mem;IPmemIPmem,CSmem+2CSmem+2n用一個雙字存儲單元存儲要跳轉的目標地用一個雙字存儲單元存儲要跳轉的目標地址。低位字送址。低位字送IPIP,高位字送,高位字送CSCS例如:例如: 讓處理器轉移到讓處
9、理器轉移到1500h:0取指令執行取指令執行mov word ptr bx,0mov word ptr bx+2,1500hJMP far ptr bx111)JMP FAR PTR TWO;遠程直接轉移;遠程直接轉移假設假設TWO是程序中一個代碼段中的某條指令的標號,是程序中一個代碼段中的某條指令的標號,并且已在數據段定義雙字變量并且已在數據段定義雙字變量“FAR_TGT”如下:如下:FAR_TGTDDTWO下面三組指令都可以實現向遠程標號下面三組指令都可以實現向遠程標號“TWO”的轉移:的轉移:2)LEA BX, FAR_TGT JMP DWORD PTRBX;遠程間接轉移;遠程間接轉移3
10、)JMP FAR_TGT;遠程間接轉移;遠程間接轉移12目標地址的范圍目標地址的范圍n段內轉移:不更改段內轉移:不更改CS,只改變只改變IP,又分:,又分:l短轉移(短轉移(short):轉移范圍在段內):轉移范圍在段內128127字節字節l近轉移(近轉移(near):在當前代碼段):在當前代碼段64KB范圍內轉移范圍內轉移n段間轉移段間轉移遠轉移(遠轉移(far)n更改更改CS和和IPn從當前代碼段跳到另一個代碼段,可以在從當前代碼段跳到另一個代碼段,可以在1MB范圍跳轉范圍跳轉n目標地址是雙字目標地址是雙字(16位偏移地址和位偏移地址和16位段地址位段地址),叫做,叫做32位遠指針位遠指針
11、代碼段代碼段代碼段代碼段 實際編程時,匯編程序會根據目標地址的距實際編程時,匯編程序會根據目標地址的距離,離,自動處理自動處理成短轉移、近轉移或遠轉移成短轉移、近轉移或遠轉移 程序員可用操作符程序員可用操作符short、near ptr 或或far ptr 強制指明或改變轉移的屬性強制指明或改變轉移的屬性最常用格式:最常用格式:JMP 語句標號語句標號代碼段代碼段代碼段代碼段134.1.2 4.1.2 比較和測試指令比較和測試指令目的操作數目的操作數dest:8位位/16位的寄存器位的寄存器/存儲器操作數。存儲器操作數。源操作數源操作數src:與:與dest同類型的寄存器同類型的寄存器/存儲器
12、存儲器/立即數。立即數。功能功能:運算后影響標志位,但運算后影響標志位,但不保留運算結果不保留運算結果。用途:用途:CMP比較兩個數的大小關系,但不改變它們的值。比較兩個數的大小關系,但不改變它們的值。AX?=BXTEST 判斷目的操作數中個別二進制位,但不改變它的值。判斷目的操作數中個別二進制位,但不改變它的值。判斷一個數的奇偶性判斷一個數的奇偶性指令操作碼指令操作碼指令格式指令格式功能描述功能描述CMPCMP dest, src(dest) (src),不存結果,不存結果TESTTEST dest, src(dest) (src),不存結果,不存結果144.1.3 4.1.3 條件轉移指令
13、條件轉移指令“J”-Jump“xx”是轉移的條件是轉移的條件“label”只能只能為目標指令的標為目標指令的標號。號。都屬于段內短轉移。都屬于段內短轉移。Jxxlabel操作碼助記符操作碼助記符條件條件指令功能指令功能JZ/JEZF=1相等或為相等或為0轉移轉移JNZ/JNEZF=0不相等或不為不相等或不為0轉移轉移JSSF=1結果是負數,則轉移結果是負數,則轉移JNSSF=0結果不是負數,則轉移結果不是負數,則轉移JOOF=1結果溢出,則轉移結果溢出,則轉移JNOOF=0結果沒有溢出,則轉移結果沒有溢出,則轉移JP/JPEPF=1低位字節有偶數個低位字節有偶數個1,則轉移,則轉移JNP/JP
14、OPF=0低位字節有奇數個低位字節有奇數個1,則轉移,則轉移JB/JNAE/JCCF=1有進借位或,則轉移有進借位或,則轉移JAE/JNB/JNCCF=0無進借位或無進借位或,則轉移,則轉移JBE/JNACF=1或或ZF=1,則轉移,則轉移JA/JNBECF=0且且ZF=0,則轉移,則轉移JL/JNGESFOF,則轉移,則轉移JGE/JNLSF=OF,則轉移,則轉移JLE/JNGSFOF或或ZF=1 ,則轉移,則轉移JG/JNLESF=OF且且ZF=0 ,則轉移,則轉移JCXZCX=0CX=0,則轉移則轉移15(1)根據兩個有符號數比較結果的條件轉移指令)根據兩個有符號數比較結果的條件轉移指令
15、兩個有符號數的比較結果通過兩個有符號數的比較結果通過OF,SF,ZF反映出來。反映出來。 G (Greater,大于,大于) L (Less,小于,小于) E (Equal,等于,等于) N (Not,否,否)指令助記符指令助記符 指令功能指令功能轉移條件轉移條件JG, JNLE大于(不小于等于)時轉移大于(不小于等于)時轉移OFSF= 0且且ZF=0JGE, JNL大于等于(不小于)時轉移大于等于(不小于)時轉移OFSF= 0JZ, JE為零(相等)時轉移為零(相等)時轉移ZF= 1JNZ, JNE不為零(不相等)時轉移不為零(不相等)時轉移ZF=0JL, JNGE小于(不大于等于)時轉移小
16、于(不大于等于)時轉移OFSF= 1JLE, JNG小于等于(不大于)時轉移小于等于(不大于)時轉移OFSF= 1或或ZF=116(2)根據兩個無符號數比較結果的條件轉移指令)根據兩個無符號數比較結果的條件轉移指令 兩個無符號數的比較結果通過兩個無符號數的比較結果通過CF,ZF反映出來。反映出來。 A(Above,高于),高于) B(Below,低于),低于) E(Equal,等于),等于)指令助記符指令助記符指令功能指令功能轉移條件轉移條件JA, JNBE高于(不低于等于)時轉移高于(不低于等于)時轉移CF= 0且且ZF=0JAE, JNB, JNC高于等于(不低于)時轉移高于等于(不低于)
17、時轉移CF= 0JZ, JE為零(相等)時轉移為零(相等)時轉移ZF= 1JNZ, JNE不為零(不相等)時轉移不為零(不相等)時轉移ZF=0JB, JNAE, JC低于(不高于等于)時轉移低于(不高于等于)時轉移CF= 1JBE, JNA低于等于(不高于)時轉移低于等于(不高于)時轉移CF= 1或或ZF=117(3)根據單個標志位的條件轉移指令)根據單個標志位的條件轉移指令 JS和和JNS: 利用符號標志利用符號標志SF,判斷結果是正是負,判斷結果是正是負 JO和和JNO: 利用溢出標志利用溢出標志OF,判斷結果是否產生溢出,判斷結果是否產生溢出 JP/JPE和和JNP/JPO: 利用奇偶標
18、志利用奇偶標志PF,判斷結果中,判斷結果中“1”的個數的個數 JC/JB/JNAE和和JNC/JNB/JAE: 利用進位標志利用進位標志CF,判斷結果是否進位或借位,判斷結果是否進位或借位 JZ/JE和和JNZ/JNE: 利用零標志利用零標志ZF,判斷結果是否為零(或相等),判斷結果是否為零(或相等)18JCXZ Label ;若;若CX=0,轉移到,轉移到Label(4)根據)根據CX寄存器值的條件轉移指令寄存器值的條件轉移指令19JNGSkipJMPLabelSkip: 條件轉移指令的條件轉移指令的轉移范圍在以下一條指令地址為中心的轉移范圍在以下一條指令地址為中心的128127字節之間字節
19、之間。 JG Label ;如果標號;如果標號“Label”超出范圍,匯編時將出錯超出范圍,匯編時將出錯如果跳轉超出范圍可以把上面指令修改為下面的指令:如果跳轉超出范圍可以把上面指令修改為下面的指令:條件轉移指令跳轉范圍限制條件轉移指令跳轉范圍限制204.2.1 4.2.1 基本選擇結構基本選擇結構4.2.2 4.2.2 單分支選擇結構單分支選擇結構4.2.3 4.2.3 復合選擇結構復合選擇結構4.2.4 4.2.4 多分支選擇結構多分支選擇結構214.2.1 4.2.1 基本選擇結構基本選擇結構if(條件條件)程序段程序段A;else程序段程序段B;22CODESEGMENTASSUMEC
20、S: CODESTART:JMPBEGINXDB?; 被測試的數,匯編之前置入被測試的數,匯編之前置入YESDB0AH, 0DH, “Its a even number.”, 0AH, 0DH, $NODB0AH, 0DH, “Its a odd number.”, 0AH, 0DH, $BEGIN:PUSHCSPOPDSTESTX, 1;測試;測試X的最低位,確定是否為偶數的最低位,確定是否為偶數JZEVN;ZF=1,該數是偶數,轉向,該數是偶數,轉向“EVN”ODD:LEADX, NO;否則,該數是奇數;否則,該數是奇數 MOV AH, 9 INT 21HJMPDONE;跳過偶數的處理;跳
21、過偶數的處理EVN:LEADX, YES MOVAH, 9INT21H;輸出偶數的相關信息;輸出偶數的相關信息DONE: MOVAX, 4C00HINT21HCODEENDSENDSTART例例4-2 判斷變量判斷變量X的值是否為的值是否為“偶數偶數”23CODESEGMENTASSUMECS: CODEXDB?; 被測試的數,匯編之前置入被測試的數,匯編之前置入YESDB0AH, 0DH, “Its a even number.”, 0AH, 0DH, $NODB0AH, 0DH, “Its a odd number.”, 0AH, 0DH, $BEGIN:PUSHCSPOPDSTESTX,
22、 1;測試;測試X的最低位,確定是否為偶數的最低位,確定是否為偶數JZEVN;ZF=1,該數是偶數,轉向,該數是偶數,轉向“EVN”ODD:LEADX, NO;否則,該數是奇數;否則,該數是奇數JMPDONE;跳過偶數的處理;跳過偶數的處理EVN:LEADX, YESDONE: MOVAH, 9INT21H;輸出偶數的相關信息;輸出偶數的相關信息MOVAX, 4C00HINT21HCODEENDSENDBEGIN例例4-2 判斷變量判斷變量X的值是否為的值是否為“偶數偶數”244.2.2 單分支選擇結構單分支選擇結構n合理選用合理選用Jcc指令所使用的轉移條件,可以使程序更加簡潔流暢。指令所使
23、用的轉移條件,可以使程序更加簡潔流暢。例如:當求絕對值時,應選用例如:當求絕對值時,應選用JGE指令而不用指令而不用JL指令指令(圖圖4-3)25例例: X、Y、Z均為有符號字節變量,將均為有符號字節變量,將X、Y中絕對值較中絕對值較大的數存入大的數存入Z。 mov al, x cmp al, 0 jge skip1 neg alskip1: mov bl, y cmp bl, 0 jge skip2 neg blskip2: cmp al, bl jae xtoz mov al, y jmp save xtoz:mov al, x save:mov z, al hlt26例例: 在顯示器以在
24、顯示器以16進制形式顯示進制形式顯示al中的值。中的值。將一個將一個16進制數位(進制數位(0F)調整為對應)調整為對應ASCII碼的方法:碼的方法:方法方法1(基本選擇):(基本選擇): MOV DL, ? ;015 CMP DL, 9 JA ALPH ADD DL, 30H JMP DONEALPH:ADD DL, 37HDONE: 寫出該例題的源程序片段。寫出該例題的源程序片段。方法方法2(單分支選擇):(單分支選擇): MOV DL, ? ;015 ADD DL, 30H CMP DL, 9 JBE DONE ADD DL, 7DONE:27例例4-6 計算計算Y=SGN(X)X0X=
25、0Y=0Y=1YNNY=-1X0X=0Y=0Y=1YYNNY=-1Y(a)(b);方法;方法a,逐項排除,逐項排除 CMPX, 0 JGEUN_MINUSMINUS: MOVY, -1 JMPDONEUN_MINUS: JEZERO MOVY, 1 JMPDONEZERO: MOVY, 0DONE: ;方法;方法b,逐項確認,逐項確認 CMPX, 0 JGPLUS JE ZEROMINUS: MOVY, -1 JMPDONEPLUS: MOVY, 1 JMPDONEZERO: MOVY, 0DONE: 4.2.3 復合選擇結構復合選擇結構 1(X0)Y = 0 (X=0) -1(X0) 284
26、.2.4 4.2.4 多分支選擇結構多分支選擇結構CONDITIONF1C1(a)(b)F2F3F1-=C1=C2=C3=CnC2CnF2FnFnYYN-其它處理YNN- 在選擇結構程序里,如果可供選擇的程序塊多于兩個,這樣在選擇結構程序里,如果可供選擇的程序塊多于兩個,這樣的結構稱為的結構稱為多分支選擇結構多分支選擇結構,如圖,如圖 (a)所示,圖所示,圖 (b)是剛講過的復是剛講過的復合選擇結構的實現方法。合選擇結構的實現方法。29CODESEGMENTASSUME CS: CODE, DS: DATASTART: MOVAX, DATAMOVDS, AXMOVAX, 4C00HINT21
27、HCODEENDSENDSTART 例例4-7 從鍵盤上輸入數字從鍵盤上輸入數字“1”到到“3”,根據輸入選擇顯示不同的信息。,根據輸入選擇顯示不同的信息。DATASEGMENTPROMPTDB0DH, 0AH, “Input a number (13): $”MSG1DB0DH, 0AH, “FUNCTION 1 EXECUTED . $”MSG2DB0DH, 0AH, “FUNCTION 2 EXECUTED . $”MSG3DB0DH, 0AH, “FUNCTION 3 EXECUTED . $”DATAENDSC1(b)F1C2CnF2FnYYN-其它處理YNN-30INPUT: LE
28、ADX, PROMPTMOVAH, 9INT21H;輸出提示信息;輸出提示信息MOVAH, 1INT21H;等待從鍵盤輸入一個數字;等待從鍵盤輸入一個數字CMPAL, 1JBINPUT;是;是“0”或非數字,重新輸入或非數字,重新輸入JEF1;數字;數字“1”,轉,轉F1CMPAL, 2JEF2;數字;數字“2”,轉,轉F2CMPAL, 3JEF3;數字;數字“3”,轉,轉F3JMPINPUT;大于;大于“3”,重新輸入,重新輸入F1:LEADX, MSG1;F1程序塊程序塊JMPOUTPUTF2:LEADX, MSG2;F2程序塊程序塊JMPOUTPUTF3:LEADX, MSG3;F3程序
29、塊程序塊JMPOUTPUTOUTPUT:MOV AH, 9INT21HC1(b)F1C2CnF2FnYYN-其它處理YNN-31 把完成各分支的程序塊入口地址放在一張表格中,這個表叫地把完成各分支的程序塊入口地址放在一張表格中,這個表叫地址表,根據輸入,計算出應該執行的分支程序塊入口地址址表,根據輸入,計算出應該執行的分支程序塊入口地址在表在表中的中的位置,通過存儲器間接轉移轉入對應位置執行。位置,通過存儲器間接轉移轉入對應位置執行。方法方法2:按照流程:按照流程a的方法實現的方法實現CONDITIONF1(a)F2F3-=C1=C2=C3=CnFn32CODESEGMENT ASSUMECS
30、: CODE, DS: DATASTART:MOV AX, DATA MOV DS, AXINPUT: LEA DX, PROMPT MOV AH, 9 INT 21H MOV AH, 1 INT 21H CMP AL, 1 JB INPUT CMP AL, 3 JA INPUT SUB AL, 1 MOV AX, 4C00H INT 21HCODEENDSENDSTARTSHLAL, 1;轉換為;轉換為0,2,4MOVBL, ALMOVBH, 0;轉入;轉入BXJMPADDTBLBX;間接尋址,轉移到對應程序塊;間接尋址,轉移到對應程序塊F1:LEADX, MSG1;F1程序塊程序塊JMPO
31、UTPUTF2:LEADX, MSG2;F2程序塊程序塊JMPOUTPUTF3:LEADX, MSG3;F3程序塊程序塊JMP OUTPUTOUTPUT:MOVAH, 9INT21H多分支核心實現多分支核心實現DATASEGMENT PROMPTDB 0DH, 0AH, “Input a number (13): $”MSG1DB 0DH, 0AH, “FUNCTION 1 EXECUTED . $”MSG2DB 0DH, 0AH, “FUNCTION 2 EXECUTED . $”MSG3DB 0DH, 0AH, “FUNCTION 3 EXECUTED . $”ADDTBLDW F1, F
32、2, F3DATAENDS33 3X-5, |x|3 MOV AX, X CMP AX, 3 JG GREATER CMP AX, -3 JL GREATER MOV BX, AX SAL AX, 1 ADD AX, BX SUB AX, 5 JMP SAVEGREATER: MOV AX, 6 SAVE: MOV Y, AX HLT34補充例題:求有符號字變量補充例題:求有符號字變量X、Y、Z中的極值。中的極值。(1)將最大值存入)將最大值存入MAX(2)將最大值存入)將最大值存入MAX,最小值存入,最小值存入MIN MOV AX, X MOV BX, Y MOV CX, Z CMP AX,
33、 BX JG GOON XCHG AX, BXGOON: CMP AX, CX JG ISAX MOV MAX, CX JMP EXIT ISAX: MOV MAX, AX EXIT: HLT JL GOOD MOV MAX,AX CMP BX,CX JL BMIN MOV MIN,CX JMP QUIT BMIN: MOV MIN,BX QUIT: JMP EXITGOOD: MOV MIN,BX MOV MAX,CX EXIT: HLT351、統計成績數組中各分數段的人數;、統計成績數組中各分數段的人數;2、從鍵盤輸入一個字符串,統計其中數字字符、字母字、從鍵盤輸入一個字符串,統計其中數字
34、字符、字母字符和其它類型字符的個數;符和其它類型字符的個數;3、求有、求有/無符號數組中的最大、最小值。無符號數組中的最大、最小值。練習:練習:364.3.1 4.3.1 循環指令循環指令4.3.2 4.3.2 計數循環計數循環4.3.3 4.3.3 條件循環條件循環4.3.4 4.3.4 多重循環多重循環37計數循環計數循環:循環的次數事先已知循環的次數事先已知,用一個變量(寄存器,用一個變量(寄存器或存儲器單元)記錄循環的次數(稱為或存儲器單元)記錄循環的次數(稱為“循環計循環計數數器器”)。)。條件循環條件循環:循環的次數事先并不確定循環的次數事先并不確定,每次循環開始時,每次循環開始時
35、或結束后測試某個條件,根據這個條件是否滿足或結束后測試某個條件,根據這個條件是否滿足來決定是否繼續下一次循環。來決定是否繼續下一次循環。按照循環結束的條件,有以下兩類循環:按照循環結束的條件,有以下兩類循環:38初始化部分工作部分修改部分控制部分初始化部分工作部分修改部分控制部分YNYN(a) WHILE結構循環(b) DO-WHILE結構循環兩種結構的循環:兩種結構的循環:394.3.1 4.3.1 循環指令循環指令它們都不影響標志位;它們都不影響標志位;轉移范圍:轉移范圍:Label距離距離LOOP指令的下一條指令必須在指令的下一條指令必須在-128+127B之內。之內。指令操作碼指令操作
36、碼指令格式指令格式功能描述功能描述LOOPLOOP labelCXCX-1,若,若(CX)0,轉移,轉移到到LabelLOOPZ/LOOPELOOPZ/LOOPE labelCXCX-1,若,若(CX)0且且ZF=1,轉移到轉移到LabelLOOPNZ/LOOPNELOOPNZ/LOOPNE labelCXCX-1,若,若(CX)0且且ZF=0,轉移到轉移到LabelLOOP Label 與下面兩條指令功能相近:與下面兩條指令功能相近:DECCX; CXCX-1JNZLabel; 若若(CX)0(也就是(也就是ZF=0),轉移到),轉移到Label40例例4-8 從鍵盤上輸入一個字符串(不超過
37、從鍵盤上輸入一個字符串(不超過80個字符),將它逆序后輸出。個字符),將它逆序后輸出。4.3.2 計數循環計數循環DATASEGMENT BUFFER DB 81, ?, 81 DUP(?) MESS DB 0AH, 0DH, “Input a string please : $”DATAENDSCODESEGMENTASSUME CS:CODE, DS:DATASTART:MOV AX, DATAMOVDS, AXLEADX, MESSMOVAH, 09HINT21H; 輸出提示信息輸出提示信息MOVAH, 0AHLEADX, BUFFERINT21H; 輸入字符串輸入字符串LEABX, B
38、UFFER; 緩沖區首地址送緩沖區首地址送BXMOVCL, BUFFER+1MOVCH, 0; 輸入字符個數送輸入字符個數送CX(循環次數)(循環次數)41JCXZ EXIT ADDBX, CXINCBX; 計算字符串末地址送計算字符串末地址送BX(指針)(指針)DISP:MOV DL, BXMOVAH, 02HINT21H; 逆序輸出一個字符逆序輸出一個字符DECBX; 修改指針修改指針LOOP DISP; 計數循環計數循環EXIT: MOVAX, 4C00HINT21HCODEENDSENDSTART42例例4-9 在顯示器以十六進制形式顯示在顯示器以十六進制形式顯示BX寄存器的內容寄存器
39、的內容 BX是一個是一個16位寄存器位寄存器二進制二進制 1010 1001 0011 1110 用十六進顯示時,每用十六進顯示時,每4位用一個字符顯示,共位用一個字符顯示,共4個個其中其中: 0000 0 30H , 1010 A 41H 0001 1 31H , 1011 B 42H 、 、 1001 9 39H , 1111 F 46H?十六進制十六進制 A 9 3 E 屏幕上的顯示屏幕上的顯示 A 9 3 E 對應的對應的ASCII 41H 39H 33H 45H43例例4-9 算法算法n取出要顯示的某取出要顯示的某4位,轉換為對應的位,轉換為對應的ASCII碼碼,再調用再調用DOS系
40、統功能進行顯示。系統功能進行顯示。 BX A 9 3 E9 3 E A A 9 3 E 3 E A 9 E A 9 3 44(1) 對于對于00001001(09), 先擴展成一個字節,高先擴展成一個字節,高4位清位清0, 加上加上30H后后, 即可得字符即可得字符09對應的對應的ASCII碼。碼。 0000 0001B + 30H= 31H 0000 1001B + 30H=39H 0001B 1 1001B 9 (2) 對于對于10101111(AF), 先擴展成一個字節,高先擴展成一個字節,高4位清位清0, 加上加上30H后后, 還要再加上還要再加上07H,才能得到,才能得到AF 對應的
41、對應的ASCII碼碼 0000 1010B+30H+07H = 41H 0000 1111B+30H+07H =46H 1010B A 1111B Fcode SEGMENT ASSUME CS:codestart: MOV BX,1234H MOV CH, 4 ;字符個數字符個數 MOV CL, 4 ;循環移位次數循環移位次數 next: ROL BX, CL ;取顯示位的值取顯示位的值 MOV DL, BL ;保存在保存在DL中中 AND DL, 0FH ;清除高清除高4位位 ADD DL, 30H ;轉變為數字的轉變為數字的ASCII CMP DL, 39H ;大于大于39H, 則應轉變
42、則應轉變 JBE print ;為字母為字母AF的的ASCII ADD DL, 07H print: MOV AH, 2H ;顯示顯示DL中的字符中的字符 INT 21H DEC CH ;顯示結束?顯示結束? JNZ next MOV AH, 4CH ;返回返回DOS INT 21Hcode ENDS END start顯示字符個數顯示字符個數CH=4循環移位次數循環移位次數CL=4BX循環左移循環左移4位,將要顯示的值位,將要顯示的值移至低移至低4位,保存在位,保存在DL中中清清DL 的高的高4位,位,只保留要顯示位的值只保留要顯示位的值DL DL+30H完成數值完成數值09的的ASCII碼
43、轉換碼轉換YNDLDL+07H完成數值完成數值AF的的ASCII碼轉換碼轉換用用02功能顯示功能顯示DL中的字符中的字符YN返回返回DOSDL 超出超出39H?CH CH-1轉換結束?轉換結束?開始開始例例4-9 程序程序計數控制法46思考思考n例例4-9采用的是大寫字母采用的是大寫字母AF進行顯示,進行顯示,若采用小寫字符若采用小寫字符a f 進行顯示,程序如進行顯示,程序如何改寫?何改寫?1010 0011 1001 1110 A39E 或或 a39en小寫小寫a f的的ASCII碼在碼在616FH,比,比大寫字大寫字母母AF的的ACII碼多碼多20H,判斷是字母的,判斷是字母的數字后,數
44、字后,加加27H即可即可。n也可以用查表的方法形成十六進制數位的也可以用查表的方法形成十六進制數位的ASCII碼。碼。(參見教材例參見教材例4.9)47DATASEGMENTSTRING DB “A string for testing . ”, 0LENGTH DW ?DATAENDS例例4-10 字符串字符串STRING以代碼以代碼0結束,求它的長度(字符個數)。結束,求它的長度(字符個數)。4.3.3 條件循環條件循環CODESEGMENTASSUME CS: CODE, DS: DATASTART:MOV AX, DATAMOV DS, AXLEASI, STRING;裝載字符串指針;
45、裝載字符串指針MOVCX, 0;設置計數器初值;設置計數器初值TST:CMPBYTE PTR SI, 0;比較;比較JEDONE;字符串結束;字符串結束,轉向轉向DONE保存結果保存結果INCSI;修改指針;修改指針INCCX ;計數;計數JMPTST;轉向;轉向TST,繼續循環,繼續循環DONE:MOVLENGTH, CX;保存結果;保存結果MOVAX, 4C00HINT21HCODEENDSENDSTART48例題例題4-11 從鍵盤以從鍵盤以10進制格式輸入一個無符號進制格式輸入一個無符號字節數(字節數(0255)存入)存入result,回車結束輸入。,回車結束輸入。方法方法1:先利用:
46、先利用0AH號號dos功能調用獲得各個數據位和結束標功能調用獲得各個數據位和結束標志(回車鍵),然后調用算法將數據位組合成十進制數。屬志(回車鍵),然后調用算法將數據位組合成十進制數。屬于計數控制的循環。于計數控制的循環。方法方法2:利用:利用01H號號dos功能調用,每輸入一個數位時調用一功能調用,每輸入一個數位時調用一次算法,直到輸入回車鍵。屬于條件控制的循環。次算法,直到輸入回車鍵。屬于條件控制的循環。 (編寫匯編語言程序)(編寫匯編語言程序)思考思考1:通過方法:通過方法2,從鍵盤輸入一個無符號字整數,保存到字變,從鍵盤輸入一個無符號字整數,保存到字變量量NUM。當檢測到非法字符或超出
47、范圍時重新輸入。當檢測到非法字符或超出范圍時重新輸入。思考思考2:通過方法:通過方法2,從鍵盤輸入一個有符號字整數,保存到字變,從鍵盤輸入一個有符號字整數,保存到字變量量NUM。當檢測到非法字符時重新輸入。當檢測到非法字符時重新輸入。 (參考教材例(參考教材例4.15)49例題例題4-12 向顯示器以向顯示器以10進制格式輸出一個無符進制格式輸出一個無符號字節數(號字節數(0255)。)。方法:先利用除法指令從低位開始分離出各個數據位并保存,分方法:先利用除法指令從低位開始分離出各個數據位并保存,分離結束后再利用離結束后再利用02號號dos功能調用逆序顯示。功能調用逆序顯示。1。計數控制循環的
48、次數:已介紹。計數控制循環的次數:已介紹2。條件控制循環的次數:當某次除法結束后商為。條件控制循環的次數:當某次除法結束后商為0,結束循環,結束循環。思考:如何輸出一個有符號數據?思考:如何輸出一個有符號數據?50例題例題4-13統計字變量統計字變量var中二進制位中二進制位1的個的個數數n方法方法1:計數控制的循環(已講解):計數控制的循環(已講解)n方法方法2:條件控制的循環:條件控制的循環51 有時循環的控制既需要次數控制,又需要條件有時循環的控制既需要次數控制,又需要條件控制(如等長字符串的比較),但通過設置輔助變控制(如等長字符串的比較),但通過設置輔助變量后可以簡化。量后可以簡化。
49、編寫程序時的技巧:編寫程序時的技巧:52 例例4-14 4-14 將將變量var中的正數插入一個已整序的字數組插入一個已整序的字數組(各元素均為正數)的正確位置。的正確位置。 x dw ?x dw ? array_head dw 3,5,15,23,37,49,52,65,78,99 array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105 array_end dw 105 var dw 32 var dw 32 -1x mov ax, varmov ax, var mov array_head-2, 0ffffh mov array
50、_head-2, 0ffffh mov si, 0 mov si, 0CompareCompare: cmp array_endsi, axcmp array_endsi, ax jle insertjle insert mov bx, array_endsi mov bx, array_endsi mov array_endsi+2, bx mov array_endsi+2, bx sub si, 2 sub si, 2 jmp compare jmp compareInsertInsert: mov array_endsi+2, axmov array_endsi+2, ax 32 3
51、5 49 15 52 23 37 105 99 78 65vararray_headarray_headarray_endarray_end53例例4-15 邏輯尺的用法邏輯尺的用法n設有數組設有數組x(x1, , x10)和和y(y1, , y10),編程計算編程計算 z1=x1 + y1 z2=x2 + y2 z3=x3 - y3 z4=x4 - y4 z5=x5 - y5 z6=x6 + y6 z7=x7 - y7 z8=x8 - y8 z9=x9 + y9 z10=x10 + y10 邏輯尺邏輯尺:0 0 1 1 0 1 1 1 0 0 1 減法減法 0 加法加法54x dw x1,x
52、2,x3,x4,x5,x6,x7,x8,x9,x10 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dw 00dchlogic_rule dw 00dch mov bx, 0mov bx, 0 mov cx, 10 mov cx, 10 mov dx, logic_rule
53、mov dx, logic_rule next: mov ax, xbx next: mov ax, xbx shr dx, 1 shr dx, 1 jc subtract jc subtract add ax, ybx add ax, ybx jmp jmp result result ; ; 向前引用向前引用subtract: sub ax, ybxsubtract: sub ax, ybx resultresult: mov zbx, ax: mov zbx, ax add bx, 2 add bx, 2 loop next loop next 邏輯尺程序邏輯尺程序55 用總分減去最高分
54、、最低分,最后除以用總分減去最高分、最低分,最后除以5,得到需要的成績。,得到需要的成績。 求求N個數據中最大值的方法:個數據中最大值的方法:預設一個預設一個“最大值最大值”,取出一個數據與這個取出一個數據與這個“最大值最大值”進行比較,進行比較, 如果數據大于如果數據大于“最大值最大值”,則將該數據作為新的,則將該數據作為新的“最大最大值值”。進行進行N次比較之后留下的就是這次比較之后留下的就是這N個數據的最大值。個數據的最大值。 預設的預設的“最大值最大值”的初值可以從的初值可以從N個數據中任取一個,也可以根個數據中任取一個,也可以根據數據的范圍,取一個該范圍內的最小的數。據數據的范圍,取
55、一個該范圍內的最小的數。 計算最小值的方法與此類似。計算最小值的方法與此類似。例例4-16 從鍵盤上輸入七名裁判的評分(從鍵盤上輸入七名裁判的評分(010),扣除一個最),扣除一個最高分,一個最低分,計算出其它五項評分的平均值(高分,一個最低分,計算出其它五項評分的平均值(保留保留一位小數一位小數),在顯示器上輸出。),在顯示器上輸出。56INCLUDEYLIB.HDATASEGMENTMESS1 DB0DH, 0AH, “Input a score ( 010 ) : $”MESS2 DB0DH, 0AH, “The final score is : $”C5DB5MAXDB?MINDB?S
56、UMDB?DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATAMOVDS, AX57MOVSUM, 0; 累加器清零累加器清零MOVMAX, 0; “最大值最大值”預設為預設為0MOVMIN, 255; “最小值最小值”預設為預設為255MOVCX, 7; 循環計數器,初值循環計數器,初值7ONE:LEADX, MESS1CALLREADDEC; 鍵盤輸入一個分數鍵盤輸入一個分數ADDSUM, AL; 累加累加CMPMAX, AL; 與與“最大值最大值”比較比較JAL1MOVMAX, AL; 大于大于“最大值最大值”則保留則保
57、留L1:CMPMIN, AL; 與與“最小值最小值”比較比較JBL2MOVMIN, AL; 小于小于“最小值最小值”則保留則保留L2:LOOP ONE; 計數循環計數循環58MOVAL, SUMSUBAL, MAXSUBAL, MIN; 從總分中減去最大、最小值從總分中減去最大、最小值MOVSUM, ALXORAH, AH; 高高8位清零位清零DIVC5; 求平均值求平均值PUSHAX; 保留余數(在保留余數(在AH中)中)MOVAH, 0; 清余數清余數LEADX, MESS2CALLWRITEDEC; 輸出結果的整數部分輸出結果的整數部分 59MOVDL, .MOVAH, 2INT21H;
58、 輸出小數點輸出小數點POPAX; 從堆棧彈出余數從堆棧彈出余數SHLAH, 1; 計算小數部分:計算小數部分:(AH5)10=AH2MOVDL, AHORDL, 30H; 轉換成轉換成ASCII代碼代碼MOVAH, 2INT21H; 輸出結果的小數部分輸出結果的小數部分CALLCRLF; 輸出回車換行,結束本行輸出回車換行,結束本行MOVAX, 4C00HINT21HCODEENDSENDSTART60LOOPZ/LOOPE及及LOOPNZ/LOOPNE的功能及應用的功能及應用指令操作碼指令操作碼指令格式指令格式功能描述功能描述LOOPLOOP labelCXCX-1,若,若(CX)0,轉移
59、,轉移到到LabelLOOPZ/LOOPELOOPZ/LOOPE labelCXCX-1,若,若(CX)0且且ZF=1,轉移到轉移到LabelLOOPNZ/LOOPNELOOPNZ/LOOPNE labelCXCX-1,若,若(CX)0且且ZF=0,轉移到轉移到Label61例例4-17 判斷兩個字符串是否完全匹配。判斷兩個字符串是否完全匹配。Data segment mess1 db 0dh,0ah, “Please input string1:$” string1 db 20, ? , 20 dup(?) mess2 db 0dh,0ah, “Please input string2:$”
60、 string2 db 20, ? , 20 dup(?) yes db 0dh,0ah, “string1=string2$” no db 0dh,0ah, “string1!=string2$”Data ends62用用LOOP指令控制循環:指令控制循環:代碼段:代碼段: MOV AX, DATA MOV DS, AX LEA DX, MESS1 MOV AH, 9 INT 21H LEA DX, STRING1 MOV AH, 0AH INT 21H LEA DX, MESS2 MOV AH, 9 INT 21H LEA DX, STRING2 MOV AH, 0AH INT 21H M
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CGCC 21-2018擠壓糕點
- T/CEMTA 3.1-2023工業電子雷管通用型起爆器第1部分:性能規范
- T/CEMIA 007-2018光纖預制棒用高純氯
- T/CECS 10228-2022綠色建材評價透水鋪裝材料
- T/CCMA 0199-2024瀝青混合料攪拌設備舊料破碎篩分設備
- T/CCAA 39-2022碳管理體系要求
- T/CBMMAS 022-2023高耐腐鍍鋅鋁鎂彩涂鋼板
- T/CBMCA 003-2018模塊式集成灶用吸油煙機
- T/CBJ 3304-2024工坊啤酒產品認證與評價實施規則
- T/CBJ 1105-2023酒業數字藏品技術規范
- 老年人智能手機使用教程課件
- 3.6.3關門車課件講解
- 貴陽2024年貴州貴陽貴安事業單位招聘599人筆試歷年典型考題及考點附答案解析
- IATF16949-COP-內部審核檢查表+填寫記錄
- 實際控制人與法人協議模板
- 全屋家具定制合同
- 大數據技術基礎(第2版)全套教學課件
- 康養旅游區項目可行性研究報告
- 大鎖孫天宇小品《時間都去哪了》臺詞劇本完整版-一年一度喜劇大賽
- 中英文化對比智慧樹知到期末考試答案章節答案2024年武漢科技大學
- 電工儀表與測量(第六版)中職技工電工類專業全套教學課件
評論
0/150
提交評論