基本程序設計_第1頁
基本程序設計_第2頁
基本程序設計_第3頁
基本程序設計_第4頁
基本程序設計_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基本程序設計第一頁,共五十八頁,編輯于2023年,星期日基本程序設計是使用單一結構的程序設計,它是程序設計的基礎。程序有三種基本結構,即順序結構、分支結構和循環(huán)結構。任何復雜的程序都是由基本結構組成的。因此,一定要掌握基本程序設計的方法。對于匯編語言程序設計而言,更要掌握好基本程序的設計,這是編寫復雜程序的基礎。

本章將分別介紹各種基本程序設計的方法及子程序的設計。4.1順序程序設計4.2分支程序設計4.3循環(huán)程序設計實訓一分支程序設計實訓二循環(huán)程序設計第4章基本程序設計第二頁,共五十八頁,編輯于2023年,星期日順序程序是最簡單程序設計,這種程序不使用分支、循環(huán)結構,程序按順序執(zhí)行,只能完成相對簡單的操作。限于這種特點,在進行順序程序設計時應合理安排指令的先后順序,以完成相應的功能。

在較為復雜的程序中,順序程序是逐段出現,它主要完成一些簡單操作或過程的準備、任務的過渡、結果的存儲及程序結束等。它是程序的基本組成部分。以下以結合幾個實例說明順序程序的基本方法,它們是以后各種復雜程序設計的基礎。4.1順序程序設計返回本章首頁進入下一節(jié)第4章基本程序設計第三頁,共五十八頁,編輯于2023年,星期日4.1.1存儲單元內容移位存儲單元移位是指其中的內容左移或右移若干位。現舉例說明。

【例4.1】將AX寄存器中的內容左移2位,字存儲單元DAT中的內容右移3位(移位后的空位補0).

分析:內容移位一般由移位指令實現,但要求移后空位為0,故應使用邏輯移位指令。當移位次數大于1時,可將移位次數放至CL中進行移位。操作如下:

MOV CL,2

SHL AX,CL

INC CL

SHR DAT,CL第4章基本程序設計第四頁,共五十八頁,編輯于2023年,星期日4.1.2乘法運算匯編語言本身也是比較靈活的,乘法運算可用乘法指令直接完成,有時候也可以由移位指令或加法指令完成。

【例4.2】將寄存器AL的內容乘10,結果存至DX寄存器。

分析:對一個數進行乘10運算,可以直接使用乘法指令實現,也可由移位指令或加法指令實現,方法分別如下:

1.用乘法指令實現

MOV BL, 10

IMUL BL ;AX←AL×BL=AL×10

MOV DX,AX第4章基本程序設計第五頁,共五十八頁,編輯于2023年,星期日2.用移位指令實現移位操作時,在最高位不變化時,左移一位,相當原數乘2,因此也可以用移位操作實現乘10運算。

XOR AH,AH ;AH清零

SAL AX,1 ;AX←AX×2

MOV BX,AX ;存至BX寄存器

MOV CL,2

SAL AX,CL ;AX←AX×8

ADD AX,BX ;AX←AX×10

第4章基本程序設計第六頁,共五十八頁,編輯于2023年,星期日3.用加法指令實現一個數與自己相加可以實現乘2運算,多次累加就可以實現乘10運算。

MOV AH,0

ADD AX,AX ;AX←AX×2

MOV BX,AX ;存至BX寄存器

ADD AX,AX ;AX←AX×4

ADD AX,AX ;AX←AX×8

ADD AX,BX ;AX←AX×10

第4章基本程序設計第七頁,共五十八頁,編輯于2023年,星期日4.1.3屏蔽與置位對字節(jié)或字變量中的某些位進行置0操作,稱為屏蔽操作。使某些位強迫置1則是置位操作。它們是數據處理常用的方法?!纠?.3】將字節(jié)類型變量DAT的高4位置0,其余各位保持不變。解:屏蔽操作多用邏輯運算指令實現.本例使用邏輯與指令完成。任何位與0相與,結果都為0,由此達到該位被屏蔽的目的。非屏蔽位應與1相與,以保證該位不變.

MOV AL,DAT

AND AL,0FH ;屏蔽高四位

MOV DAT,AX第4章基本程序設計第八頁,共五十八頁,編輯于2023年,星期日通過邏輯運算指令也很容易實現字或字節(jié)的置位操作。一般使用邏輯或指令實現置位操作。

例如把上例中DAT變量的高四位置1,用下面指令即實現即可:

OR DAT, 0F0H

第4章基本程序設計第九頁,共五十八頁,編輯于2023年,星期日4.1.4拆字與合字

【例4.4】將存儲單元DAT中兩位壓縮的BCD數拆成二個非壓縮BCD數(高位BCD數放在DAT+1單元,低位BCD數放在DAT+2單元)。

分析:將DAT單元中的BCD數拆開可用移位的方法。對高位BCD數可邏輯右移4位而成為非壓縮數;低位BCD數可屏蔽其高四位而成為非壓縮BCD數。指令如下:

MOV AL,DAT

MOV CL,4

SHR AL,CL ;得到高位BCD數

MOV DAT+1,AL

MOV AL,DAT

AND AL,0FH ;得到低位BCD數

MOV DAT+2,AL第4章基本程序設計第十頁,共五十八頁,編輯于2023年,星期日【例4.5】將存儲單元DAT1和DAT2中分別存有兩個非壓縮的BCD數,將其合成一個壓縮BCD數(DAT1單元為高位BCD數,DAT2單元為低位BCD數),結果存入DAT0單元。

分析:將兩個單元中的BCD數合并可用加法指令與移位指令相結合的方法。其中高位BCD數可由DAT1單元數據邏輯左移4位得到;再與DAT2單元相加即可完成合并。指令如下:

MOV AL,DAT0

MOV CL,4

SHL AL,CL

ADD AL,DAT1

MOV DAT0,AL第4章基本程序設計第十一頁,共五十八頁,編輯于2023年,星期日4.1.5數據與ASCII碼的相互轉換編程中經常要用到數據顯示的問題,通常的做法是將要顯示的數據轉換為ASCII碼后,再調用相關的中斷來顯示。在二、十、十六等常用進制的數據中,最為復雜的是十六進制數據的顯示,查閱ASCII表可知,數據0~9的ASC碼為該數據加上30H,數據A~F的ASCII碼為該數據加上37H。對于從鍵盤上輸入的數據,由于是以ASCII碼形式輸入的,通常轉換為數據本身再進行處理,其轉換的方法較多,但通常的方法是上述過程的逆過程,即對30H~39H(0~9的ASC碼)減去30H,數據41H~46H(A~F的ASCII碼)減去37H。下面舉例說明。第4章基本程序設計第十二頁,共五十八頁,編輯于2023年,星期日【例4.6】在字節(jié)存儲單元DAT中有兩位十六進制的數據為6AH,要求將該數據顯示到屏幕上。

分析:要實現該十六進制數據的顯示,一般是調用DOS或BIOS提供的中斷,而這些中斷幾乎都要求將要顯示的內容轉換為ASCII碼。以下用DOS系統(tǒng)功能調用的2號功能完成字符顯示。程序如下:

DATA SEGMENT

DAT DB 6AH

DATA ENDS

CODE SEGMENT

ASSUMECS:CODE,DS:DATA

第4章基本程序設計第十三頁,共五十八頁,編輯于2023年,星期日START: MOV AX,DATA

MOV DS,AX

MOV DL,DAT

MOV AL,DL ;暫存至AL寄存器

MOV CL,4

SHR DL,CL

ADD DL,30H ;高位十六進制數據‘6’轉換為ASCII碼

MOV AH,02H

INT 21H ;顯示

MOV DL,AL

AND DL,0FH

ADD DL,37H ;低位十六進制數據‘A’轉換為ASCII碼

INT 21H ;顯示

MOV AH,4CH

INT 21H

CODE ENDS

END START 第4章基本程序設計第十四頁,共五十八頁,編輯于2023年,星期日4.1.6簡單算術運算【例4.7】在字存儲單元A、B和C中分別存放著一個有符號數,求(C-89H+A×B)/A,商和余數分別存入字存儲單元D和E。

分析:直接用有符號數運算指令完成即可。程序如下:

DATA SEGMENT

A DW -1234H

B DW 5678H

C DW 3456H

D DW ?

E DW ?

DATA ENDS

CODE SEGMENT

ASSUMECS:CODE,DS:DATA第4章基本程序設計第十五頁,共五十八頁,編輯于2023年,星期日START: MOV AX,DATA

MOV DS,AX

MOV AX,C

SUB AX,89H

CWD ;擴展為雙字

MOV CX,DX

MOV BX,AX ;結果暫存至CX,BX

MOV AX,A

IMUL B ;求A×B

ADD AX,BX

ADC DX,CX ;與前面結果相加

IDIV A ;AX是商,DX是余數

MOV D,AX

MOV E,DX ;保存結果

MOV AH,4CH

INT 21H

CODE ENDS

END START第4章基本程序設計第十六頁,共五十八頁,編輯于2023年,星期日4.1.7查表【例4.8】在以TABLE為首地址的內存中順序存有0~10的平方數表。今從鍵盤上輸入一個數(<11),求其平方值,結果保存至RSLT單元。

分析:因為平方表已順序排放在內存中。又已知首地址TABLE,只要把輸入數據作為位移量與首址相加,就指向了表中平方值的地址,取其內容即為該數的平方值。程序如下:

DATA SEGMENT

TABLE DB0,1,4,9,16,25,36,49,64,81,100

RSLT DB ?

DATA ENDS

CODE SEGMENT

ASSUMECS:CODE,DS:DATA第4章基本程序設計第十七頁,共五十八頁,編輯于2023年,星期日START: MOV AX,DATA

MOV DS,AX

MOV AH,00H

INT 16H ;輸入數據

AND AL,0FH ;將ASCII碼轉換為數據

XOR BX,BX

MOV BL,AL ;存至BX

LEA SI,TABLE

MOV AL,[SI+BX] ;查表

MOV RSLT,AL ;保存結果

MOV AH,4CH

INT 21H

CODE ENDS

END START返回本章首頁第4章基本程序設計第十八頁,共五十八頁,編輯于2023年,星期日4.2分支程序設計分支程序使計算機具備判斷能力,計算機可以根據給定的條件進行判斷,并作出相應的處理,它可以把程序分成不同的處理段,實現情況不同的處理,從而使計算機具有一定的‘思維’能力。這是順序程序所能不能實現的。所以,分支程序是程序的重要組成結構之一。匯編語言的分支主要由轉移指令實現,而過多的轉移指令會使程序的結構變得復雜,因而進行分支程序設計時進行合理安排是至關重要的。返回本章首頁返回上一節(jié)進入下一節(jié)第4章基本程序設計第十九頁,共五十八頁,編輯于2023年,星期日4.2.1單重分支單重分支是最簡單的分支結構,如果條件成立則完成某項操作,否則執(zhí)行其它操作或后續(xù)指令。其結構可以用圖4-1來表示。(a)條件不成立執(zhí)行后續(xù)指令(b)條件不同執(zhí)行不同操作

條件?

處理

Yes

No

條件?

處理2

Yes

No

處理1

第4章基本程序設計第二十頁,共五十八頁,編輯于2023年,星期日【例4.9】在存儲單元DAT中存放著一位十六進制數,將其顯示到屏幕上。

分析:本題只需對該位十六進制數進行判斷,方法同例4.6相同。程序如下:

DATA SEGMENT

DAT DB 0CH

DATA ENDS

CODE SEGMENT

ASSUMECS:CODE,DS:DATA第4章基本程序設計第二十一頁,共五十八頁,編輯于2023年,星期日START: MOV AX,DATA

MOV DS,AX

MOV AL,DAT

CMP AL,9

JG OTHR

ADD AL,30H ;小于10則轉換為數字(0~9)

JMP DISP

OTHR: ADD AL,37H ;大于10則轉換為大寫字母(A~F)

DISP: MOV DL,AL

MOV AH,2

INT 21H

DONE: MOV AH,4CH

INT 21H

CODE ENDS

END START第4章基本程序設計第二十二頁,共五十八頁,編輯于2023年,星期日【例4.10】在字節(jié)存儲單元X、Y中各有一個無符號數。根據這兩個無符號數的大小,在屏幕顯示X≥Y或X<Y。

分析:兩個無符號數比較大小常用的方法是使用比較指令CMP,根據其對標志位的影響用無符號條件轉移指令實現轉移。程序如下:

DATA SEGMENT

DAT0 DB 98H

DAT1 DB 0A0H

DATA ENDS

CODE SEGMENT

ASSUMECS:CODE,DS:DATA

第4章基本程序設計第二十三頁,共五十八頁,編輯于2023年,星期日START: MOV AX,DATA

MOV DS,AX

MOV AL,X

CMP Y,AL ;比較

JA YGX ;X大則轉YGEX

MOV AL,‘≥’

JMP DISP

YGX: MOV AL,‘<’

DISP: MOV DL,‘X’ ;顯示比較結果

MOV AH,2

INT 21H

MOV DL,AL

INT 21H

MOV DL,‘Y’

INT 21H

MOV AH,4CH

INT 21H

CODE ENDS

END START第4章基本程序設計第二十四頁,共五十八頁,編輯于2023年,星期日本例中,根據比較結果影響CF標志位。利用JA指令實現分支轉移,即Y≥X時轉YGDX。在分支處理中分別為顯示結果作準備(分別準備顯示X≥Y或X<Y)。DISP標號開始的程序段是用來顯示結果的。第4章基本程序設計第二十五頁,共五十八頁,編輯于2023年,星期日4.2.2多重分支在程序設計中,更多的情況是對幾個條件同時進行判斷從而確定程序的轉移方向,此時只能采用數個單重分支的組合來完成,這就是多重分支結構。

【例4.11】編寫一程序,求:

X+10H (X<0)

Y= 32X (0≤X≤10)

X-90H (X>10)

其中X、Y都是有符號字變量

分析:本題有三個條件進行判斷,故屬于多重分支程序設計。在進行較為復雜的分支程序設計時,應先處理簡單分支,再處理復雜分支,這樣更方便編程。程序如下:

第4章基本程序設計第二十六頁,共五十八頁,編輯于2023年,星期日STACK SEGMENTPARASTACK‘STACK’

DB 100DUP(0)

STACK ENDS

DATA SEGMENT

X DW?

Y DW?

DATA ENDS

CODE SEGMENT

ASSUMECS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV AX,X

CMP AX,0

JGE CASE23

ADD AX,10H ;第一種情況的計算結果

JMP RESULT第4章基本程序設計第二十七頁,共五十八頁,編輯于2023年,星期日CASE23: CMP AX,10D

JG CASE3

MOV BX,30D

IMUL BX ;第二種情況的計算結果

JMP RESULT

CASE3: SUB AX,190H ;第三種情況的計算結果

RESULT: MOV Y,AX ;結果保存到變量Y中

MOV AH,4CH

INT 21H

CODE ENDS

END START第4章基本程序設計第二十八頁,共五十八頁,編輯于2023年,星期日4.2.3用地址表實現分支當程序分支比較復雜時,可將各分支的入口地址存于地址表中,以實現分支程序設計。

【例4.12】從鍵盤上輸入一個數(<5),求其平方值,結果保存至RSLT單元。

分析:本題可用例4.8的方法,也可以用地址表實現。程序如下:

DATA SEGMENT

ADDR DW C0,C1,C2,C3,C4

RSLT DW ?

DATA ENDS

CODE SEGMENT

ASSUMECS:CODE,DS:DATA第4章基本程序設計第二十九頁,共五十八頁,編輯于2023年,星期日START: MOV AX,DATA

MOV DS,AX

AGAIN: MOV AH,00H

INT 16H ;輸入數據

CMP AL,’0’

JB AGAIN

CMP AL,’4’

JA AGAIN ;不在0~4之間,重新輸入

AND AL,0FH ;ASCII碼轉換為數據

SHL AL,1 ;地址表為字類型,故乘2

XOR AH,AH

LEA BX,ADDR

ADD BX,AX

JMP WORDPTR[BX] ;用地址表實現分支第4章基本程序設計第三十頁,共五十八頁,編輯于2023年,星期日C0: MOV AL,0

JMP SAVE ;0的平方是0

C1: MOV AL,1

JMP SAVE ;1的平方是1

C2: MOV AL,2

MOV BL,AL

MUL BL

JMP SAVE ;2的平方是2*2

C3: MOV AL,3

MOV BL,AL

MUL BL

JMP SAVE ;3的平方是3*3

C4: MOV AL,4

MOV BL,AL

MUL BL ;4的平方是4*4

SAVE: MOV RSLT,AX ;保存

MOV AH,4CH

INT 21H

CODE ENDS

END START返回本章首頁第4章基本程序設計第三十一頁,共五十八頁,編輯于2023年,星期日4.3循環(huán)程序設計在進行程序設計時,會出現某段程序反復多次執(zhí)行的情況,如果這段程序是連在一起反復執(zhí)行的,則可用循環(huán)程序結構來實現。其方法是用重復次數或某個條件控制循環(huán)程序的執(zhí)行。采用循環(huán)程序結構不僅使程序變得簡潔清晰,而且減少程序對內存的占用,因此,循環(huán)程序是重要的程序結構之一。返回本章首頁返回上一節(jié)進入下一節(jié)第4章基本程序設計第三十二頁,共五十八頁,編輯于2023年,星期日4.3.1循環(huán)程序的結構循環(huán)程序是多種多樣的,但一般認為循環(huán)程序由四部分構成:

1.初始化部分

本部分主要為循環(huán)程序作準備工作,如置循環(huán)次數、地址指針或關鍵字,寄存器置初值及標志位設置等。

2.循環(huán)工作部分

本部分是實際進行工作的部分,是循環(huán)結構的主體。

3.參數調整部分

本部分實現地址指針或循環(huán)次數的修改等,以便繼續(xù)循環(huán)。

4.循環(huán)控制部分

本部分循環(huán)條件的檢查,以判斷是否繼續(xù)循環(huán)。

以上四部分中,2、3、4有時統(tǒng)稱為循環(huán)體。循環(huán)程序根據循環(huán)控制條件的不同,通常又分兩種結構,如圖4-2所示。第4章基本程序設計第三十三頁,共五十八頁,編輯于2023年,星期日(a)先工作后判斷循環(huán)條件該結構為后判斷型循環(huán),循環(huán)次數已知,多用LOOP指令等構造循環(huán)。

初始化

循環(huán)條件滿足?

Yes

No

第4章基本程序設計第三十四頁,共五十八頁,編輯于2023年,星期日(b)先判斷循環(huán)條件后工作該結構為先判斷型循環(huán),循環(huán)次數未知,多用條件轉移指令構造循環(huán)。

初始化

No

循環(huán)條件滿足?

處理

Yes

第4章基本程序設計第三十五頁,共五十八頁,編輯于2023年,星期日4.3.2單重循環(huán)單重循環(huán)程序結構,程序中只有一個循環(huán)體,循環(huán)體內不再含有其它循環(huán)體,下面舉例說明。

【例4.13】求1~400的所有偶數的和,結果保存到RSLT存儲單元。

分析:1~400間共有200個偶數,故需要加200次,也就是說循環(huán)次數為200。由于程序中CX寄存器同時充當了循環(huán)計數器和200個偶數值,使每一次循環(huán)CX的值減2,故CX初值為400。程序如下:

DATA SEGMENT

RSLT DW ?

DATA ENDS

CODE SEGMENT

ASSUMECS:CODE,DS:DATA 第4章基本程序設計第三十六頁,共五十八頁,編輯于2023年,星期日START: MOV AX,DATA

MOV DS,AX

MOV CX,400

XOR AX,AX

NEXT: ADD AX,CX ;計算偶數和

DEC CX

DEC CX

JNZ NEXT ;200個數未完則繼續(xù)循環(huán)

MOV RSLT,AX ;保存結果

MOV AH,4CH

INT 21H

CODE ENDS

END START第4章基本程序設計第三十七頁,共五十八頁,編輯于2023年,星期日【例4.14】在以DAT為首地址的字緩沖區(qū)中存有一批數據,數據個數為10,編程找出其最大的值,結果存入RSLT單元。

分析:求最大值通常采用逐個比較法,即把第一個數做比較標準,與其后的數比較。如標準數大,則再與下一個數比較;如果標準數小,則取大數做標準數。由于循環(huán)次數已知,故可采用圖4-2(a)的結構。程序如下:

DATA SEGMENT

DAT DW 1234H,0ABH,0ABCDH,9999H,0

DW 1,5678H,0BBCCH,9876H,5678H

RSLT DW ?

DATA ENDS

CODE SEGMENT

ASSUMECS:CODE,DS:DATA第4章基本程序設計第三十八頁,共五十八頁,編輯于2023年,星期日START: MOV AX,DATA

MOV DS,AX

LEA SI,DAT ;SI做地址指針

MOV AX,[SI]

MOV CX,9 ;10個數共比較9次

INC SI

INC SI

NEXT: CMP AX,[SI]

JGE GOON ;AX大于下一個數則轉GOON

MOV AX,[SI] ;否則將大值付給AX

GOON: INC SI

INC SI ;修改地址指針

LOOP NEXT ;循環(huán)

MOV RSLT,AX ;保存結果

MOV AH,4CH

INT 21H

CODE ENDS

END START第4章基本程序設計第三十九頁,共五十八頁,編輯于2023年,星期日【例4.15】在以DAT為首地址的字緩沖區(qū)中存有一批數據,以‘*’作為結束,編程找出其最大的值,結果存入RSLT單元。

分析:本例與例4.14的不同在于數據個數未知,但有一個條件知道,就是該批數據以‘*’結束,故屬于條件控制循環(huán),循環(huán)次數未知的結構,即圖4-2(b)的結構。程序如下:

DATA SEGMENT

DAT DW 1234H,0ABH,0ABCDH,9999H,0,1111H,1010H

DW 1,5678H,0BBCCH,9876H,5678H,0FFH,‘*’

RSLT DW ?

DATA ENDS

CODE SEGMENT

ASSUMECS:CODE,DS:DATA第4章基本程序設計第四十頁,共五十八頁,編輯于2023年,星期日START: MOV AX,DATA

MOV DS,AX

LEA SI,DAT ;SI做地址指針

MOV AX,[SI]

NEXT: CMP WORDPTR[SI],‘*’

JZ SAVE

CMP AX,[SI]

JGE GOON ;AX大于下一個數則轉GOON

MOV AX,[SI] ;否則將大值付給AX

GOON: ADD SI,2

JMP NEXT ;循環(huán)

SAVE: MOV RSLT,AX ;保存結果

MOV AH,4CH

INT 21H

CODE ENDS

END START第4章基本程序設計第四十一頁,共五十八頁,編輯于2023年,星期日4.3.3多重循環(huán)程序設計中,有時單重循環(huán)不能完成一項工作,需用多重循環(huán)完成。多重循環(huán)就是循環(huán)體內含有其它循環(huán)體的結構,也稱為循環(huán)嵌套。多重循環(huán)以雙重循環(huán)最為常用,內外層的循環(huán)由程序員用跳轉指令控制,要注意不同循環(huán)體之間的界限。

第4章基本程序設計第四十二頁,共五十八頁,編輯于2023年,星期日0123456789ABCDEF

123456789ABCDEF0

23456789ABCDEF01

3456789ABCDEF012

456789ABCDEF0123

56789ABCDEF01234

6789ABCDEF012345

789ABCDEF0123456

89ABCDEF01234567

9ABCDEF012345678

ABCDEF0123456789

BCDEF0123456789A

CDEF0123456789AB

DEF0123456789ABC

EF0123456789ABCD

F0123456789ABCDE

【例4.16】在以STRG為首地址的緩沖區(qū)中存放著十六進制各位“0”~“F”的ASCII碼,編程以下面的格式將這些數據顯示到屏幕上。第4章基本程序設計第四十三頁,共五十八頁,編輯于2023年,星期日分析:本題用雙重循環(huán)程序實現是非常恰當的,內循環(huán)實現每行18個數據的顯示(含回車與換行的ASCII碼),外循環(huán)則控制顯示的行數16。程序如下:

DATASEGMENT

STRG DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H

DB 41H,42H,43H,44H,45H,46H

DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H

DB 41H,42H,43H,44H,45H,46H

DATAENDS

CODE SEGMENT

ASSUMECS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV DI,16 ;顯示行數為16

XOR BX,BX ;BX清零第4章基本程序設計第四十四頁,共五十八頁,編輯于2023年,星期日NEXT: LEA SI,STRG

ADD SI,BX ;BX寄存器用于調整數據位置

MOV CX,16 ;每行顯示數據數

MOV AH,2

DISP: MOV DL,[SI]

INT 21H

MOV DL,’’ ;數據間以空格相間隔

INT 21H

INC SI

LOOP DISP ;內循環(huán)

MOV DL,0AH ;換行

INT 21H

MOV DL,0DH ;回車

INT 21H

INC BX

DEC DI

JNZ NEXT ;外循環(huán)

MOV AH,4CH

INT 21H

CODE ENDS

END START第4章基本程序設計返回本章首頁第四十五頁,共五十八頁,編輯于2023年,星期日實訓一分支程序設計實訓內容:在存儲單元DAT中存放著一個字節(jié)數據,判斷其是否為十六進制數據,如是,則將其以十六進制形式顯示到屏幕上,否則顯示“NotHexadicimal”信息。分析:本題只需對該數據進行判斷,如果大于等于0且小于等于15,則是十六進制數據,轉換為相應的ASCII碼即可顯示。方法同例4.9相似。如果不在上述范圍內,則顯示非十六進制信息。顯然這是一個分支程序。上機前,應在硬盤上建立MASM子目錄,并將EDIT編輯程序、MASM匯編程序、LINK連接程序和DEBUG調試程序拷貝至該子目錄下(注:也可拷貝具有相似功能的其它版本的匯編調試程序)。整個上機過程如下:第4章基本程序設計第四十六頁,共五十八頁,編輯于2023年,星期日1.畫出程序流程圖如圖4-3所示AL←AL+37H顯示非十六制數據信息Y開始數據放入ALAL←AL+30H≥0?>9?≦15?YNYNN顯示結束圖4-3實訓一程序流程圖第4章基本程序設計第四十七頁,共五十八頁,編輯于2023年,星期日2.用編輯程序編輯源程序設源程序名為SX1A.ASM.注意:源程序的擴展名必須是.ASM。編輯如下: C:\MASM\EDITSX1A.ASM在編輯環(huán)境下編輯源程序。參考源程序如下:DATA SEGMENT DAT DB 0CH MSG DB ‘NotHexadicimal.$’ DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA第4章基本程序設計第四十八頁,共五十八頁,編輯于2023年,星期日START: MOV AX,DATA MOV DS,AX MOV AL,DAT CMP AL,0 JL DISP2 ;小于0則轉到DISP2 CMP AL,9 JG OTHER ADD AL,30H ;小于10則轉換為數字(0~9)的ASCII碼

JMP DISP1OTHER:CMP AL,0FH JG DISP2 ;大于15則轉到DISP2 ADD AL,37H ;大于10則轉換為大寫字母(A~F)的ASCII碼DISP1: MOV DL,AL MOV AH,2 INT 21H JMP DONEDISP2: LEA DX,MSG ;顯示“NotHexadicimal.”信息

MOV AH,9 INT 21HDONE: MOV AH,4CH INT 21HCODE ENDS END START第4章基本程序設計第四十九頁,共五十八頁,編輯于2023年,星期日3.匯編源程序輸入以下命令行并按回車鍵:C:\MASM\MASMSX1AMicrosoft(R)MacroAssemblerVersion5.00Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.Sourcefilename[.ASM]:Sourcelisting[NUL.LST]:Cross-reference[NUL.CRF]:51698+417454Bytessymbolspacefree0WarningErrors0SevereErrorsMASM匯編程序對源程序進行二次掃描檢查,如無誤,則形成SX1A.OBJ目標文件。如果有錯誤,則提示錯誤出處和錯誤原因。大家也可以通過列表文件檢查錯誤。如果源程序有錯誤,則在EDIT中進行修正,重新匯編,直至正確無誤。第4章基本程序設計第五十頁,共五十八頁,編輯于2023年,星期日4.連接目標文件形成可執(zhí)行文件輸入以下命令行并按回車鍵:C:\MASM\LINKSX1AMicrosoft(R)OverlayLinkerVersion3.60Copyright(C)MicrosoftCorp1985-1987.Allrightsreserved.ObjectModules[.OBJ]:myfileRunFile[MYFILE.EXE]:ListFile[NUL-MAP]:Libraries[.LIB]:Warning:nostacksegment則目標程序被連接為可執(zhí)行的.EXE文件。系統(tǒng)最后一行有一個警告信息,表示程序中沒有堆棧段,這并不影響程序的正常執(zhí)行,因為操作系統(tǒng)會自動為用戶程序分配堆??臻g。第4章基本程序設計第五十一頁,共五十八頁,編輯于2023年,星期日5.用DEBUG調試程序對可執(zhí)行文件進行分析調試雖然形成了SX1A.EXE可執(zhí)行文件,但程序是否按題目要求完成各項功能還不能肯定,程序中可能還隱藏著某些錯誤,此時就應該用DEBUG調試程序進行跟蹤調試了。輸入如下命令: C:\MASM\DEBUGSX1A.EXE -出現DEBUG命令提示符后,就可以用DEBUG的各種命令進行跟蹤調試了。其中使用最多的是步跟蹤命令P及命令D等。如發(fā)現程序有隱含錯誤,則在EDIT中修正錯誤,重新匯編連接形成可執(zhí)行文件,再用DEBUG進行調試,直至正確無誤。最后,在DOS命令提示符下運行程序,結果如下:C第4章基本程序設計返回本章首頁第五十二頁,共五十八頁,編輯于2023年,星期日實訓二循環(huán)程序設計實訓內容:在以DAT為首地址的字數組中共有10個元素,都是無符號數。編程按從小到大的順序重新排列,結果存回原地址。分析:要將10個數按降序排列,必須首先在這10個數中找到最小數,將其放在第

溫馨提示

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

評論

0/150

提交評論