《程序設(shè)計》課件.ppt_第1頁
《程序設(shè)計》課件.ppt_第2頁
《程序設(shè)計》課件.ppt_第3頁
《程序設(shè)計》課件.ppt_第4頁
《程序設(shè)計》課件.ppt_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

分支程序設(shè)計循環(huán)程序設(shè)計 循環(huán)與分支程序設(shè)計 分支結(jié)構(gòu)子程序結(jié)構(gòu) 程序結(jié)構(gòu) 復(fù)合結(jié)構(gòu) 多種程序結(jié)構(gòu)的組合 順序結(jié)構(gòu)循環(huán)結(jié)構(gòu) 編制匯編語言程序的步驟 1 分析題意 確定算法 2 根據(jù)算法畫出程序框圖 3 根據(jù)框圖編寫程序 4 上機調(diào)試程序 例 從鍵盤上鍵人0 9中任一自然數(shù)N 將其立方值送顯示器顯示 datasegmentINPUTDB PLEASEINPUTN O 9 LFBDB0 1 8 27 64 125 216 343 512 729 NDB dataends MOVDX OFFSETINPUTMOVAH 91NT21HMOVAH 1INT21HMOVN ALMOVAH 2MOVDL OAHINT21H MOVDL NANDDL 0FHMOVCL 2SHLDL CLMOVDH 0ADDDX OFFSETLFBMOVAH 9INT21H 1 分支程序設(shè)計 case1case2casen case1case2casen CASE結(jié)構(gòu)IF THEN ELSE結(jié)構(gòu) 1 邏輯尺控制 2 條件控制 3 地址跳躍表 值與地址有對應(yīng)關(guān)系的表 控制轉(zhuǎn)移指令 無條件轉(zhuǎn)移指令JMP 條件轉(zhuǎn)移指令JZ JNZ JE JNE JS JNS JO JNO JP JNP JB JNB JL JNL JBE JNBE JLE JNLE JCXZ 循環(huán)指令LOOP LOOPZ LOOPE LOOPNZ LOOPNE 子程序調(diào)用和返回指令CALL RET 中斷與中斷返回指令I(lǐng)NT INTO IRET 無條件轉(zhuǎn)移指令 段內(nèi)直接短轉(zhuǎn)移 JMPSHORTOPR執(zhí)行操作 IP IP 8位位移量段內(nèi)直接近轉(zhuǎn)移 JMPNEARPTROPR執(zhí)行操作 IP IP 16位位移量段內(nèi)間接轉(zhuǎn)移 JMPWORDPTROPR執(zhí)行操作 IP EA 段間直接遠轉(zhuǎn)移 JMPFARPTROPR執(zhí)行操作 IP OPR的段內(nèi)偏移地址 CS OPR所在段的段地址段間間接轉(zhuǎn)移 JMPDWORDPTROPR執(zhí)行操作 IP EA CS EA 2 條件轉(zhuǎn)移指令 注意 只能使用段內(nèi)直接尋址的8位位移量 1 根據(jù)單個條件標志的設(shè)置情況轉(zhuǎn)移格式測試條件JZ JE OPRZF 1JNZ JNE OPRZF 0JSOPRSF 1JNSOPRSF 0JOOPROF 1JNOOPROF 0JPOPRPF 1JNPOPRPF 0JCOPRCF 1JNCOPRCF 0 2 比較兩個無符號數(shù) 并根據(jù)比較結(jié)果轉(zhuǎn)移 格式測試條件 JB JNAE JC OPRCF 1 JNB JAE JNC OPRCF 0 JBE JNA OPRCF ZF 1 JNBE JA OPRCF ZF 0 適用于地址或雙精度數(shù)低位字的比較 3 比較兩個帶符號數(shù) 并根據(jù)比較結(jié)果轉(zhuǎn)移 格式測試條件 JL JNGE OPRSF OF 1 JNL JGE OPRSF OF 0 JLE JNG OPR SF OF ZF 1 JNLE JG OPR SF OF ZF 0 適用于帶符號數(shù)的比較 4 測試CX的值為0則轉(zhuǎn)移格式測試條件JCXZOPR CX 0 單分支程序設(shè)計 條件成立跳轉(zhuǎn) 否則順序執(zhí)行分支語句體 注意選擇正確的條件轉(zhuǎn)移指令和轉(zhuǎn)移目標地址 例 如果X 50 轉(zhuǎn)到TOO HIGH 否則 X Y RESULT 如果溢出轉(zhuǎn)到OVERFLOW 例 計算AX的絕對值cmpax 0jnsnonneg 分支條件 AX 0negax 條件不滿足 求補nonneg movresult ax 條件滿足 計算AX的絕對值cmpax 0jlyesneg 分支條件 AX 0jmpnonnegyesneg negax 條件不滿足 求補nonneg movresult ax 條件滿足 例 從鍵盤輸入一個字符 判斷是否為大寫字母 是大寫字母則轉(zhuǎn)換為小寫顯示 代碼段callreadc 輸入一個字符 從AL返回值cmpal A 與大寫字母A比較jbdone 比大寫字母A小 不是大寫字母 轉(zhuǎn)移cmpal Z 與大寫字母Z比較jadone 比大寫字母Z大 不是大寫字母 轉(zhuǎn)移oral 20h 轉(zhuǎn)換為小寫calldispcrlf 回車換行 用于分隔 calldispc 顯示小寫字母done JB JA 條件成立跳轉(zhuǎn)執(zhí)行第2個分支語句體 否則順序執(zhí)行第1個分支語句體 注意第1個分支體后一定要有一個JMP指令跳到第2個分支體后 雙分支程序設(shè)計 shlbx 1 BX最高位移入CFjcone CF 1 即最高位為1 轉(zhuǎn)移movdl 0 CF 0 即最高位為0 DL 0 jmptwo 一定要跳過另一個分支體one movdl 1 DL 1 two movah 2int21h 顯示 例顯示BX最高位 例判斷有無實根 startupmoval bimulal al al axmovbx ax BX中為b2moval aimul cmovcx 4imulcx AX中為4ac DX無有效數(shù)據(jù) cmpbx ax 比較大小jgeyes 條件滿足 movtag 0 tag 0jmpdone yes movtag 1done exit0 例 將AX中存放的無符號數(shù)除以2 如果是奇數(shù) 則加1后除以2testax 01h 測試AX最低位jzeven 最低位為0 AX為偶數(shù)addax 1 最低位為1 AX為奇數(shù) 需要加1even rcrax 1 AX AX 2 如果采用SHR指令 則不能處理AX FFFFH的特殊情況 BX 1234 例 把BX中的二進制數(shù)以十六進制的形式顯示在屏幕上 MOVBX 1234HMOVCH 4 CH做循環(huán)計數(shù)器ROT MOVCL 4 CL做移位計數(shù)器ROLBX CL 將最高4位移到低4位MOVAL BLANDAL 0FH 取出低4位ADDAL 30H 轉(zhuǎn)換為ASCII碼CMPAL 39H 與 9 比較JBEDISP 若 AL 9 則轉(zhuǎn)顯示ADDAL 7 若 AL 9 再加7轉(zhuǎn)為 A F DISP MOVDL AL DL 字符MOVAH 2INT21H 顯示輸出DECCH 4個十六進制數(shù)顯示完否 JNZROT 沒有 循環(huán)MOVDL 48H H MOVAH 2INT21H 最后顯示 H 例 有數(shù)組x x1 x2 x10 和y y1 y2 y10 編程計算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加法 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 例 某工廠的產(chǎn)品共有8種加工處理程序P0 P7 而某產(chǎn)品應(yīng)根據(jù)不同情況 作不同的處理 其選擇由鍵入的值0 7來決定 若鍵入0 7以外的鍵 則退出該產(chǎn)品的加工處理程序 datasegmentINPUTDB INPUT 0 7 PTABDWP0 P1 P2 P3 P4 P5 P6 P7dataendsAGAIN MOVDX OFFSETINPUTMOVAH 9INT21HMOVAH 1INT21HCMPAL 0 JBEXITCMPAL 7 JAEXITANDAX 0FHADDAL AL MOVBX AXJMPPTAB BX EXIT RETP0 JMPAGAIN P7 JMPAGAIN datasegmentarraydw12 11 22 33 44 55 66 77 88 99 111 222 333numberdw55low idxdw high idxdw dataends 例 折半查找算法 12112233445566778899111222333 0123456789101112 si 0ahCf 0 si 10hCf 1 折半算法1 leadi arraymovax number 要查找數(shù)cmpax di 2 ax 與第一個元素比較jachk lastleasi di 2 jeexit ax 第一個元素 找到退出stcjmpexit ax 最后一個元素 未找到退出 算法1 compare cmpax bx si jeexitjahigherdeccxmovhigh idx cxjmpmidhigher inccxmovlow idx cxjmpmidno match stcexit search movlow idx 1movbx di 個數(shù)movhigh idx bxmovbx dimid movcx low idxmovdx high idxcmpcx dxjano matchaddcx dxshrcx 1movsi cxshlsi 1 12112233445566778899111222333 0123456789101112 si 0ah di 0ahCf 0 si 2 di 10hCf 1 折半算法2 算法2 idx ok shrsi 1testsi 1jzsub idxincsisub idx subdi sijmpshortcomparehigher cmpsi 2jeno matchshrsi 1jmpshorteven idxall done movsi diexit search movsi di even idx testsi 1jzadd idxincsiadd idx adddi sicompare cmpax di jeall donejahighercmpsi 2jneidx okno match stcjmpexit 例 根據(jù)AL寄存器中哪一位為1 從低位到高位 把程序轉(zhuǎn)移到8個不同的程序分支 branch tabledwroutine1dwroutine2dwroutine3dwroutine4dwroutine5dwroutine6dwroutine7dwroutine8 cmpal 0 AL為邏輯尺jecontinueleabx branch tableL shral 1 邏輯右移jncadd1jmpwordptr bx 段內(nèi)間接轉(zhuǎn)移add1 addbx typebranch table addbx 2jmpLcontinue routine1 routine2 寄存器間接尋址 寄存器相對尋址 cmpal 0jecontinuemovsi 0L shral 1 邏輯右移jncadd1jmpbranch table si 段內(nèi)間接轉(zhuǎn)移add1 addsi typebranch tablejmpLcontinue routine1 routine2 基址變址尋址 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 2 循環(huán)程序設(shè)計 DO WHILE結(jié)構(gòu)DO UNTIL結(jié)構(gòu) 控制條件 初始化 循環(huán)體 Y N 控制條件 初始化 循環(huán)體 Y N 初始化 設(shè)置循環(huán)的初始狀態(tài)循環(huán)體 循環(huán)的工作部分及修改部分控制條件 計數(shù)控制特征值控制地址邊界控制 循環(huán)指令 loop 循環(huán)指令默認利用CX計數(shù)器 方便實現(xiàn)計數(shù)循環(huán)的程序結(jié)構(gòu)label操作數(shù)采用相對尋址方式 LOOPlabel CX CX 1 CX 0 循環(huán)到標號label LOOPZlabel CX CX 1 CX 0且ZF 1 循環(huán)到標號label LOOPZlabel CX CX 1 CX 0且ZF 0 循環(huán)到標號label JCXZlabel CX 0 轉(zhuǎn)移到標號label 例 數(shù)組求和程序 次數(shù)控制循環(huán) 數(shù)據(jù)段arraydw6 8 3 13 16 數(shù)組sumdword 結(jié)果變量 代碼段movcx lengthofarray ECX 數(shù)組元素個數(shù)xorax ax 求和初值為0movbx ax 數(shù)組指針為0again addax array bx typearray 求和incbx 指向下一個數(shù)組元素loopagainmovsum ax 保存結(jié)果calldispsid 顯示結(jié)果 例 字符個數(shù)統(tǒng)計程序 條件控制循環(huán) 數(shù)據(jù)段stringdb DoyouhavefunwithAssembly 0 以0結(jié)尾的字符串 代碼段xorbx bx EBX記錄字符個數(shù) 同時也指向字符的指針again moval string ebx cmpal 0 用指令 testal al 更好jzdoneincbx 個數(shù)加1jmpagain 繼續(xù)循環(huán)done movax ebx 顯示個數(shù)calldispuid movbx 0newchar movah 1 鍵盤輸入int21hsubal 30hjlexit 9退出cbwxchgax bxmovcx 10mulcxxchgax bxaddbx axjmpnewcharexit 例 從鍵盤接收十進制數(shù)并存入BX 0 10 1 10 2 10 5 movbx 0newchar movah 1 鍵盤輸入int21hsubal 30hjlexit f 退出add to movcl 4shlbx clmovah 0addbx axjmpnewcharexit 例 從鍵盤接收十六進制數(shù)并存入BX 1af316166 0 16 1 16 0a 16 0f xdw array headdw3 5 15 23 37 49 52 65 78 99array enddw105ndw32 例 將正數(shù)n插入一個已整序的正數(shù)字數(shù)組 105 array head array end n x modelsmall stack datasumdw code startupxorax ax 被加數(shù)AX清0movcx 100again addax cx 從100 99 2 1倒序累加loopagainmovsum ax 將累加和送入指定單元 exit0end 計數(shù)控制循環(huán)循環(huán)次數(shù)固定 例 求1 2 3 100 例將字節(jié)變量SB中的8位二進數(shù)送顯示器顯示 分析 先將字節(jié)變量中的1位二進制數(shù)移入AH中 再將移入的二進制數(shù)變?yōu)锳SCII碼 為了避免通過CF來傳遞二進制數(shù) 先將SB中的8位二進制數(shù)送入AL中 再左移AX 將1位二進制數(shù)直接移入AH中 數(shù)據(jù)段 SBDB9AHOBUFDB9DUP 0 代碼段 MOVCX 8MOVBX 0MOVAL SBAGAIN MOVAH 0SHLAX 1ADDAH 30HMOVOBUF BX AHINCBXLOOPAGAINMOV0BUF BX MOVDX OFFSETOBUFMOVAH 9INT21Hret 例 大小寫字母轉(zhuǎn)換 movbx offsetstringagain moval bx 取一個字符oral al 是否為結(jié)尾符0jzdone 是 退出循環(huán)cmpal A 是否為大寫A Zjbnextcmpal Z janextoral 20h 是 轉(zhuǎn)換為小寫字母 使D5 1 mov bx al 仍保存在原位置next incbxjmpagain 繼續(xù)循環(huán)done exit0 條件控制循環(huán)利用標志退出 例 將首地址為A的字數(shù)組從小到大排序 氣泡算法 多重循環(huán) 32 85 16 15 8 冒泡法 是一種排序算法 不是最優(yōu)的算法 但它易于理解和實現(xiàn)冒泡法從第一個元素開始 依次對相鄰的兩個元素進行比較 使前一個元素不大于后一個元素 將所有元素比較完之后 最大的元素排到了最后 然后 除掉最后一個元素之外的元素依上述方法再進行比較 得到次大的元素排在后面 如此重復(fù) 直至完成就實現(xiàn)元素從小到大的排序這需要一個雙重循環(huán)程序結(jié)構(gòu) 多重循環(huán)即循環(huán)體內(nèi)再套有循環(huán) movcx count CX 數(shù)組元素個數(shù)deccx 元素個數(shù)減1為外循環(huán)次數(shù)outlp movdx cx DX 內(nèi)循環(huán)次數(shù)movbx offsetarrayinlp moval bx 取前一個元素cmpal bx 1 與后一個元素比較jnanext 前一個不大于后一個元素 則不進行交換xchgal bx 1 否則 進行交換mov bx alnext incbx 下一對元素decdxjnzinlp 內(nèi)循環(huán)尾loopoutlp 外循環(huán)尾 方法1 方法2 movcx 5 元素個數(shù)de

溫馨提示

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

評論

0/150

提交評論