版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第5章 循環(huán)與分支程序設計Assembly Language Programming編制匯編語言程序的步驟:編制匯編語言程序的步驟:(1) 分析題意,確定算法分析題意,確定算法(2) 根據算法畫出程序框圖根據算法畫出程序框圖(3) 根據框圖編寫程序根據框圖編寫程序(4) 上機調試程序(上機調試程序(自己完成自己完成)3 順序結構順序結構 循環(huán)結構循環(huán)結構 分支結構分支結構 子程序結構子程序結構 復合結構:復合結構:多種程序結構的組合多種程序結構的組合程序結構:程序結構:順序程序完全按指令書寫的前后順序執(zhí)行每一條指令,是最基本、最常見的程序結構例例1 1Data Data segmentsegm
2、ent X X dwdw 33 33 Y Y dwdw 47 47 Z Z dwdw 65 65 W W dwdw ? ?Data Data endsendsCodeCode segmentsegment assume assume cs:codecs:codeassume assume ds:datads:dataBeginBegin:mov:mov ax,X ax,X add ax,Y add ax,Y adcadc ax,Z ax,Z movmov W,ax W,ax movmov ah,4ch ah,4ch intint 21h 21hCodeCode endsends end end
3、 BeginBegin順序程序設計順序程序設計例例2 2qvarqvar dqdq 1234567887654321h 1234567887654321hmovmov al,byte al,byte ptrptr qvar6 qvar6movmov byte byte ptrptr qvar7,al qvar7,almovmov al,byte al,byte ptrptr qvar5 qvar5movmov byte byte ptrptr qvar6,al qvar6,almovmov al,byte al,byte ptrptr qvar4 qvar4movmov byte byte p
4、trptr qvar5,al qvar5,almovmov al,byte al,byte ptrptr qvar3 qvar3movmov byte byte ptrptr qvar4,al qvar4,almovmov al,byte al,byte ptrptr qvar2 qvar2movmov byte byte ptrptr qvar3,al qvar3,almovmov al,byte al,byte ptrptr qvar1 qvar1movmov byte byte ptrptr qvar2,al qvar2,almovmov al,byte al,byte ptrptr q
5、var0 qvar0movmov byte byte ptrptr qvar1,al qvar1,almovmov byte byte ptrptr qvar0,0 qvar0,012 34 56 78 87 65 43 21h34 56 78 87 65 43 21 00h移位后圖示順序程序設計順序程序設計例例2 64位數據左移位數據左移8位的圖示位的圖示214365877856341200qvar7qvar6qvar5qvar4qvar3qvar2qvar1qvar07(1)邏輯尺控制)邏輯尺控制 (2)條件控制)條件控制(3)地址跳躍表)地址跳躍表 值與地址有對應關系的表值與地址有對應關
6、系的表case 1 case 2 case n?case 1 case 2 case 3 。5.1 分支程序設計分支程序設計IF-THEN-ELSE 結構CASE 結構8例例5.1 設有數組設有數組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 減
7、法減法 0 加法加法9x dw x1, x2, x3, x4, x5, x6, x7, x8, x9, x10y dw y1, y2, y3, y4, y5, y6, y7, y8, y9, y10z dw z1, z2, z3, z4, z5, z6, z7, z8, z9, z10logic_rule dw 00dch mov bx, 0mov cx, 10mov dx, logic_rule next: mov ax, xbxshr dx, 1jc subtractadd ax, ybxjmp short result ; 向前引用向前引用subtract: sub ax, ybx re
8、sult: mov zbx, axadd bx, 2loop next10例例5.2 根據根據AL寄存器中哪一位為寄存器中哪一位為1(從低位到高位)把程序(從低位到高位)把程序 轉移到轉移到8個不同的程序分支去個不同的程序分支去 。branch dw routine1 dw routine2 dw routine3 dw routine4 dw routine5 dw routine6 dw routine7 dw routine8 cmp al, 0 je continue lea bx, branchL: shr al, 1;邏輯右移邏輯右移 jnb add1;jnb=jnc jmp wo
9、rd ptr bx;段內間接轉移段內間接轉移add1: add bx, type branch jmp Lcontinue: routine1: routine2: (寄存器間接尋址(寄存器間接尋址)11(基址變址尋址基址變址尋址) cmp al, 0 je continue lea bx, branch mov si, 7* type branch mov cx, 8L: shl al, 1; 邏輯左移邏輯左移 jnb sub1; jnb=jnc jmp word ptr bxsi; 段內間接轉移段內間接轉移sub1: sub si, type branch loop Lcontinue:
10、routine1: routine2: 12(寄存器相對尋址寄存器相對尋址) cmp al, 0 je continue mov si, 0 L: shr al, 1; 邏輯右移邏輯右移 jnb add1; jnb=jnc jmp branch si ; 段內間接轉移段內間接轉移add1: add si, type branch jmp Lcontinue: routine1: routine2: data segmentdata segment array array dwdw 1212,11,22,33,44,55,66,11,22,33,44,55,66, 77,88,99,111,22
11、2,333 77,88,99,111,222,333 number number dwdw 55 55 low_idxlow_idx dwdw ? ? high_idxhigh_idx dwdw ? ?data endsdata ends例:折半查找算法例:折半查找算法 lea lea didi, array, array movmov ax, number ax, number cmpcmp ax, di+2 ax, di+2 ; (ax); (ax)與第一個元素比較與第一個元素比較 jaja chk_lastchk_last lea lea sisi, di+2, di+2 jeje ex
12、it exit ; (ax); (ax)第一個元素第一個元素, ,找到退出找到退出 stcstc jmpjmp exit exit ; (ax); (ax); (ax)最后一個元素最后一個元素, ,未找到退未找到退出出算法算法1 1compare:compare: cmpcmp ax, ax, bx+sibx+si jeje exit exit jaja higher higher decdec cxcx movmov high_idxhigh_idx, , cxcx jmpjmp mid midhigher:higher: inc inc cxcx movmov low_idxlow_idx
13、, , cxcx jmpjmp mid midno_match:no_match: stcstcexit:exit: search:search: movmov low_idxlow_idx, 1, 1 movmov bxbx, , didi movmov high_idxhigh_idx, , bxbx movmov bxbx, , didimid:mid: movmov cxcx, , low_idxlow_idx movmov dxdx, , high_idxhigh_idx cmpcmp cxcx, , dxdx jaja no_match no_match add add cxcx,
14、 , dxdx shrshr cxcx, 1, 1 movmov sisi, , cxcx shlshl sisi, 1, 1 1212 11 11 22 22 33 33 44 44 55 55 66 66 77 77 88 88 99 99111111222222333333 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9101011111212(ax)=55low_idxlow_idx 1 1 1 1 4 4 5 5 high_idxhigh_idx 12125 55 55 5( (sisi)=0ah)=0ahCfCf=0=0(ax)=90low_idxl
15、ow_idx 1 1 7 7 7 7 8 8 9 9 high_idxhigh_idx 121212128 88 88 8( (sisi)=10h)=10hCfCf=1=1算法算法2 2idx_okidx_ok: : shrshr sisi, 1, 1 test test sisi, 1, 1 jzjz sub_idxsub_idx inc inc sisisub_idxsub_idx: : sub sub didi, , sisi jmpjmp short compare short comparehigher:higher: cmpcmp sisi, 2, 2 jeje no_match
16、no_match shrshr sisi, 1, 1 jmpjmp short short even_idxeven_idxall_done:all_done: movmov sisi, , didiexit:exit: search:search: movmov sisi, , didi even_idxeven_idx: : test test sisi, 1, 1 jzjz add_idxadd_idx inc inc sisiadd_idxadd_idx: : add add didi, , sisicompare:compare: cmpcmp ax, ax, didi jeje a
17、ll_done all_done jaja higher higher cmpcmp sisi, 2, 2 jnejne idx_okidx_okno_match:no_match: stcstc jmpjmp exit exit 1212 11 11 22 22 33 33 44 44 55 55 66 66 77 77 88 88 99 99111111222222333333 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9101011111212(ax)=55(ax)=55 didi 12 12 6 6 10 10sisi 12126 64 4( (sis
18、i)=0ah)=0ah( (didi)=0ah)=0ahCfCf=0=0(ax)=90(ax)=90 didi 12 12 18 18 14 14 16 16 sisi 12126 64 42 2( (sisi)=2)=2( (didi)=10h)=10hCfCf=1=119(1)DO-WHILE結構結構 (2)DO-UNTIL結構結構控制條件控制條件初始化初始化循環(huán)體循環(huán)體YN控制條件控制條件初始化初始化循環(huán)體循環(huán)體YN設置循環(huán)的設置循環(huán)的初始狀態(tài)初始狀態(tài)循環(huán)的工作部分循環(huán)的工作部分及修改部分及修改部分計數控制計數控制特征值控制特征值控制地址邊界控制地址邊界控制5.2 循環(huán)程序設計循環(huán)程序設
19、計 初始化初始化:設置循環(huán)的初始狀態(tài):設置循環(huán)的初始狀態(tài) 循環(huán)體循環(huán)體:循環(huán)的工作部分及修改部分:循環(huán)的工作部分及修改部分 控制條件控制條件:計數控制:計數控制 特征值控制特征值控制 地址邊界控制地址邊界控制21例例5.1 把把BX中的二進制數以十六進制的形式顯示在屏幕上。中的二進制數以十六進制的形式顯示在屏幕上。 BX123422 mov ch, 4Label: mov cl, 4 rol bx, cl mov al, bl and al, 0fh add al, 30h ;0-9 ASCII 30H-39H cmp al, 3ah jl print add al, 7h ;A-F ASCI
20、I 41H-46Hprint: mov dl, al mov ah, 2 int 21h dec ch jnz Label movmov bxbx, 0, 0newcharnewchar: : movmov ah, 1 ah, 1 intint 21h 21h sub sub alal, 30h , 30h jljl exit exit ; ; 0 9 9 退出退出 cbwcbw xchgxchg ax, ax, bxbx movmov cxcx, 10, 10 mulmul cxcx xchgxchg ax, ax, bxbx add add bxbx, ax, ax jmpjmp newc
21、harnewcharexit: exit: 例:從鍵盤接收例:從鍵盤接收十進制十進制數并存入數并存入 BXBX movmov bxbx, 0, 0newcharnewchar: : movmov ah, 1 ah, 1 intint 21h 21h sub al, 30h sub al, 30h jljl exit exit ; ; 0 0 退出退出 cmpcmp al, 10 al, 10 jljl add_toadd_to sub al, 27h sub al, 27h ; af; af cmpcmp al, 0ah al, 0ah jljl exit exit ; ; a f f 退出退
22、出add_toadd_to: : movmov clcl, 4, 4 shlshl bxbx, , clcl movmov ah, 0 ah, 0 add add bxbx, ax, ax jmpjmp newcharnewcharexit: exit: 例:從鍵盤接收例:從鍵盤接收十六進制十六進制數并存入數并存入 BXBX.model small.model small.stack 256.stack 256.data.data sum sum dwdw ? ?.code.codebegin:begin: movmov ax,data ax,data movmov ds,axds,ax xo
23、rxor ax,ax ax,ax; ;被加數被加數AXAX清清0 0movmov cx, cx,100100 again: again:add add ax,cxax,cx; ;looploop again againmovmov sum,ax sum,ax; ;將累加和送入指定單元將累加和送入指定單元movmov ah,4ch ah,4ch intint 21h 21hend beginend begin例5.3 計算1100數字之和循環(huán)次數固定Begin:Begin:movmov bx,offsetbx,offset string stringagain:again:movmov al,b
24、xal,bx ; ;取一個字符取一個字符or al,alor al,al; ;是否為結尾符是否為結尾符0 0jzjz done done; ;是,退出循環(huán)是,退出循環(huán)cmpcmp al,A al,A; ;是否為大寫是否為大寫A AZ Zjbjb next nextcmpcmp al,Z al,Zjaja next nextor al,20hor al,20h; ;是,轉換為小寫字母(使是,轉換為小寫字母(使D5=1D5=1)movmov bx,albx,al; ;仍保存在原位置仍保存在原位置next:next:inc inc bxbxjmpjmp again again; ;繼續(xù)循環(huán)繼續(xù)循環(huán)d
25、one:done:movmov ah,4ch ah,4ch intint 21h 21h例5.5 大寫字母改為小寫字母循環(huán)次數不定,利用標志退出。操作27例例5.4 將正數將正數n插入一個已整序的字數組的正確位置。插入一個已整序的字數組的正確位置。 x dw ? array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105 n dw 32 mov ax, n mov array_head-2, 0ffffh mov si, 0compare: cmp array_endsi, ax jle insert mov bx, array_end
26、si mov array_endsi+2, bx sub si, 2 jmp short compareinsert: mov array_endsi+2, ax -1 3 5 49 15 52 23 37 105 99 78 65 32xn28 a dw 100,30,78,99,15,-1,66,54,189,256 mov cx, 10 dec cxloop1: mov di, cx mov bx, 0loop2: mov ax, abx cmp ax, abx+2 jge continue xchg ax, abx+2 mov abx, axcontinue: add bx, 2 lo
27、op loop2 mov cx, di loop loop1例例5.7 將首地址為將首地址為a的字數組從大到小排序(起泡算法,多重循環(huán))的字數組從大到小排序(起泡算法,多重循環(huán))“冒泡法”是一種排序算法,不是最優(yōu)的算法,但它易于理解和實現。冒泡法從第一個元素開始,依次對相鄰的兩個元素進行比較,使前一個元素不大于后一個元素;將所有元素比較完之后,最大的元素排到了最后;然后,除掉最后一個元素之外的元素依上述方法再進行比較,得到次大的元素排在后面;如此重復,直至完成就實現元素從小到大的排序。這是一個雙重循環(huán)程序結構。外循環(huán)由于循環(huán)次數已知,可用loop指令實現;而內循環(huán)次數每次外循環(huán)后減少一次,我們用DX表示。內循環(huán)體比較兩個元素大小,又是一個分支結構。冒 泡 法例:將首地址為例:將首地址為 a a 的字數組從大到小排序的字數組從大到小排序 (起泡排序算法,多重循環(huán)起泡排序算法,多重循環(huán))100100 30 30 78 78 99 99 15 15 -1 -1 66 66 45 45189189256256100100 78 78 99 99 30 30 15 15 66 66 45 45189189256256
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《GB-T 25129-2010制冷用空氣冷卻器》專題研究報告
- 2026年河南推拿職業(yè)學院單招職業(yè)適應性測試題庫及答案詳解一套
- 在線體檢預約服務合同
- 2026屆江蘇省南京市七校聯合體高三上學期12月聯考地理含答案
- 中醫(yī)康復治療師崗位招聘考試試卷及答案
- 2025年城管崗面試題目及答案解析
- 辦公室主任2025年工作計劃(3篇)
- 2025年安全生產工作總結及2026年思路計劃(第3篇)
- 2025年網絡接口適配器合作協議書
- 2025年液位雷達項目建議書
- 智能采血管理系統功能需求
- 【基于PLC的自動卷纜機結構控制的系統設計10000字(論文)】
- 資產移交使用協議書
- 腦器質性精神障礙護理查房
- GB/T 45481-2025硅橡膠混煉膠醫(yī)療導管用
- GB/T 32468-2025銅鋁復合板帶箔
- 山西交控集團招聘筆試內容
- 大窯校本教材合唱的魅力
- 《建筑測繪》課件
- 《健康體檢報告解讀》課件
- 前臺電話禮儀培訓
評論
0/150
提交評論