第5章基本控制結(jié)構(gòu)_第1頁
第5章基本控制結(jié)構(gòu)_第2頁
第5章基本控制結(jié)構(gòu)_第3頁
第5章基本控制結(jié)構(gòu)_第4頁
第5章基本控制結(jié)構(gòu)_第5頁
已閱讀5頁,還剩70頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

2023/10/1080x86匯編語言程序設(shè)計(jì)第5章基本控制結(jié)構(gòu)

講授要點(diǎn)系統(tǒng)功能子程序的調(diào)用字符與字符串的輸入/輸出方法雙分支與多分支結(jié)構(gòu)循環(huán)程序的控制方法串操作指令及其用途2023/10/1080x86匯編語言程序設(shè)計(jì)5.1系統(tǒng)功能子程序的調(diào)用通過軟中斷方式調(diào)用外部設(shè)備管理程序。中斷指令格式:INT n執(zhí)行操作:PUSHPSW,0→TF、IF,PUSHCS,PUSHIP,入口地址→CS、IP;調(diào)用格式:送入口參量到指定寄存器功能號(hào)→AHINT n2023/10/1080x86匯編語言程序設(shè)計(jì)DOS功能子程序的調(diào)用調(diào)用格式:MOVCX/DX[DL],參數(shù)

MOVAH,功能號(hào)

INT21H功能號(hào)入口寄存器功能1H無等待鍵盤輸入,把字符的ASCII碼值存入AL并在屏幕上顯示字符。2HDL將DL中的字符顯示在屏幕上。5HDL將DL中的字符打印出來8H無等待鍵盤輸入,把字符的ASCII碼值存入AL。9HDX將一個(gè)字符串顯示在屏幕上,字符串以‘$’做結(jié)束,DX存字符串的首地址。2023/10/1080x86匯編語言程序設(shè)計(jì)DOS功能調(diào)用表(續(xù))功能號(hào)入口寄存器功能0AHDX從鍵盤輸入字符串到指定的存儲(chǔ)區(qū)中,字符串以回車鍵結(jié)束,DS、DX指向指定的存儲(chǔ)區(qū)的段基值和偏移量。2AH無讀出系統(tǒng)日期,其中年存入CX,月存入DH,日存入DL,星期存入AL。2BHCX、DX設(shè)置系統(tǒng)日期,其中年存入CX,月存入DH,日存入DL。AL=0表示設(shè)置成功。2CH無讀出系統(tǒng)時(shí)間,其中時(shí)存入CH,分存入CL,秒存入DH,百分秒存入DL。2DHCX、DX設(shè)置系統(tǒng)時(shí)間,其中時(shí)存入CH,分存入CL,秒存入DH,百分秒存入DL。AL=0表示設(shè)置成功。2023/10/1080x86匯編語言程序設(shè)計(jì)BIOS功能子程序的調(diào)用調(diào)用格式:MOVAH,功能號(hào)

INTn中斷號(hào)功能10H顯示器輸出控制中斷調(diào)用。如09H功能號(hào),在光標(biāo)處輸出一字符。13H磁盤輸入輸出功能。包括復(fù)位、讀寫扇區(qū)數(shù)據(jù)等。14H異步通信口輸入輸出控制功能。包括讀、寫數(shù)據(jù)等。16H鍵盤輸入控制功能。17H打印機(jī)輸出控制功能。2023/10/1080x86匯編語言程序設(shè)計(jì)5.2字符與字符串的輸入/輸出方法DOS系統(tǒng)調(diào)用INT21H提供了字符及字符串的I/O功能,例如:

01H:從鍵盤讀入一個(gè)字符

02H:顯示一個(gè)字符

09H:顯示一個(gè)字符串

0AH:從鍵盤讀入一個(gè)字符串

2023/10/1080x86匯編語言程序設(shè)計(jì)5.2字符與字符串的輸入/輸出方法1.從鍵盤讀入一個(gè)字符功能號(hào):01H

出口參數(shù):AL=輸入字符的ASCII碼功能:等待從鍵盤讀入一個(gè)字符,將其ASCII碼送入AL,同時(shí)將該字符顯示在屏幕上。調(diào)用方法:

mov ah,1 int 21h

說明:輸入一個(gè)字符后,不需要回車。若只鍵入回車,則AL=0DH。

2023/10/1080x86匯編語言程序設(shè)計(jì)5.2字符與字符串的輸入/輸出方法2.顯示一個(gè)字符功能號(hào):02H

入口參數(shù):DL=要顯示字符的ASCII碼功能:在當(dāng)前光標(biāo)位置顯示DL中的字符,光標(biāo)右移。調(diào)用方法示例:

mov dl,'A' ;顯示字符'A' mov ah,2 int 21h

說明:顯示字符0DH和0AH將產(chǎn)生回車和換行的作用。

2023/10/1080x86匯編語言程序設(shè)計(jì)5.2字符與字符串的輸入/輸出方法

3.顯示一個(gè)字符串功能號(hào):09H

入口參數(shù):DS:DX=欲顯示字符串在內(nèi)存的首地址,且字符串必須以'$'(24H)作為結(jié)束符。功能:在當(dāng)前光標(biāo)位置,顯示由DS:DX所指的、以'$'結(jié)尾的字符串,且光標(biāo)右移。其中,'$'不算在顯示的字符串之內(nèi)。

2023/10/1080x86匯編語言程序設(shè)計(jì)調(diào)用方法示例:

String db 'Hello!','$' ;顯示字符串'Hello!' mov ax,segString mov ds,ax mov dx,offsetString mov ah,9 int 21h 2023/10/1080x86匯編語言程序設(shè)計(jì)5.2字符與字符串的輸入/輸出方法

4.從鍵盤讀入一個(gè)字符串功能號(hào):0AH

入口參數(shù):DS:DX=輸入緩沖區(qū)首地址輸入緩沖區(qū)格式:第0字節(jié)事先設(shè)置為緩沖區(qū)最多能容納的字符個(gè)數(shù)(包括回車);第1字節(jié)將存放實(shí)際字符個(gè)數(shù)(不包括回車),由系統(tǒng)自動(dòng)設(shè)置;從第2字節(jié)開始存放實(shí)際輸入的字符串,最后為回車符。功能:從鍵盤讀入一個(gè)字符串,存入DS:DX所指的緩沖區(qū)。

2023/10/1080x86匯編語言程序設(shè)計(jì)調(diào)用方法示例:

buf db 10,?,10dup(?) ;定義輸入緩沖區(qū)

mov ax,segbuf mov ds,ax lea dx,buf mov ah,0ah int 21h 2023/10/1080x86匯編語言程序設(shè)計(jì)5.2字符與字符串的輸入/輸出方法5.字符與字符串的輸入/輸出舉例

DOS系統(tǒng)調(diào)用只提供了字符與字符串的輸入/輸出方法。如果要輸入/輸出其它類型的數(shù)據(jù),如常用的整數(shù),則必須由應(yīng)用程序來實(shí)現(xiàn)與字符之間的轉(zhuǎn)換。例如,欲輸出整數(shù)126,只能以字符(串)的方式輸出'1'、'2'、'6'。對于程序員來說,在需要用戶輸入時(shí)給出輸入提示,對輸入數(shù)據(jù)進(jìn)行有效性檢查,在輸出結(jié)果時(shí)說明其表示的含義,是一種好的設(shè)計(jì)習(xí)慣。2023/10/1080x86匯編語言程序設(shè)計(jì)5.3順序結(jié)構(gòu)

5.3.1簡單程序設(shè)計(jì)dseg segment use16

... ;數(shù)據(jù)定義(DB/DW/DD)dseg endseseg segment use16

... ;數(shù)據(jù)定義(DB/DW/DD)eseg endssseg segment stackuse16 dw 512dup(?) sseg endscsegsegmentuse16assumecs:cseg,ds:dseg,es:eseg,ss:ssegstart:movax,dsegmovds,axmovax,esegmoves,ax

.. ;指令序列

movah,4chint 21;程序退出,返回DOScsegendsendstart2023/10/1080x86匯編語言程序設(shè)計(jì)5.4分支結(jié)構(gòu)

5.4.1JMP指令的靈活運(yùn)用

用JMP指令實(shí)現(xiàn)轉(zhuǎn)移的多種方法:使用標(biāo)號(hào),近轉(zhuǎn)移使用標(biāo)號(hào),遠(yuǎn)轉(zhuǎn)移以通用寄存器表示目標(biāo)偏移地址以內(nèi)存變量表示目標(biāo)偏移地址以內(nèi)存變量表示目標(biāo)的32位分段地址2023/10/1080x86匯編語言程序設(shè)計(jì)(一)、控制轉(zhuǎn)移指令1、無條件轉(zhuǎn)移指令基本格式:JMPTARGET①、段內(nèi)直接短轉(zhuǎn)移指令格式:JMP[SHORT]TARGET;TARGET為轉(zhuǎn)移的目的地址(相對尋址)。執(zhí)行操作:IP+8位有符號(hào)數(shù)→IP

源與目的地址之間要保持在-128---+127范圍內(nèi)。②、段內(nèi)直接近轉(zhuǎn)移指令格式:JMP[NEARPTR]TARGET;TARGET為轉(zhuǎn)移的目的地址(相對尋址)。執(zhí)行操作:IP+16位符號(hào)數(shù)→IP

源與目的地址之間要保持在-32768---+32727范圍內(nèi)。2023/10/1080x86匯編語言程序設(shè)計(jì)③、段內(nèi)間接轉(zhuǎn)移指令格式:JMPWORDPTROPR;OPR為通用寄存器/存儲(chǔ)器字單元,目標(biāo)地址為其內(nèi)的數(shù)據(jù)(間接尋址)。執(zhí)行操作:R→IP或[EA]→IP

例:JMPBX、JMPWORDPTR[BX]④、段間轉(zhuǎn)移指令格式:JMPDWORDPTROPR;OPR為存儲(chǔ)器雙字單元(間接尋址)。執(zhí)行操作:(EA)→IP,(EA+2)→CS例:JMPDWORDPTR[BX]、

JMPDWORDPTR10H[BX][DI]2023/10/1080x86匯編語言程序設(shè)計(jì)2、條件轉(zhuǎn)移指令基本格式:JXXOPR

條件轉(zhuǎn)移只能在段內(nèi)轉(zhuǎn)移,且轉(zhuǎn)移范圍為:-128--127。①、單標(biāo)志位條件轉(zhuǎn)移指令(10條,簡單條件轉(zhuǎn)移)

JZ(或JE)OPR;結(jié)果為0(或相等)(ZF=1)時(shí)轉(zhuǎn)移;

JNZ(或JNE)OPR;結(jié)果不為0(或不相等)(ZF=0)時(shí)轉(zhuǎn)移;

JS/JNSOPR;結(jié)果為負(fù)/正(SF=1/0)時(shí)轉(zhuǎn)移;

JO/JNOOPR;結(jié)果溢出/無溢出(OF=1/0)時(shí)轉(zhuǎn)移;

JP(JPE)/JNP(JPO)OPR;奇偶位為偶/奇(PF=1/0)時(shí)轉(zhuǎn)移;

JC/JNCOPR;有/無借位(CF=1/0)時(shí)轉(zhuǎn)移;2023/10/1080x86匯編語言程序設(shè)計(jì)②、無符號(hào)數(shù)條件轉(zhuǎn)移指令(4條)

JB/JNAEOPR;兩個(gè)無符號(hào)數(shù)a、b比較時(shí),若a〈b時(shí)轉(zhuǎn)移,(ZF=0ANDCF=1);

JBE/JNAOPR;兩個(gè)無符號(hào)數(shù)a、b比較時(shí),若a≤b時(shí)轉(zhuǎn)移;(ZF=1ORCF=1)

JA/JNBEOPR;兩個(gè)無符號(hào)數(shù)a、b比較時(shí),若a〉b時(shí)轉(zhuǎn)移;(ZF=0ANDCF=0)

JAE/JNBOPR;兩個(gè)無符號(hào)數(shù)a、b比較時(shí),若a≥b時(shí)轉(zhuǎn)移(ZF=1ORCF=0);2023/10/1080x86匯編語言程序設(shè)計(jì)③、有符號(hào)數(shù)條件轉(zhuǎn)移指令(4條)

JG/JNLEOPR;兩個(gè)帶符號(hào)數(shù)a、b比較時(shí),若a〉b時(shí)轉(zhuǎn)移;((SF=OF)ANDZF=0)

JGE/JNLOPR;兩個(gè)帶符號(hào)數(shù)a、b比較時(shí),若a≥b時(shí)轉(zhuǎn)移;((SF=OF)ORZF=1)

JL/JNGEOPR;兩個(gè)帶符號(hào)數(shù)a、b比較時(shí),若a<b時(shí)轉(zhuǎn)移;((SF≠OF)ANDZF=0)

JLE/JNGOPR;兩個(gè)帶符號(hào)數(shù)a、b比較時(shí),若a≤b時(shí)轉(zhuǎn)移;((SF≠OF)ORZF=1)2023/10/1080x86匯編語言程序設(shè)計(jì)(二)、比較/測試分支程序設(shè)計(jì)比較指令:指令格式:CMPDEST,SRC;執(zhí)行操作:(DEST)-(SRC)對標(biāo)志的影響:OF、SF、ZF、AF、PF、CF

根據(jù)標(biāo)志位判斷源操作數(shù)和目的操作數(shù)的大小測試指令:指令格式:TESTDEST,SRC;執(zhí)行操作:(SRC)∧(DEST)對標(biāo)志位影響:SF、ZF、PF;源操作數(shù)可為:通用寄存器、存儲(chǔ)器或立即數(shù)。目的操作數(shù)不能為立即數(shù),源和目的操作數(shù)不能同時(shí)在存儲(chǔ)器中。2023/10/1080x86匯編語言程序設(shè)計(jì)分支結(jié)構(gòu)程序流程:IF(C){……}ELSE {……}……程序段1比較/測試條件滿足?程序段2YN比較/測試條件滿足?程序段YNIF(C){……}……判定條件?程序N程序1

……

CASE(C1):……

CASE(C2):……CASE(C3):……

2023/10/1080x86匯編語言程序設(shè)計(jì)例:求三個(gè)無符號(hào)數(shù)中的最大值,只要把三個(gè)數(shù)據(jù)兩兩比較,用JA/JNB/JNA/JC等指令就可判斷兩數(shù)的大小,從而選出其中最大值。2023/10/1080x86匯編語言程序設(shè)計(jì)DATASEGMENTARGDW7138H,84A6H,29EHMAXDW?DATAENDSSSEGSEGMENTSTACKSTKDB20DUP(0)SSEGENDSCODESEGMENTASSUMECS:CSEG,DS:DSEG,SS:SSEGSTART:MOVAX,DATAMOVDS,AXMOVSS,AXMOVSP,SIZESTKLEASI,ARGMOVAX,[SI]MOVBX,[SI+2]CMPAX,BX2023/10/1080x86匯編語言程序設(shè)計(jì)JAEFMAX1MOVAX,BXFMAX1:CMPAX,[SI+4]JAEFMAX2MOVAX,[SI+4]FMAX2:MOVMAX,AXMOVAH,4CHINT21HCODEENDSENDSTART2023/10/1080x86匯編語言程序設(shè)計(jì)例:設(shè)數(shù)據(jù)段中NUM1,NUM2兩字節(jié)單元有無符號(hào)整數(shù),編程完成:1、若兩個(gè)均是偶數(shù),則兩個(gè)數(shù)分別加1后送DA1、DA2字節(jié)單元中;

2、若兩個(gè)均是奇數(shù),則兩個(gè)數(shù)分別送DA1、DA2字節(jié)單元中;

3、若一個(gè)是奇數(shù),一個(gè)是偶數(shù),則把奇數(shù)送DA1,偶數(shù)送DA2字節(jié)單元中;2023/10/1080x86匯編語言程序設(shè)計(jì)開始(NUIM1)→AL,(NUM2)→AH(AL)0=0?(AH)0=0?(AL)→(DA1)(AH)→(DA2)結(jié)束YYNN(AL+1)→(AL)(AH+1)→(AH)(AH)←→(AL)END0L12023/10/1080x86匯編語言程序設(shè)計(jì)DATA SEGMENTNUM1DB45HNUM2DB0AEHDA1 DB ?DA2 DB ?DATA ENDSSTACK1SEGMENTPARA STACK STADW 20H DUP(0)STACK1ENDSCOSEGSEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1BEGIN:MOVAX,DATA MOVDS,AX2023/10/1080x86匯編語言程序設(shè)計(jì) MOVAL,NUM1 MOVAH,NUM2 TESTAL,01H JNEEND0;奇數(shù)

TESTAH,01H;偶數(shù)

JNE L1 INC AL;雙偶數(shù)

INC AH JMP END0L1: XCHG AL,AHEND0: MOV DA1,AL MOV DA2,AH MOV AH,4CH INT 21HCOSEG ENDS END BEGIN

2023/10/1080x86匯編語言程序設(shè)計(jì)例5-7設(shè)某程序有8路分支,試根據(jù)給定的N值(1~8),將程序的執(zhí)行轉(zhuǎn)移到其中的一路分支。

2023/10/1080x86匯編語言程序設(shè)計(jì)程序如下:DATA SEGMENTTAB DWP1,P2,P3,P4,P5,P6,P7,P8NDB5DATA ENDSSTACK SEGMENT DB200DUP(0)STACK ENDSCODE SEGMENT ASSUMEDS:DATA,SS:STACK,CS:CODE2023/10/1080x86匯編語言程序設(shè)計(jì) START:

MOV AX,DATA MOV DS,AX

┆ MOV AL,N DEC AL ADD AL,AL;AL=(N-1)*2 MOV BL,AL MOV BH,0 JMP TAB[BX]2023/10/1080x86匯編語言程序設(shè)計(jì)P1:

……

┆ JMP EXITP2:

……

┆ JMP EXITP2:

……

┆ JMP EXITP3:

……

┆2023/10/1080x86匯編語言程序設(shè)計(jì) JMP EXIT

┆P8:

……

┆EXIT:

MOV AH,4CH INT 21HCODE ENDS END START

上述程序中的無條件轉(zhuǎn)移指令的轉(zhuǎn)移地址采用的是變址尋址。同理,轉(zhuǎn)移地址也可以用寄存器間接尋址或基址加變址尋址,讀者可自行考慮。2023/10/1080x86匯編語言程序設(shè)計(jì)5.4.2雙分支結(jié)構(gòu)

雙分支結(jié)構(gòu)相當(dāng)于高級(jí)語言的IF-THEN-ELSE形式。IF-THEN結(jié)構(gòu)只是IF-THEN-ELSE形式的特例,即ELSE部分為空。通常,使用條件轉(zhuǎn)移指令Jcc與無條件轉(zhuǎn)移指令JMP來實(shí)現(xiàn)分支。一般必須先安排比較或算術(shù)、邏輯運(yùn)算等影響標(biāo)志位的指令,然后用Jcc指令判斷條件,以實(shí)現(xiàn)分支轉(zhuǎn)移。2023/10/1080x86匯編語言程序設(shè)計(jì)

對應(yīng)于IF-THEN-ELSE結(jié)構(gòu)的80x86匯編語言代碼形如:

<為測試條件cc做準(zhǔn)備> JccElseCode <THEN程序段> jmpEndOfIFElseCode: <ELSE程序段>EndOfIF:

注意,程序隱含是順序執(zhí)行的,在THEN分支體執(zhí)行后,不會(huì)自動(dòng)跳過ELSE分支體,而是繼續(xù)執(zhí)行其后的代碼。2023/10/1080x86匯編語言程序設(shè)計(jì)5.4.2雙分支結(jié)構(gòu)對應(yīng)于IF-THEN結(jié)構(gòu)的80x86匯編語言代碼形如:

<為測試條件cc做準(zhǔn)備> Jcc EndOfIF <THEN程序段>EndOfIF:2023/10/1080x86匯編語言程序設(shè)計(jì)5.4.3多分支結(jié)構(gòu)

多分支結(jié)構(gòu)相當(dāng)于高級(jí)語言的CASE語句。多分支程序的設(shè)計(jì)方法主要有:邏輯分解方法將多分支結(jié)構(gòu)以邏輯等效的方法,分解為一串雙分支結(jié)構(gòu)。地址表方法在數(shù)據(jù)段定義一個(gè)地址表,依次存放各分支對應(yīng)處理程序的入口地址。通過將相應(yīng)處理程序入口地址取入某寄存器,用間接轉(zhuǎn)移指令實(shí)現(xiàn)轉(zhuǎn)移。2023/10/1080x86匯編語言程序設(shè)計(jì)轉(zhuǎn)移表方法在代碼段建立一個(gè)轉(zhuǎn)移表,依次存放實(shí)現(xiàn)各分支的轉(zhuǎn)移指令。通過跳到轉(zhuǎn)移表的相應(yīng)位置執(zhí)行其中的轉(zhuǎn)移指令,從而實(shí)現(xiàn)轉(zhuǎn)到相應(yīng)分支的處理程序。2023/10/1080x86匯編語言程序設(shè)計(jì)5.5循環(huán)結(jié)構(gòu)

5.5.1循環(huán)結(jié)構(gòu)的基本形式2023/10/1080x86匯編語言程序設(shè)計(jì)5.5.2循環(huán)程序的控制方法(1)計(jì)數(shù)控制適用于循環(huán)次數(shù)已知的情況,包括正計(jì)數(shù)與倒計(jì)數(shù)兩種方法。(2)條件控制在實(shí)際問題中,常常有循環(huán)次數(shù)未知的情況。此時(shí),就必須通過特定條件來控制循環(huán)。(3)開關(guān)控制

2023/10/1080x86匯編語言程序設(shè)計(jì)

有時(shí),循環(huán)內(nèi)部又有分支,且每次循環(huán)執(zhí)行的分支具有一定規(guī)律,這種結(jié)構(gòu)非常類似于多分支結(jié)構(gòu)。此時(shí),可以采用開關(guān)來控制循環(huán)。具體方法是:在進(jìn)入循環(huán)前,預(yù)置第一次循環(huán)的開關(guān)走向;在每次循環(huán)結(jié)束前,設(shè)置下一個(gè)開關(guān)方向,以便執(zhí)行相應(yīng)的操作。在實(shí)際應(yīng)用中,開關(guān)的形式多種多樣。例如,設(shè)置一個(gè)狀態(tài)變量,取值0、1和2,分別表示執(zhí)行的不同操作,就是一個(gè)開關(guān)。(4)邏輯尺控制如果循環(huán)內(nèi)分支的規(guī)律性不強(qiáng),開關(guān)控制方法就難以勝任了。一種較有效的方法就是邏輯尺控制。所謂邏輯尺,就是一個(gè)位串,用1位或多位來控制每次循環(huán)所執(zhí)行的操作。

2023/10/1080x86匯編語言程序設(shè)計(jì)(一)、循環(huán)程序結(jié)構(gòu)流程初始化部分循環(huán)結(jié)束?結(jié)束處理DO{……}WHILE(C)NWHILE(C){……}工作部分修改部分Y初始化部分循環(huán)結(jié)束?結(jié)束處理N工作部分修改部分Y2023/10/1080x86匯編語言程序設(shè)計(jì)(二)、循環(huán)控制指令1、LOOP指令指令格式:LOOPTARGET執(zhí)行功能:CX-1→CX;CX≠0時(shí),(繼續(xù)循環(huán),)轉(zhuǎn)到TARGET所指的指令,CX=0時(shí),順序執(zhí)行。例:編制裴波納契數(shù)數(shù)列程序0,1,1,2,3,5,8,……

…… MOV AX,0 MOV BX,1LOP: MOV [DI],AX ADD AX,BX XCHG AX,BX ADD DI,TYPEFIBONA LOOP LOP

……CX←數(shù)據(jù)個(gè)數(shù)DI←數(shù)據(jù)首地址CX=0?AX←AX+BXN(DI)←AXAX←→BXY開始結(jié)束CX←CX-1DI←DI+2AX←0,BX←12023/10/1080x86匯編語言程序設(shè)計(jì)2、LOOPE/LOOPZ指令指令格式:LOOPE/LOOPZTARGET功能:CX-1→CX;若CX≠0且ZF=1時(shí),轉(zhuǎn)到TARGET所指的指令(繼續(xù)循環(huán)),若CX=0或ZF=0時(shí),順序執(zhí)行。例:編制尋找字符串‘

CHECKSTRING’中第一個(gè)非空格字符。若有,將字符的位置送指定存儲(chǔ)單元中,否則將0FFH送指定單元中。 ……

MOV BX,-1NEXT: INC BX CMP STRING[BX],20H LOOPE NEXT JNE OK;找到第一個(gè)非空格字符

MOVBL,0FFH JMPOK2OK: INCBLOK2:MOVINDEX,BL

……CX←字串個(gè)數(shù)BX←-1(取數(shù)計(jì)數(shù))數(shù)為空格?(INDEX)←BLNBX←BX+1取數(shù)與20H比較Y開始結(jié)束CX←CX-1BL←BL+1CX=0?NBL←0FFHY2023/10/1080x86匯編語言程序設(shè)計(jì)3、LOOPNE/LOOPNZ指令指令格式:LOOPNE/LOOPNZTARGET執(zhí)行功能:CX-1→CX;若CX≠0且ZF=0時(shí),轉(zhuǎn)到TARGET所指的指令(繼續(xù)循環(huán)),若CX=0或ZF=1時(shí),順序執(zhí)行。例:設(shè)一字節(jié)數(shù)組ARRAY,對其中每一數(shù)用0FH除,用余數(shù)組成數(shù)組TUSHU。若余數(shù)為0或數(shù)組取完時(shí),停止,并把余數(shù)個(gè)數(shù)存入LEN。

……

MOV DL,0FHNO_ZERO:MOV AL,ARRAY[BX] XOR AH,AH DIVDL MOVYUSHU[BX],AH INCBX CMPAH,0 LOOPNENO_ZERO MOVLEN,BX

……CX←字串個(gè)數(shù)BX←0(取數(shù)計(jì)數(shù))余數(shù)為0?(LEN)←BXNYUSHU←余數(shù)取數(shù)與0FH相除Y開始結(jié)束CX←CX-1BX←BX+1CX=0?NY2023/10/1080x86匯編語言程序設(shè)計(jì)4、JCXZ指令指令格式:JCXZTARGET執(zhí)行功能:測試CX值,若CX=0,轉(zhuǎn)到目標(biāo)處(繼續(xù)循環(huán)),否則,順序執(zhí)行。(三)、循環(huán)控制方法(計(jì)數(shù)法、條件法)例:統(tǒng)計(jì)某數(shù)組中相鄰兩數(shù)據(jù)間符號(hào)變化次數(shù)。

……

XOR BL,BLEXCHANG:MOV AL,[SI] XOR AL,[SI+1] TESTAL,80H JENEXT INCBLNEXT: INCSI LOOPEXCHANG MOVNUM,BLCX←數(shù)據(jù)個(gè)數(shù)SI←數(shù)組首址AL.7=1?NUM←BLNAL←(SI)BL←0,計(jì)數(shù)N開始結(jié)束CX←CX-1AL←AL⊕(SI+1)CX=0?YBL←BL+1SI←SI+1Y2023/10/1080x86匯編語言程序設(shè)計(jì)(四)、多重循環(huán)程序設(shè)計(jì)的特點(diǎn)1、設(shè)計(jì)方法和單重循環(huán)基本類似;2、各重循環(huán)的控制條件及其程序?qū)崿F(xiàn)相互之間不能混淆;3、每次通過外層循環(huán)再次進(jìn)入內(nèi)層循環(huán)時(shí),初始條件必須重新設(shè)置;

2023/10/1080x86匯編語言程序設(shè)計(jì)例:在存儲(chǔ)區(qū)制作九九乘法表。

1*11*2 1*31*41*5…

MOVBH,0 MOVCX,9LOP1:PUSHCX INCBH MOVBL,0 MOVCX,9LOP2: INCBL MOVAL,BH MULBL MOV[DI],AL INCDI LOOPLOP2POPCXLOOPLOP1

……DI←存數(shù)據(jù)首址CX←9BH←0,BL←0(行,列)CX-1=0?POPCXNBH←BH+1,BL←0PUSHCX開始結(jié)束CX←9CX-1=0?NYAL←BL*BH(DI)←ALYDI←DI+1BL←BL+12023/10/1080x86匯編語言程序設(shè)計(jì)

BX1234例:把BX中的二進(jìn)制數(shù)以十六進(jìn)制的形式顯示在屏幕上2023/10/1080x86匯編語言程序設(shè)計(jì)

……

movch,4rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30h;’0’~’9’ASCII30H~39Hcmpal,3ahjlprintitaddal,7h;’A’~’F’ASCII41H~46Hprintit:movdl,almovah,2int21hdecchjnzrotate

……2023/10/1080x86匯編語言程序設(shè)計(jì)

……movbx,0newchar:movah,1;鍵盤輸入

int21hsubal,30hjlexit;<0退出

cmpal,9jgexit;>9退出

cbwxchgax,bxmovcx,10mulcxxchgax,bxaddbx,axjmpnewcharexit:……例:從鍵盤接收十進(jìn)制數(shù)并存入BX((0×10)+1)×10+2)×10+51253132352023/10/1080x86匯編語言程序設(shè)計(jì)

……movbx,0newchar:movah,1;鍵盤輸入

int21hsubal,30hjlexit;<0退出

cmpal,10jladd_tosubal,27h;‘a(chǎn)’~‘f’cmpal,0ahjlexit;<‘a(chǎn)’退出

cmpal,10hjgeexit;>’f’退出add_to:movcl,4shlbx,clmovah,0addbx,axjmpnewcharexit:……例:從鍵盤接收十六進(jìn)制數(shù)并存入BX1af316166((0×16)+1)×16+0a)×16+0f2023/10/1080x86匯編語言程序設(shè)計(jì)xdw?array_headdw3,5,15,23,37,49,52,65,78,99array_enddw105ndw32例:將正數(shù)n

插入一個(gè)已排序的正數(shù)字?jǐn)?shù)組……movax,nmovarray_head-2,0ffffhmovsi,0compare:cmparray_end[si],axjleinsertmovbx,array_end[si]movarray_end[si+2],bxsubsi,2jmpshortcompareinsert:movarray_end[si+2],ax……35152337495265789910532-1array_head

array_end

n

x

2023/10/1080x86匯編語言程序設(shè)計(jì)例:

將首地址為A的字?jǐn)?shù)組從小到大排序(氣泡算法,多重循環(huán))

32,85,16,15,8

序號(hào)地址數(shù)比較遍數(shù)12341A322A+2853A+4164A+6155A+883216158851615832851581632858151632852023/10/1080x86匯編語言程序設(shè)計(jì)movcx,5;元素個(gè)數(shù)

deccx;比較遍數(shù)loop1:movdi,cx;比較次數(shù)

movbx,0loop2:movax,A[bx];相鄰兩數(shù)

cmpax,A[bx+2];比較

jlecontinuexchgax,A[bx+2];交換位置

movA[bx],axcontinue:addbx,2looploop2movcx,dilooploop12023/10/1080x86匯編語言程序設(shè)計(jì)例:有數(shù)組x(x1,x2,……,x10)和y(y1,y2,……,y10),

編程計(jì)算

z(z1,z2,……,z10)z1=x1+y1z2=x2+y2z3=x3-y3z4=x4-y4z5=x5-y5z6=x6+y6z7=x7-y7z8=x8-y8z9=x9+y9z10=x10+y10

邏輯尺:00110111001減法0加法2023/10/1080x86匯編語言程序設(shè)計(jì)xdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_ruledw00dch;0000,0000,1101,1100

……

movbx,0movcx,10movdx,logic_rulenext:movax,x[bx]shrdx,1jcsubtractaddax,y[bx]jmpshortresult;向前引用subtract:subax,y[bx]result:movz[bx],axaddbx,2loopnext……2023/10/1080x86匯編語言程序設(shè)計(jì)datasegmentarraydw12,11,22,33,44,55,66,77,88,99,111,222,333numberdw55low_idxdw?high_idxdw?dataends例:折半查找算法2023/10/1080x86匯編語言程序設(shè)計(jì)121122334455667788991112223330123456789101112折半算法12023/10/1080x86匯編語言程序設(shè)計(jì)……leadi,arraymovax,number;要查找數(shù)

cmpax,[di+2];(ax)與第一個(gè)元素比較

jachk_lastleasi,[di+2]jeexit;(ax)=第一個(gè)元素,找到退出

stcjmpexit;(ax)<第一個(gè)元素,未找到退出chk_last:movsi,[di];元素個(gè)數(shù)

shlsi,1;計(jì)算最后一個(gè)元素

addsi,di;的地址

cmpax,[si];(ax)與最后一個(gè)元素比較

jbsearchjeexit;(ax)=最后一個(gè)元素,找到退出

stcjmpexit;(ax)>最后一個(gè)元素,未找到退出算法12023/10/1080x86匯編語言程序設(shè)計(jì)compare:cmpax,[bx+si]jeexitjahigher

deccxmovhigh_idx,cxjmpmidhigher:

inccxmovlow_idx,cxjmpmidno_match:stcexit:……search:movlow_idx,1movbx,[di];個(gè)數(shù)

movhigh_idx,bxmovbx,dimid:movcx,low_idxmovdx,high_idxcmpcx,dxjano_matchaddcx,dxshrcx,1movsi,cxshlsi,12023/10/1080x86匯編語言程序設(shè)計(jì)例:根據(jù)AL寄存器中哪一位為1(從低位到高位),把程序轉(zhuǎn)移到8個(gè)不同的程序分支branch_tabledwroutine1dwroutine2dwroutine3dwroutine4dwroutine5dwroutine6dwroutine7dwroutine82023/10/1080x86匯編語言程序設(shè)計(jì)

……

cmpal,0;AL為邏輯尺

jecontinueleabx,branch_tableL:shral,1;邏輯右移

jncadd1jmpwordptr[bx]

;段內(nèi)間接轉(zhuǎn)移add1:addbx,typebranch_table;addbx,2jmpLcontinue:……routine1:……routine2:……

(寄存器間接尋址)2023/10/1080x86匯編語言程序設(shè)計(jì)(寄存器相對尋址)……cmpal,0jecontinuemovsi,0L:shral,1;邏輯右移

jncadd1jmpbranch_table[si];段內(nèi)間接轉(zhuǎn)移add1:addsi,typebranch_tablejmpLcontinue:……routine1:……routine2:……2023/10/1080x86匯編語言程序設(shè)計(jì)(基址變址尋址)

……

cmpal,0jecontinueleabx,branch_tablemovsi,7*typebranch_tablemovcx,8L:shlal,1;邏輯左移

jncsub1jmpwordptr[bx][si]

;段內(nèi)間接轉(zhuǎn)移sub1:subsi,typebranch_table;(si)-2loopLcontinue:……routine1:……routine2:……2023/10/1080x86匯編語言程序設(shè)計(jì)5.6串操作

5.6.1串操作指令及其用途2023/10/1080x86匯編語言程序設(shè)計(jì)(2)LODS(LoadString):串裝入語法格式:

LODSB LODSW LODSD

功能描述:

AL/AX/EAX=DS:[SI]; if(DF=0)then SI=SI+size; else SI=SI–size; endif

其中,size=1(B)、2(W)或4(D)。也就是說,LODS(B/W/D)將DS:SI所指源串的1個(gè)元素(字節(jié)/字/雙字)復(fù)制到AL/AX/EAX。然后,SI增加或減少1/2/4。若DF=0,則增加,否則減少。對標(biāo)志位的影響:無。2023/10/1080x86匯編語言程序設(shè)計(jì)(3)STOS(StoreString):串存儲(chǔ)語法格式:

STOSB STOSW STOSD

功能描述:

ES:[DI]=AL/AX/EAX; if(DF=0)then DI=DI+size; elseDI=DI–size; endif

其中,size=1(B)、2(W)或4(D)。也就是說,STOS(B/W/D)將AL/AX/EAX的值復(fù)制到ES:DI所指的內(nèi)存單元。然后,DI增加或減少1/2/4。若DF=0,則增加,否則減少。對標(biāo)志位的影響:無。2023/10/1080x86匯編語言程序設(shè)計(jì)(4)CMPS(CompareStrings):串比較

語法格式:

CMPSB CMPSW CMPSD

功能描述:

DS:[SI]–ES:[DI

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論