按照程式執行的控制結構,匯程式設計序的設計可分為:順序結構程式設計、分支結構程式設計、迴圈結構程式設計和子程式的設計等這也是結構化程式設計的一般方法。任何程式必須經過除錯,才能檢查出解題目的是否正確以及程式是否符合設計思想。
在除錯程式的過程中,應該善於利用機器提供的除錯工具(如debug)和有效的其他工具軟體來進行工作,經過反覆的「執行—發現錯誤—改正錯誤—執行」,才能得到正確的程式。這一點對初學者特別重要,它將給組合語言程式設計提供很大的幫助。程式的編寫和除錯執行是學好組合語言的重要手段。
只有多編寫程式和多除錯執行程式,才能有效地提高編寫和閱讀程式的能力。
本章將重點介紹彙編程式設計和上機除錯的一般方法。
5-1 程式設計方法
5-6-1 順序程式設計
順序程式是一種最簡單的程式,也稱為直線程式,它的執行自始至終按照語句出現的先後順序進行。
[例5-1] 求兩個數的平均值。這兩個數分別放在x單元和y單元中,而平均值放在z單元中。程式如下:
data segment
x db 95
y db 87
z db ?
data ends
code segment
main proc far
assume cs:code,ds:data
start:push ds
mov ax,0
push ax
mov ax,data ;裝填資料段暫存器ds
mov ds,ax
mov al,x第乙個數送入al
add al,y兩數相加,結果送al
mov ah,0
adc ah,0帶進製加法,進製送ah
mov bl,2除數2送bl
div bl求平均值送al
mov z,al結果送入z單元
retmain endp
code ends
end start
[例5-2] 在記憶體中自tab開始的16個單元連續存放著0~15的平方值(平方表),任給乙個數x(0≤x≤15),如13,且存放在x單元中,查表求x的平方值,並把結果送入y單元中。根據給出的平方表,分析表的存放規律,可知表的起始位址與數x之和,正是x的平方值所在單元的位址,由此編制程式如下:
data segment
tab db 0,1,4,9,16,25,36,49,64,81
db 100,121,144,169,196,225
x db 13
y db ?
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
lea bx,tab
mov ah,0
mov al,x
add bx,ax
mov al,[bx]
mov y,al
mov ah,4ch
int 21h
code ends
end start
5-1-2 分支程式設計
順序程式的特點是從程式的第一條指令開始,按順序執行,直到執行完最後一條指令。然而,許多實際問題並不能設計成順序程式,需要根據不同的條件作出不同的處理。把不同的處理方法編製成各自的處理程式段,執行時由機器根據不同的條件自動作出選擇判斷,繞過某些指令,僅執行相應的處理程式段。
按這種方式編制的程式,執行的順序與指令儲存的順序失去了完全的一致性,稱之為分支程式。分支程式是機器利用改變標誌位的指令和轉移指令來實現的。
轉移指令有jmp和jcc兩類。前者是無條件轉移指令,後者是條件轉移指令。jmp無條件轉移指令將控制轉向其後的目的標號指定的位址。
jcc條件轉移指令跟隨在能改變狀態標誌的指令之後,根據條件決定是否將控制轉向其後的目的位址處。
[例5-3] 給定以下符號函式:
任意給定x值,假定為25,且存放在x單元,函式值y 存放在y單元,根據x的值確定函式y的值。程式流程圖如圖5-1所示。
圖5-1 實現符號函式程式的流程圖
程式如下:
datax segment
x db 25
y db ?
datax ends
codex segment
main proc far
assume cs:codex,ds:datax
start: push ds
mov ax,0
push ax
mov ax,datax
mov ds,ax
mov al,xal←x
cmp al,0
jge loop1x≥0時轉loop1
mov al,0ffh否則將1送入y單元
mov y,al
retloop1:je loop2x=0時轉loop2
mov al,1否則將1送入y單元
mov y,al
retloop2:mov al,0將0送入y單元
mov y,al
retmain endp
codex ends
end start
[例5-3]設有首位址為arry的字陣列,已按公升序排好,陣列長度為n(假設n=15),且資料段與附加段佔同一段,在該陣列中查詢數number(假設等於83)。若找到它,則從陣列中刪掉;若找不到,則把它插入正確位置,且變化後的陣列長度在dx中。
根據題意編寫程式如下:
dataj segment
dw ?
ndw 15
number dw 83
arry dw 5,10,17,21,28,32,41,50,56,67,72
dw 88,95,125,150
dataj ends
codma segment
main proc far
assume cs:codma,ds:dataj,es:dataj
start:push ds
sub ax,ax
push ax
push es
mov ax,dataj
mov ds,ax
push ds
pop es
mov ax,number ;待查詢的數放入ax
mov dx,n初始化dx
mov cx,n設定計數器cx
mov di,offset arry ;arry的有效位址放入di
cld建立方向標誌
repne scasw用重複串掃瞄指令進行查詢
je delete
dec dx
mov si,dx
add si,dx
tt3: cmp ax,arry[si]
jl tt1
mov arry[si+2],ax ;功能是:若沒有查到,
jmp tt2則將此數插入正確位置
tt1: mov bx,arry[si]
mov arry[si+2],bx
sub si,2
jmp tt3
tt2: add dx,2修改陣列長度
jmp fan
delete:jcxz next
loopt:mov bx,[di此程式段功能是:若查詢到,
mov [di2],bx則從陣列中刪除該數
add di,2
loop loopt
next: dec dx修改陣列長度
fan: pop es
retmain endp
codma ends
end start
5-1-3 迴圈程式設計
1.迴圈程式的結構
迴圈程式通常有兩種結構,一種是先執行後判斷,另一種是先判斷後執行。
圖 5-2 迴圈程式的基本結構
(a) 先執行後判斷 (b) 先判斷後執行
(1) 初始化部分:建立迴圈初始值。如設定位址指標、計數器、其他迴圈引數的起始值等。
(2) 工作部分:在迴圈過程中所要完成的具體操作,是迴圈程式的主要部分。這部分視具體情況而定。它可以是乙個順序程式、乙個分支程式或另乙個迴圈程式。
(3) 修改部分:為執行下乙個迴圈而修改某些引數。如修改位址指標、其他迴圈引數等。
(5) 結束處理部分:對迴圈結束進行適當處理,如儲存結果等。有的迴圈程式可以沒有這部分。
圖5-2(a)給出的迴圈程式框圖是「先執行後判斷」的結構;另有一種結構形式是「先判斷後執行」的形式,如圖5-2(b)所示,這種結構仍由五個部分組成,但是重新安排了中間三個部分的順序。從框圖可以看出它的最大優點是可以一次也不執行迴圈,也就是說可以設計為零次迴圈的程式。
2.迴圈控制方法
(1) 用計數控制迴圈
這種方法直觀、方便,易於程式設計。只要在編制程式時,迴圈次數已知,就可以使用這種方法設計迴圈程式。
[例5-3] 從xx單元開始的30個連續單元中存放有30個無符號數,從中找出最大者送入yy單元中。
根據題意,我們把第乙個數先送入al暫存器,將al中的數與後面的29個數逐個進行比較。如果al中的數較小,則兩數交換位置;如果al中的數大於等於相比較的數,則兩數不交換位置。在比較過程中,al中始終保持較大的數,比較29次,則最大者必在al中。
最後把al中的數(最大者)送入yy單元。
第5章迴圈結構程式設計
程式的三種基本結構 順序結構 用來描述依次執行的操作。選擇結構 對判定性問題的處理。迴圈結構 對有規律的重複性的事務的處理。5 1 迴圈結構概述 1 用goto語句和if語句構成迴圈 2 用while語句 3 用do while語句 4 用for語句。5 2 while語句 其一般形式如下 whil...
5教學指南及上機指導第5章
第5章表單設計 一 教學提要 1 掌握使用表單嚮導建立表單的方法 2 掌握使用表單設計器建立表單的方法 3 掌握表單控制項的方法 二 課程內容 1 表單是由乙個或多個頁面組成的,類似於標準視窗的介面。表單除了能夠接收 顯示和編輯資料外,還有其他介面所沒有的功能。例如,在表單中可以新增很多物件,這些物...
VB課件第5章迴圈結構程式設計
如果這樣計算 s 1s s 2 s s 2 s s 2 很顯然,這不是解決問題的方法.在程式設計中要解決此問題,就需使用迴圈結構語句 vb提供三種不同風格的迴圈結構,包括 當迴圈 while wend迴圈 do迴圈 do loop迴圈 for迴圈 for next 迴圈 其中for迴圈按規定的次數執...