![微機原理及應(yīng)用第四章-課件_第1頁](http://file4.renrendoc.com/view12/M08/16/2F/wKhkGWYMMxKAXJ7cAAKB_Cw5oz4297.jpg)
![微機原理及應(yīng)用第四章-課件_第2頁](http://file4.renrendoc.com/view12/M08/16/2F/wKhkGWYMMxKAXJ7cAAKB_Cw5oz42972.jpg)
![微機原理及應(yīng)用第四章-課件_第3頁](http://file4.renrendoc.com/view12/M08/16/2F/wKhkGWYMMxKAXJ7cAAKB_Cw5oz42973.jpg)
![微機原理及應(yīng)用第四章-課件_第4頁](http://file4.renrendoc.com/view12/M08/16/2F/wKhkGWYMMxKAXJ7cAAKB_Cw5oz42974.jpg)
![微機原理及應(yīng)用第四章-課件_第5頁](http://file4.renrendoc.com/view12/M08/16/2F/wKhkGWYMMxKAXJ7cAAKB_Cw5oz42975.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
NanjingUniversityofScience&Technology微機原理及應(yīng)用1NanjingUniversityofScience第3章匯編語言程序設(shè)計微機原理及應(yīng)用匯編語言程序設(shè)計匯編語言偽指令匯編語言的基本元素匯編及匯編語言2第3章匯編語言程序設(shè)計微機原理及應(yīng)用匯編語言程序設(shè)計匯編語精品資料3精品資料3你怎么稱呼老師?如果老師最后沒有總結(jié)一節(jié)課的重點的難點,你是否會認為老師的教學(xué)方法需要改進?你所經(jīng)歷的課堂,是講座式還是討論式?教師的教鞭“不怕太陽曬,也不怕那風(fēng)雨狂,只怕先生罵我笨,沒有學(xué)問無顏見爹娘……”“太陽當空照,花兒對我笑,小鳥說早早早……”44匯編語言用匯編語言編寫源程序,經(jīng)過匯編程序和連接程序生成目標程序和執(zhí)行程序
文件名.ASM文件名.OBJ文件名.EXE匯編語言源程序匯編目標程序連接執(zhí)行程序編輯程序EDIT.EXE匯編程序MASM.EXE連接程序LINK.EXE5匯編語言用匯編語言編寫源程序,經(jīng)過匯編程序和連STACKSEGMENT DB100DUP(?)STACKENDSDATASEGMENT SURDB?DISDB?SQTABDB0,1,4,9,16,25,36,49,64,81DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:PUSHDS MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX LEABX,SQTAB;取平方表基地址
MOV AH,0 MOV AL,SUR;AL=X ADD BX,AX;計算地址偏移
MOV AL,[BX];取出X的平方值
MOV DIS,ALCODEENDS ENDBEGIN匯編語言程序示例6STACKSEGMENT匯編語言程序示例6匯編語言的語句格式
匯編語言的語句有指令語句、偽指令和宏指令。指令:在程序運行期間由計算機來執(zhí)行,匯編程序匯編后可產(chǎn)生機器指令代碼的語句。偽指令:在匯編程序?qū)υ闯绦騾R編期間由匯編程序處理的操作,偽指令主要完成數(shù)據(jù)定義、分配存儲區(qū)、指示程序結(jié)束等操作。宏指令:是源程序中一段有獨立功能的程序代碼。7匯編語言的語句格式匯編語言的語句有指令語句、偽指令和宏指令匯編語言的基本元素
匯編語言的語句格式如下:格式:[標識符]
助記符操作數(shù)[;注釋]匯編語言源程序中可以用下列字符來表示標識符: 字母:A~Z,a~z
數(shù)字:0~9
專用字符:?·@_$說明:1、標識符不能以數(shù)字打頭,名字中用到·則必須是第1個字符。2、符號常量、標號或變量等都是標識符。3、標識符不能和關(guān)鍵詞重名。8匯編語言的基本元素匯編語言的語句格式如下:8常量、變量和標號
常量:指在匯編時已經(jīng)有確定數(shù)值的量。l數(shù)值常量:二進制、十進制、十六進制和ASCII碼字符如:01100101B234D(或234)456Q1234H‘AB’符號常量:用偽指令EQU實現(xiàn) 例如:PEQU314
偽指令PURGE可用于釋放由EQU偽指令定義的符號常量,這樣這些常量就可以被重新定義了。EQU偽指令定義的符號在PURGE偽指令解除前,不能重新定義。 例:PURGE
符號名1,符號名2,…符號名N
等號賦值偽指令“=”
功能與EQU相似,可對已定義的符號名重新定義而無須先釋放。如:P=3149常量、變量和標號常量:指在匯編時已經(jīng)有確定數(shù)值的量。9常量、變量和標號
變量:是存儲器中的數(shù)據(jù)地址或數(shù)據(jù)區(qū)地址的符號表示。變量名即是數(shù)據(jù)的地址或數(shù)據(jù)區(qū)的首地址。標號:是指令地址的符號表示或過程名。過程名是過程入口地址的符號表示。標號經(jīng)常在轉(zhuǎn)移指令或CALL指令的操作數(shù)字段出現(xiàn),用以表示轉(zhuǎn)向地址。標號的定義:用“:”定義,直接寫在指令前。 如:NEXT:MOVAL,[SI]說明:1、標號代表指令的符號地址,
在代碼段中定義和使用;2、變量是數(shù)據(jù)存儲單元的符號表示,
在數(shù)據(jù)段、附加段和堆棧段中定義。10常量、變量和標號變量:是存儲器中的數(shù)據(jù)地址或數(shù)據(jù)區(qū)地址的符數(shù)據(jù)定義偽操作指令
變量的定義(重點)格式:[變量名]數(shù)據(jù)定義偽指令表達式數(shù)據(jù)定義偽指令:DB,DW,DD,DQ,DT表達式:確定了變量的初值,所使用的表達式可以是以下幾種:(1)
數(shù)值表達式 W1DW-5,1994H(2)
ASCII碼字符串B1DB‘AB$’(3)
地址表達式 W2DWB1(4)
“?”表示所定義變量無確定初值B2DB?(5)
nDUP(表達式)如:DATA1DB20DUP(5)其中n是重復(fù)因子,只能取正整數(shù),它表示定義了n個表達式,表達式的類型由數(shù)據(jù)定義偽指令確定。此處表示定義了20個字節(jié),并全部初始化為5。11數(shù)據(jù)定義偽操作指令變量的定義(重點)11數(shù)據(jù)定義偽操作指令
例1: DATA2DW10DUP(?)
表示定義了10個字,但沒有初始化。例2: BUFFERDB100DUP(0);表示以BUFFER為首地址的100個字節(jié)中存放00H
例3:V1DB100DUP(3,5,2DUP(10),35),24,‘NUM’
表示V1為首地址的區(qū)域中存放了(3,5,10,10,35)100次,和24,‘NUM’12數(shù)據(jù)定義偽操作指令例1: DATA2DW10D數(shù)據(jù)定義偽操作指令
例4:S1 DB‘ABCDEF’S2 DW‘AB’,‘CD’,‘EF’S3 DD‘AB’,‘CD’這幾個變量在存儲器中存放情況如下:注意:定義多于兩個以上字符的字符串時,只能使用DB偽指令,不能使用DW和DD等偽指令。41H42H43H44H45H46H42H41H44H43H46H45H42H41H00H00H44H43H00H00HS1S2S313數(shù)據(jù)定義偽操作指令例4:S1 DB‘ABCDEF變量的屬性
變量有三種屬性:
段地址SEG
偏移地址OFFSET
類型TYPE變量的類型:存取該變量中的數(shù)據(jù)所需要的字節(jié)數(shù)。例如:用DB定義的變量,其類型為1;用DW定義的變量,其類型為2;用DD定義的變量,其類型為4;依次類推。14變量的屬性變量有三種屬性:14標號的屬性
l
標號也有3種屬性:即段地址、偏移地址和標號的類型(NEAR,FAR)。段地址:標號的段起始地址,此值必須在CS中;偏移地址:是16位無符號數(shù),它代表從段起始地址到定義標號的位置之間的字節(jié)數(shù)。類型:NEAR:段內(nèi)轉(zhuǎn)移或調(diào)用,只需要改變IP值,不需要改變CS值。標號返回值為-1(0FFFFH)FAR:指段間轉(zhuǎn)移和調(diào)用。IP和CS都將改變,標號返回值為-2(0FFFEH)15標號的屬性l
標號也有3種屬性:即15匯編語言的運算符
宏匯編允許對常量進行算術(shù)、邏輯和關(guān)系3種運算,構(gòu)成的數(shù)值表達式在匯編時完成計算。
算術(shù)運算符:+、—、*、/、MOD、SHL和SHR
如:PIEQU31416/10000
邏輯運算符:AND、OR、NOT、XOR
如:ANDAL,MASKBANDOFH和邏輯運算指令的區(qū)別:由邏輯運算符構(gòu)成的表達式在匯編時完成計算,而指令在運行時才會執(zhí)行。關(guān)系運算符:EQ(等于)、NE(不等于)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)注:關(guān)系運算符比較兩個操作數(shù)并產(chǎn)生一個邏輯值。如果關(guān)系成立,則結(jié)果為真(0FFFFH);否則為假(0000H)。16匯編語言的運算符宏匯編允許對常量進行算術(shù)、邏匯編語言的運算符值返回運算符1.$運算符:返回匯編器當前地址計數(shù)器的值。如: BLOCKDB‘Readafterme!’ NUMEQU$-BLOCK
結(jié)果NUM的值為字符串的長度14
又如: W2DW-5,1994H C1EQU($-W2)/2 ;
C1表示變量W2中元素的個數(shù)。2.SEG和OFFSET運算符:返回變量或標號的段地址和偏移地址。例如:MOVAX,SEGTABLE MOVBX,OFFSETTABLE(相當于LEABX,TABLE)17匯編語言的運算符值返回運算符17匯編語言的運算符3.TYPE運算符:用于返回變量和標號的類型例如:MOVAX,TYPETABLE
若TABLE為字節(jié)變量,則返回值為14.LENGTH和SIZE運算符
LENGTH:返回分配給該變量的元素的個數(shù);
SIZE:返回分配給該變量的字節(jié)數(shù)。即返回變量的長度LENGTH與類型TYPE之積。說明:這兩個運算符只對用DUP定義的變量有意義。例如:TABLEDW100DUP(?) MOVCX,LENGTHTABLE;CX=100 MOVDX,SIZETABLE ;DX=20018匯編語言的運算符3.TYPE運算符:用于返回變量和標號的類型匯編語言的運算符屬性運算符1.PTR運算符:忽略變量或標號的當前屬性,而給出一個臨時的類型或?qū)傩?。?: SLOTDW25 MOVAL,BYTRPTRSLOT例2:MOVBYTEPTR[BX],5或MOVWORDPTR[BX],52.THIS運算符:可用來建立一個特殊的變量,而不為其分配存儲空間。該變量的段地址和偏移地址就是后面一個變量的段和偏移地址,其類型在THIS運算符后面指定。例: F1=THISBYTE F2DW1234HMOVAX,TYPEF1 ;AX=1 MOVBL,F1 ;BL=34H19匯編語言的運算符屬性運算符19匯編語言的段定義
段定義偽指令格式:段名
SEGMENT[定位類型][組合類型][‘類別’]
…………
段名
ENDS說明:三個可選項一般情況下可不用。但如果需要用連接程序把本程序與其它程序模塊相連接時,就需要使用這些說明。20匯編語言的段定義段定義偽指令20匯編語言的段定義
定位類型:如何將組合后的段定位到存儲器中。PARA:這是隱含的定位方式,段首址的最低4位為0;BYTE:本段可從任何地址開始;WORD:本段要從偶地址開始;PAGE:段首址的低8位為0。連接方式:表明本段和其它段的組合關(guān)系(共6種,見P119)類別:必須用單引號括起來,連接時LINK將類別名相同的所有段(它們不一定同段名)存放在連續(xù)的存儲區(qū)域中。典型的類別名有:data,stack,code。21匯編語言的段定義定位類型:如何將組合后的段定位到存儲器中。匯編語言的過程定義
過程定義偽指令一個代碼段可以由一個或幾個過程組成。過程的定義格式形式如下:過程名 PROC
[NEAR]或FAR
RET
過程名 ENDPNEAR:默認狀態(tài),為段內(nèi)過程FAR:為段際過程22匯編語言的過程定義過程定義偽指令22設(shè)定段寄存器偽指令A(yù)SSUME
幾乎所有訪問存儲器的指令都僅使用偏移地址。而段地址來自某個段寄存器,所以源程序在程序代碼段的開始就要對段寄存器與段之間的關(guān)系做假定。確定段寄存器與段的關(guān)系的偽指令A(yù)SSUME格式:ASSUMESEGREGNAME:SEGNAME,……例如:assumess:stack,cs:code,ds:data注意:偽指令A(yù)SSUME只是指定某個段分配給哪個段寄存器,它并不能把段地址裝入到段寄存器中。因此要在程序中用兩條MOV指令完成這一操作,但代碼段不需要這樣做,CS的內(nèi)容將程序初始化時由系統(tǒng)自動完成。23設(shè)定段寄存器偽指令A(yù)SSUME幾乎所有訪問匯編語言源程序結(jié)構(gòu)中斷向量表ROMBIOS數(shù)據(jù)區(qū)DOS常駐部分PSP(256Byte)程序數(shù)據(jù)DOS暫駐部分視頻RAMROMBIOSRAM底端DS、ESCSRAM高端EXE文件:分段結(jié)構(gòu)的可執(zhí)行文件。EXE文件除了程序、數(shù)據(jù)外,還包含了一個文件頭,叫程序段前綴PSP(programsegmentprefix),占256個字節(jié)。
PSP的256個字節(jié)包含三部分的信息:有被裝入程序與操作系統(tǒng)連接時使用的信息,有供裝入程序使用的參數(shù),還有供操作系統(tǒng)本身使用的信息。24匯編語言源程序結(jié)構(gòu)中斷向量表ROMBIOSDOS常駐部分PS標準程序前奏當執(zhí)行EXE文件時,操作系統(tǒng)像調(diào)用子程序一樣,把控制權(quán)轉(zhuǎn)移給EXE文件,EXE文件執(zhí)行完之后也應(yīng)像子程序返回調(diào)用程序一樣將控制權(quán)返回操作系統(tǒng)。EXE文件返回DOS的兩種方法:(1)
使用4CH功能調(diào)用即在EXE文件的最后使用以下指令:
MOVAH,4CH INT21H(2)
用軟中斷INT20H,其指令機器碼是CD2025標準程序前奏當執(zhí)行EXE文件時,操作系統(tǒng)像調(diào)用標準程序前奏
PSP的頭兩個字節(jié)即為一條INT20H指令,即返回操作系統(tǒng)指令。當程序運行結(jié)束時,可以通過把程序流程轉(zhuǎn)移到PSP的這條指令而終止自己的進程。因此需要在程序一開始把PSP的起點地址壓入堆棧:
PUSHDS XORAX,AX PUSHAX這三條指令稱為標準程序前奏。這樣當程序執(zhí)行到最后一條RET指令時,它將從堆棧頂部彈出PSP的起點地址送CS和IP,使得INT20H指令得以執(zhí)行,從而把控制權(quán)交還給操作系統(tǒng)。當不把代碼段中的程序?qū)懗蛇^程時,這三行語句是不必要的,但若將其寫成DOS調(diào)用的過程,則必須加上這三條標準程序前奏。26標準程序前奏PSP的頭兩個字節(jié)即為一條INT20結(jié)束用戶程序返回DOS的方法
1.INT20H2.程序轉(zhuǎn)移到程序段前綴PSP的開始處來返回DOS,
在子程序中應(yīng)有如下程序段:
PUSHDS XORAX,AX PUSHAX MOVAX,DATA MOVDS,AX ………… RET3.用4CH功能調(diào)用
MOVAH,4CH INT21H若程序中用到附加段ES,則還應(yīng)有將附加段首址送ES的指令27結(jié)束用戶程序返回DOS的方法1.INT20H若程序中用到ORG偽指令
ORG:偽指令用于指定段內(nèi)程序或數(shù)據(jù)代碼存放的起始偏移地址,即用語句中表達式的值作為起始偏移地址,此后的程序或數(shù)據(jù)代碼將連續(xù)存放,除非遇到另一個新的ORG語句。一般格式為:
ORG<表達式>例如:DATASEGMENT BUFF1 DB 23,56H,‘EOF’
ORG 2000H BUFF2 DB ‘STRING’ DATAENDS28ORG偽指令ORG:偽指令用于指定段內(nèi)程序或數(shù)據(jù)代碼存放的匯編結(jié)束偽指令語句END
匯編結(jié)束偽指令語句ENDEND偽指令用在源程序的最后,用以表示整個源程序的結(jié)束,即告訴匯編程序,匯編工作到此結(jié)束。格式:END[表達式]說明:表達式為程序第一條可執(zhí)行指令的地址。如果不帶表達式,則該程序不能單獨執(zhí)行,只是供其他程序調(diào)用的子模塊。29匯編結(jié)束偽指令語句END匯編結(jié)束偽指令語句END29匯編語言源程序結(jié)構(gòu)PSP(256Byte)0000RAM底端CS,DS,ES,SSIP=0100HSP=0FFFEHRAM高端COM文件所占存儲空間比EXE文件小,不允許超過64K。COM文件不分段,且不允許定義堆棧段,占有的空間所有的過程均應(yīng)定義為NEAR,其入口點必須是0100H。只能用來編制較小的程序。由于其小而簡單,裝入速度比EXE文件要快。64KB30匯編語言源程序結(jié)構(gòu)PSP(256Byte)0000RAM底例題詳解
某程序中的數(shù)據(jù)定義如下:
DAT1 DW?,18DUP(9)
DAT2 DB90,67,12,176,100,8 DAT3 DD?,?,15 CNT1 EQU $-DAT2 CNT2 EQU$-DAT3問CNT1、CNT2的值以及上述數(shù)據(jù)定義占用多少字節(jié)的內(nèi)存?答案:CNT1=18CNT2=12
共占用字節(jié):56個字節(jié)31例題詳解某程序中的數(shù)據(jù)定義如下:答案:CNT1=1831執(zhí)行以下程序段后,AX的內(nèi)容為:
ORG0000HTABLEDW12H,34H,56H,$+1018,78H,90HCOUNTEQU3LEABX,TABLEMOVDX,4[BX]MOVAX,[BX+2*COUNT]SUBAX,DXBX=0000HDX=0056HAX=0400HAX=03AAH注意:$+1018中的1018是十進制數(shù),即十六進制數(shù)3FA例題詳解
32執(zhí)行以下程序段后,AX的內(nèi)容為:BX=0000H注意:$執(zhí)行以下程序段后,CL和AX的內(nèi)容各為:STR1 DW ‘AB’STR2 DB16DUP(?)CNT EQU $-STR1 MOVCX,CNT MOVAX,STR1 HLT答案:CL=12HAX=4142H例題詳解
33執(zhí)行以下程序段后,CL和AX的內(nèi)容各為:答案:例題詳解33求下列數(shù)據(jù)段中每個符號或變量所對應(yīng)的值:DATA SEGMENTORG 1000HMAX EQU0FFHONE EQUMAXMOD10TWOEQUONE*4SIZE EQU((TWOLT20H)AND10H)+10HBUF DBSIZE*2DUP(?)COUNTEQU$-BUFDATAENDSMAX=FFHONE=05HTWO=14HSIZE=20HBUF=1000HCOUNT=40H例題詳解
34求下列數(shù)據(jù)段中每個符號或變量所對應(yīng)的值:MAX=FFH例題詳匯編程序設(shè)計
在匯編語言程序中,最常見的結(jié)構(gòu)有:
l
順序結(jié)構(gòu)
l
分支結(jié)構(gòu)
l循環(huán)結(jié)構(gòu)
l子程序結(jié)構(gòu)
這幾種程序的設(shè)計方法是匯編程序設(shè)計的基礎(chǔ)。35匯編程序設(shè)計在匯編語言程序中,最常見的結(jié)構(gòu)有:35順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)程序設(shè)計是沒有分支,沒有循環(huán)的直線運行程序,它的執(zhí)行順序和指令的排列順序完全一致。例1:利用查表法計算平方值。已知0~9的平方值連續(xù)存在以SQTAB開始的存儲區(qū)域中,求SUR單元內(nèi)容X的平方值,并放在DIS單元中。假定0≤X≤9且為整數(shù)。解:(1)了解平方表的存放位置;(2)根據(jù)X的值,找到X對應(yīng)X2在表中位置。36順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)程序設(shè)計是沒有分支,沒有循環(huán)的直線運DATASEGMENT SURDB2DISDB?SQTABDB0,1,4,9,16,25,36,49,64,81DATAENDS順序結(jié)構(gòu)程序設(shè)計數(shù)據(jù)段的定義部分:根據(jù)題目要求,定義SUR、DIS、SQTAB三個變量STACKSEGMENT DB100DUP(?)STACKENDS堆棧段的定義部分:37DATASEGMENT順序結(jié)構(gòu)程序設(shè)計數(shù)據(jù)段的定義部CODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKBEGINPROCFAR PUSHDS XORAX,AX PUSHAX MOVAX,DATA MOVDS,AX LEABX,SQTAB ;取平方表基地址
MOV AH,0 MOV AL,SUR ;AL=X ADD BX,AX ;計算地址偏移
MOV AL,[BX] ;取出X的平方值
MOV DIS,AL RETBEGINENDPCODEENDS ENDBEGIN順序結(jié)構(gòu)程序設(shè)計代碼段的定義部分:標準程序前綴38CODESEGMENT順序結(jié)構(gòu)程序設(shè)計代碼段的定義部為使程序精練,可采用查表指令XLAT,代碼段如下:BEGIN:PUSHDS MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX LEABX,SQTAB MOVAL,SUR;AL=X XLATSQTAB MOVDIS,AL順序結(jié)構(gòu)程序設(shè)計39為使程序精練,可采用查表指令XLAT,代碼段如下:順序結(jié)構(gòu)程分支結(jié)構(gòu)程序設(shè)計
分支結(jié)構(gòu):分支程序經(jīng)常利用改變標志位的指令和轉(zhuǎn)移指令來實現(xiàn)。如采用比較指令CMP和測試指令TEST,產(chǎn)生相應(yīng)的狀態(tài)標志,選擇適當?shù)臈l件轉(zhuǎn)移指令,實現(xiàn)不同情況的分支轉(zhuǎn)移。40分支結(jié)構(gòu)程序設(shè)計分支結(jié)構(gòu):分支程序經(jīng)常利用改變標志位的指令分支結(jié)構(gòu)程序設(shè)計實例
=0?
BX=0BX=1BX=–1YY
>0?例編程實現(xiàn)符號函數(shù)。
1X>0Y=0X=0–1X<041分支結(jié)構(gòu)程序設(shè)計實例=0?BX=0BX=1BX根據(jù)上述要求的程序段為:START:MOVAX,BUFFER ;取變量X OR AX,AX ;產(chǎn)生狀態(tài)標志
JE ZERO ;X=0則轉(zhuǎn)移ZERO:MOVBX,0
JMPCONT1CONT1:……
JMPCONT1 ;轉(zhuǎn)向出口
JNSPLUS ;X為正則轉(zhuǎn)移
MOVBX,0FFFFH ;BX=–1 PLUS:MOVBX,1分支結(jié)構(gòu)程序設(shè)計實例
42根據(jù)上述要求的程序段為:ZERO:MOVBX,0循環(huán)結(jié)構(gòu)
順序結(jié)構(gòu)和分支結(jié)構(gòu)程序中的指令,最多只執(zhí)行一次,若要重復(fù)執(zhí)行某些指令,需用循環(huán)結(jié)構(gòu)實現(xiàn)。循環(huán)程序由4個功能部分組成:(1)循環(huán)準備:對循環(huán)體要使用的工作單元及寄存器置初值,如建立地址指針、設(shè)置計數(shù)器初值、將工作寄存器或工作單元清零等。(2)循環(huán)處理:重復(fù)進行數(shù)據(jù)處理操作。(3)循環(huán)控制:為下一輪循環(huán)處理修改數(shù)據(jù)地址指針和計數(shù)器值等,并判斷結(jié)束條件是否滿足。(4)結(jié)果處理:分析并轉(zhuǎn)存處理結(jié)果。43循環(huán)結(jié)構(gòu)順序結(jié)構(gòu)和分支結(jié)構(gòu)程序中的指令,最多只執(zhí)行循環(huán)結(jié)構(gòu)
例:設(shè)內(nèi)存BUFF開始的單元中依次存放著30個8位無符號字節(jié)數(shù),求它們的和并存放在SUM單元中。程序如下:
MOV SI,BUFFMOV CX,30XOR AX,AXAGAIN:ADD AL,[SI] ADC AH,0 INC SI DEC CX;可用LOOPAGAIN JNZ AGAIN MOV SUM,AX44循環(huán)結(jié)構(gòu)例:設(shè)內(nèi)存BUFF開始的單元中依次存放著30個8例:在DS數(shù)據(jù)段中,從偏移地址BUFFER起,順序存放著100個無符號16位數(shù),編寫程序?qū)⑦@100個字數(shù)據(jù)從大到小排序。解法一:
LEA DI,BUFFER;取首地址
MOV BL,99;須經(jīng)N-1次排序NEXT0:MOV SI,DI;SI恢復(fù)指向首地址
MOV CL,BL;每次排序的比較次數(shù)NEXT3:MOV AX,[SI];當前16位數(shù)放在AX中
ADD SI,2;SI指向下一個16位數(shù)
CMP AX,[SI];當前數(shù)與下一個數(shù)比較
JNC NEXT5;大于等于則不交換
MOV DX,[SI];小于則交換
MOV [SI–2],DX;可XCHG[SI],AX MOV [SI],AX;MOV[SI-2],AXNEXT5:DEC CL;計算比較次數(shù)
JNZ NEXT3 DEC BL;每次排序的比較次數(shù)減一
JNZ NEXT0 HLT循環(huán)結(jié)構(gòu)
45例:在DS數(shù)據(jù)段中,從偏移地址BUFFER起,順序存放著10解法二:LEADI,BUFFER;取首地址
MOVCOUNT,100;排序元素的個數(shù)
CLD;地址遞增排序NEXT1:MOVBX,1;交換標記
DEC COUNT;每次排序的比較次數(shù)減1JZEXIT;比較次數(shù)為0則結(jié)束
MOVSI,DI;SI恢復(fù)指向首地址
MOVCX,COUNT;每次排序的比較次數(shù)NEXT2:LODSW;當前數(shù)→AX,SI→下一個數(shù)
CMPAX,[SI];當前數(shù)與下一個數(shù)比較
JNCNEXT3;大于等于則不交換
XCHG[SI],AX;小于則交換
MOV[SI–2],AX;大數(shù)存入上一位置
XORBX,BX;有交換則交換標記清零NEXT3:LOOPNEXT2;一次排序是否結(jié)束?
CMPBX,0;一次排序是否有交換?
JENEXT1;有交換則繼續(xù)EXIT:MOVAX,4C00H INT21H循環(huán)結(jié)構(gòu)
46解法二:LEADI,BUFFER例題詳解例:下面是實現(xiàn)8A0BH和D705H兩個數(shù)相加的程序,請在空白處填寫正確的指令:DATASEGMENTFIRSTDB____,____,0HSECONDDB____,____DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,____MOVSI,0______答案:0BH8AH05HD7H2CLC0NEXT:MOVAL,SECOND[SI]ADCFIRST[SI],ALINCSILOOPNEXTMOVAL,0ADCAL,____MOVFIRST[SI],ALMOVAH,4CHINT21HCODEENDSENDSTART47例題詳解例:下面是實現(xiàn)8A0BH和D705H兩個數(shù)相加的程序子程序結(jié)構(gòu)
循環(huán)程序設(shè)計技術(shù)解決了同一程序中連續(xù)多次有規(guī)律重復(fù)執(zhí)行某個或某些程序段的問題。但對于無規(guī)律的重復(fù)就不能用循環(huán)程序?qū)崿F(xiàn)。更多的情況是在不同的程序中或在同一個程序的不同位置常常要用到功能完全相同的程序段,如數(shù)制之間的轉(zhuǎn)換、代碼轉(zhuǎn)換、初等函數(shù)計算等。對于這樣的程序段,為避免編制程序的重復(fù)勞動,節(jié)省存儲空間,往往把它獨立出來附加少量額外的指令,將其編制成可供反復(fù)調(diào)用的公用的獨立程序段,并通過適當?shù)姆椒ò阉推渌绦蚨芜B接起來。
48子程序結(jié)構(gòu)循環(huán)程序設(shè)計技術(shù)解決了同一程序中子程序結(jié)構(gòu)主程序與子程序間的參數(shù)傳遞:(1)寄存器法:傳遞的參數(shù)和出口參數(shù)都在約定的寄存器中,當所傳遞的參數(shù)較少時,一般用這種方法。(2)堆棧法:在調(diào)用子程序前,入口參數(shù)由主程序送入堆棧中,子程序從堆棧中取得這些參數(shù),并將處理結(jié)果送到堆棧中,返回主程序后,主程序從堆棧取得結(jié)果。(3)參數(shù)賦值法:若主程序和子程序在同一代碼段時,可把參數(shù)存放在主程序調(diào)用子程序指令后面的一串單元中。49子程序結(jié)構(gòu)主程序與子程序間的參數(shù)傳遞:49子程序結(jié)構(gòu)各種參數(shù)傳遞方法的比較
優(yōu)點:在參數(shù)的傳遞方法中,寄存器法最簡單,堆棧法最節(jié)省存儲單元,參數(shù)賦值法最直觀;缺點:寄存器法不能傳遞較多的參數(shù),堆棧法和參數(shù)賦值法編程較麻煩。經(jīng)驗證明,參數(shù)不多時,用寄存器法最適宜;參數(shù)較多時用堆棧法或參數(shù)賦值法。50子程序結(jié)構(gòu)各種參數(shù)傳遞方法的比較50主程序和子程序公用寄存器的處理問題子程序不可避免地要使用一些寄存器,因此子程序執(zhí)行后,某些寄存器的內(nèi)容會發(fā)生變化,如果主程序在這些寄存器中已經(jīng)存放了有用的數(shù)據(jù),則從子程序返回主程序后,主程序的運行勢必會因原存放信息被破壞而出錯。子程序結(jié)構(gòu)51主程序和子程序公用寄存器的處理問題子程序結(jié)構(gòu)51主程序和子程序公用寄存器的處理問題解決這個問題的方法是使用這些寄存器之前,將其內(nèi)容保存起來,使用之后再將其還原。前者稱為保護現(xiàn)場,后者稱為恢復(fù)現(xiàn)場。該工作一般在子程序中完成。如:
PUSHAX PUSHBX
POPBX POPAX子程序結(jié)構(gòu)52主程序和子程序公用寄存器的處理問題子程序結(jié)構(gòu)52全國三級PC技術(shù)上機考題題目要求:請編制程序,其功能是:內(nèi)存中連續(xù)存放著20個ASCII字符,如果是小寫字母a-z之間的字符,請將其轉(zhuǎn)換成相應(yīng)的大寫字符;若為其他字符,不作轉(zhuǎn)換。例如:內(nèi)存中有
61H('a'),62H('b'),31H('1')41H('
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個人房屋租賃的合同(2篇)
- 2025年個人房屋買賣協(xié)議參考模板(2篇)
- 2025年二手房轉(zhuǎn)讓房產(chǎn)協(xié)議范文(2篇)
- 2025年五年級上班隊工作總結(jié)(二篇)
- 2025年主要農(nóng)作物新品種展示示范協(xié)議(6篇)
- 大型機械拆卸運輸合同
- 兒童樂園對公裝修合同
- 鐵路熱熔標線施工方案
- 賓館改造瓦工單包合同
- 化妝品快遞配送合同范本
- 行政區(qū)域代碼表Excel
- 少兒財商教育少兒篇
- GB 1886.114-2015食品安全國家標準食品添加劑紫膠(又名蟲膠)
- 初二上冊期末數(shù)學(xué)試卷含答案
- envi二次開發(fā)素材包-idl培訓(xùn)
- 2022年上海市初中語文課程終結(jié)性評價指南
- 西門子starter軟件簡易使用手冊
- 隧道施工監(jiān)控量測方案及措施
- 桂花-作文ppt-PPT課件(共14張)
- 配電房日常檢查記錄表.docx
- 高一數(shù)學(xué)概率部分知識點總結(jié)及典型例題解析 新課標 人教版 必修
評論
0/150
提交評論