山東大學(xué)匯編語言程序設(shè)計課件第5章_第1頁
山東大學(xué)匯編語言程序設(shè)計課件第5章_第2頁
山東大學(xué)匯編語言程序設(shè)計課件第5章_第3頁
山東大學(xué)匯編語言程序設(shè)計課件第5章_第4頁
山東大學(xué)匯編語言程序設(shè)計課件第5章_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第五章循環(huán)與分支程序設(shè)計5.1循環(huán)程序設(shè)計5.2分支程序設(shè)計5.3如何在實模式下發(fā)揮80386及其后繼機型的優(yōu)勢

1.編寫匯編語言程序步驟

l

分析實際問題,確定解決問題的算法

l

按算法畫出程序流程圖

l

按流程圖編寫程序

l上機調(diào)試,運行程序注:本教材所討論的編程環(huán)境只限于在DOS操作系統(tǒng)下的實模式2.判斷程序質(zhì)量的標(biāo)準(zhǔn)程序的正確性程序的可讀性程序的執(zhí)行時間程序所占內(nèi)存大小3.幾種程序結(jié)構(gòu)順序結(jié)構(gòu)循環(huán)結(jié)構(gòu)分支結(jié)構(gòu)子程序結(jié)構(gòu)順序結(jié)構(gòu)形式循環(huán)結(jié)構(gòu)形式當(dāng)型循環(huán)(當(dāng)條件成立進入循環(huán))循環(huán)初始設(shè)置循環(huán)體循環(huán)條件判斷?YN直到型循環(huán)(直到條件成立退出循環(huán))YN循環(huán)初始設(shè)置循環(huán)體循環(huán)條件判斷?兩個分支YN

、、、

CMPAL,BLJGgreat

JMPexitgreat:

exit:、、、、、、

AL≤BL處理AL>BL處理分支結(jié)構(gòu)形式三個分支

、、、

CMPAL,0

JGgreat

JLless

JMPexitless:

JMPexitgreat:

exit:

、、、AL=0處理AL>0處理AL<0處理YYNN分支結(jié)構(gòu)形式……1.多處調(diào)用完成同一功能的子程:codeSEGMENTstart:、、

CALLsubp

、、

CALLsubp

、、

CALLsubp

、、

MOVAH,4CHINT21HsubpPROC

、、、、

RETsubpENDPcodeENDSENDstart2.模塊化程序設(shè)計:codeSEGMENTbegin:CALL

sub1

CALLsub2

CALLsub3MOVAH,4CHINT21Hsub1PROC

、、

RETsub1ENDPsub2PROC

、、

RETsub2ENDPsub3PROC

、、

RETsub3ENDPcodeENDSENDbegin

子程結(jié)構(gòu)形式注意返回DOS語句位置開

始結(jié)

化循環(huán)的初始狀態(tài)

環(huán)

體循環(huán)的工作部分及修改部分

控制條件

計數(shù)控制特征值控制地址邊界控制5.1.1循環(huán)程序的結(jié)構(gòu)形式5.1循環(huán)程序設(shè)計(1)DO-WHILE結(jié)構(gòu)(2)DO-UNTIL結(jié)構(gòu)例1

將寄存器BX中的內(nèi)容以十六進制形式顯示出來。

(二進制十六進制)有關(guān)字符、數(shù)碼轉(zhuǎn)換的處理

1.計算機處理字符時,常用的字符編碼是ASCII碼。2.數(shù)字和字母的ASCII碼是一個有序序列數(shù)字0~9:30H~39H大寫字母A~Z:41H~5AH小寫字母a~z:61H~7AH5.1.2循環(huán)程序設(shè)計方法3.計算機處理信息時,其對象都是二進制數(shù)。外設(shè)(顯示器、打印機、鍵盤等)用ASCII碼與CPU進行信息傳送。例如:(1)在鍵盤上按下某一字符鍵(如’9’),鍵盤接口 向鍵盤緩沖區(qū)送去的是該字符的ASCII碼(如

39H),而不是送數(shù)字09H。

(2)在文本方式下,要在顯示器上顯示某一字符

(如’A’),須將該字符的ASCII碼(如41H)送顯示緩沖區(qū),不是送數(shù)字0AH。計算機要利用顯示器、鍵盤等外設(shè)時,須據(jù)程序設(shè)計的需要進行有關(guān)轉(zhuǎn)換。例將CPU運算的結(jié)果通過顯示器顯示時,如二進制數(shù)“A9”

需將結(jié)果轉(zhuǎn)換成其對應(yīng)的ASCII碼才能進行顯示。例

CPU要處理從鍵盤輸入的某一數(shù)據(jù),如鍵入“1234”

需將該數(shù)據(jù)串進行轉(zhuǎn)換十六進制后才能應(yīng)用。例1

將BX寄存器中的內(nèi)容以十六進制形式顯示出來。

BX是一個16位寄存器二進制1010100100111110

用十六進顯示時,每4位用一個字符顯示,共4個其中:0000→’0’30H,1010→’A’41H

0001→’1’31H

,1011→’B’42H

、、、、

1001→’9’39H

,1111→’F’46H?十六進制A93E屏幕上的顯示‘A’‘9’‘3’‘E’對應(yīng)的ASCII41H39H33H45HBX1234算法:取出要顯示的某4位,轉(zhuǎn)換為對應(yīng)的ASCII碼,再調(diào)用DOS系統(tǒng)功能進行顯示。(1)對于0000~1001(0~9),先擴展成一個字節(jié),高4位清0,加上30H后,即可得字符’0’~’9’對應(yīng)的ASCII碼。

00000001B+30H=31H00001001B+30H=39H

0001B‘1’1001B‘9’(2)對于1010~1111(A~F),先擴展成一個字節(jié),高4位清0,

加上30H后,還要再加上07H,才能得到’A’~’F’對應(yīng)的ASCII碼

00001010B+30H+07H=41H00001111B+30H+07H=46H

1010B‘A’1111B‘F’codeSEGMENTASSUMECS:codestart:MOVCH,4;字符個數(shù)rotate:MOVCL,4;循環(huán)移位次數(shù)

ROLBX,CL

;取顯示位的值

MOVAL,BL

;保存在AL中

ANDAL,0FH

;清除高4位

ADDAL,30H

;轉(zhuǎn)變?yōu)閿?shù)字的ASCII

CMPAL,3aH;大于3aH,則應(yīng)轉(zhuǎn)變

JLprint;為數(shù)字0~9的ASCII

ADDAL,07H;為字母A~F的ASCIIprint:MOVDL,AL;送

ASCII字符到DLMOVAH,2;顯示DL中的字符

INT21HDECCH;顯示結(jié)束?

JNZnextMOVAH,4CH;返回DOSINT21HcodeENDS

ENDstart顯示字符個數(shù)CH=4循環(huán)移位次數(shù)CL=4BX循環(huán)左移4位,將要顯示的值移至低4位,保存在AL中清AL的高4位,只保留要顯示位的值A(chǔ)L←AL+30H完成數(shù)值0~9的ASCII碼轉(zhuǎn)換YNAL←AL+07H完成數(shù)值A(chǔ)~F的ASCII碼轉(zhuǎn)換用02功能顯示DL中的字符YN返回DOSAL超出39H?CH←CH-1轉(zhuǎn)換結(jié)束?開始例5.4

將正數(shù)n插入一個已整序的字?jǐn)?shù)組的正確位置。

xdw?array_headdw3,5,15,23,37,49,52,65,78,99array_enddw105ndw32movax,nmovarray_head-2,0ffffhmovsi,0compare:

cmp

array_end[si],ax

jleinsertmovbx,array_end[si]movarray_end[si+2],bxsubsi,2

jmpshortcompareinsert:movarray_end[si+2],ax

-1

3

5

49

15

52

23

37

105

99

78

65

32xn尋址方式?1、負(fù)數(shù)在計算機內(nèi)部使用補碼表示2、數(shù)組的訪問方式:

①寄存器相對尋址 ②基址變址尋址

③相對基址變址尋址

④帶比例因子的尋址(3種)例5.5邏輯尺的使用

LOGIC_RULE DW 00DCH …… MOV BX,0 MOV CX,10 MOV DX,LOGIC_RULENEXT: MOV AX,X[BX]

SHR DX,1

JC SUBTRACT ADD AX,Y[BX] JMP SHORTRESULTSUBTRACT: SUB AX,Y[BX]RESULT: MOV Z[BX],AX ADD BX,2 LOOP NEXT RET ……尋址方式?邏輯尺:Ⅰ、定義Ⅱ、使用邏輯尺的形式:Ⅰ、靜態(tài)預(yù)置Ⅱ、動態(tài)修改5.1.3多重循環(huán)程序設(shè)計基本方法與單重循環(huán)相同,但要注意:1、分別考慮各重循環(huán)的控制條件及其程序?qū)崿F(xiàn),相互之間不能混淆2、每次從外層循環(huán)再次進入內(nèi)層循環(huán)時,初始條件要重新設(shè)置例5.7

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

adw100,30,78,99,15,-1,66,54,189,256movcx,10

dec

cxloop1:movdi,cxmovbx,0loop2:movax,a[bx]

cmpax,a[bx+2]

jgecontinue

xchgax,a[bx+2]mova[bx],axcontinue:addbx,2looploop2

movcx,dilooploop1注意:與教材的不同數(shù)組的訪問方式循環(huán)程序設(shè)計小結(jié)1、循環(huán)控制條件的選擇:

a.循環(huán)次數(shù)已知,采用LOOP b.循環(huán)次數(shù)已知,但有可能使用其他特征或條件結(jié)束循環(huán), 可采用LOOPZ和LOOPNZ c.循環(huán)次數(shù)未知,具體問題具體分析2、設(shè)立條件標(biāo)志位的方法5.2分支程序設(shè)計5.2.1分支程序的結(jié)構(gòu)形式雙分支與多分支的共同特點:運行方向是向前的在某一種特定條件下,只能執(zhí)行其中的一個分支5.2.1分支程序設(shè)計方法1、使用CMP、TEST等運算型指令+條件轉(zhuǎn)移指令2、使用邏輯尺的方法3、使用跳躍表法實現(xiàn)CASE結(jié)構(gòu)例5.5

設(shè)有數(shù)組x(x1,…,x10)和y(y1,…,y10),編程計算

z1=x1+y1z2=x2+y2z3=x3-y3z4=x4-y4z5=x5-y5z6=x6+y6z7=x7-y7z8=x8-y8z9=x9+y9z10=x10+y10

邏輯尺:0011011100

1減法

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

mov

bx,0

mov

cx,10

mov

dx,logic_rulenext:movax,x[bx]

shr

dx,1

jcsubtractaddax,y[bx]

jmpshortresult;向前引用subtract:subax,y[bx]

result:mov

z[bx],axaddbx,2loopnext例5.10

根據(jù)AL寄存器中哪一位為1(從低位到高位)把程序轉(zhuǎn)移到8個不同的程序分支去。branch_tabledwroutine1

dwroutine2

dwroutine3

dwroutine4

dwroutine5

dwroutine6

dwroutine7

dwroutine8注意:DW標(biāo)號的使用寄存器間接尋址

cmpal,0

jecontinueleabx,branch_tableL

:shral,1;邏輯右移

jnbnot_yet

;jnb=jnc

jmpwordptr

[bx]

;段內(nèi)間接轉(zhuǎn)移not_yet:addbx,typebranch_table

jmp

Lcontinue:……routine1:……routine2:…………可提高效率寄存器間接尋址

cmpal,0

jecontinue

mov

si,0

L

:shral,1 ;邏輯右移

jnbnot_yet

;jnb=jnc

jmp

branch_table[si]

;段內(nèi)間接轉(zhuǎn)移not_yet:

addsi,typebranch_table

jmp

Lcontinue:……routine1:……routine2:…………基址變址尋址

cmpal,0

jecontinueleabx,branch_table

mov

si,7*typebranch_table

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論