第4講8086程序設(shè)計_第1頁
第4講8086程序設(shè)計_第2頁
第4講8086程序設(shè)計_第3頁
第4講8086程序設(shè)計_第4頁
第4講8086程序設(shè)計_第5頁
已閱讀5頁,還剩97頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1/96主要內(nèi)容:一、匯編語言語句格式二、匯編語言偽指令三、匯編語言源程序的匯編與連接四、匯編語言程序設(shè)計的基本方法第4講匯編語言程序設(shè)計2/96本講重點:偽操作匯編語言程序格式

簡單匯編程序設(shè)計第4講匯編語言程序設(shè)計3/96一、匯編語言語句格式匯編語言語句有指令性語句、偽指令語句和宏指令語句三種類型。1、指令性語句:[標(biāo)號:]操作碼[操作數(shù)][;注釋]是機(jī)器指令的符號表示,經(jīng)匯編產(chǎn)生對應(yīng)的機(jī)器指令代碼,在形成執(zhí)行文件時執(zhí)行。2、偽指令語句:[名字]偽指令助記符[操作數(shù)][;注釋]只是給匯編程序提供一些控制信息,幫助匯編程序正確匯編指令性語句,沒有對應(yīng)的機(jī)器碼。說明:名字可以是符號常量名、變量名、過程名、段名等,名字后面不能有“:”。偽指令命令助記符共有40多個,按功能不同分成八類。操作數(shù)之間須用逗號分隔。3、宏指令語句:[宏名]宏操作助記符[操作數(shù)][;注釋]是指令性語句和指示性語句的復(fù)合體,在匯編時被展開。說明:宏名即宏指令名,是一標(biāo)識符,宏名后面不能有“:”。宏操作助記符有MACRO、ENDM、LOCAL、REPT、IRP、PURGE等8個。匯編程序不區(qū)分大小寫4/96匯編語言語句統(tǒng)一格式規(guī)定

指令性語句、偽指令語句和宏指令語句的統(tǒng)一格式:[名字項]操作項[操作數(shù)項][;注釋項]1.名字項:最多由21個字符組成。可由下列字符組成。

①字母A~Z、a~z ②數(shù)字0~9 ③特殊符號?、·

、@、-、$等注意:名字項的第一個字符不可以是數(shù)字,必須是字母或特殊字符,但是問號本身不能單獨作為名字;如果用到特殊符號,則它必須是首字符。匯編語言的專用保留字、寄存器名、8088/8086匯編語言中的指令助記符、偽指令名、表達(dá)式中使用的運算符和屬性運算符等均不能作為名字項,否則匯編會給出錯誤信息;名字項在程序中不能重復(fù)定義。5/96(1)段屬性:可用SIG偽指令求出此屬性用于定義標(biāo)號和變量的段起始地址。標(biāo)號通常在代碼段CS中定義,變量通常在DS、ES和SS段中定義。(2)偏移屬性:可用OFFSET偽指令求出此屬性指出標(biāo)號或變量距離段起始地址的字節(jié)數(shù),它是一個16位的無符號數(shù)。(3)類型屬性:可用TYPE偽指令求出對標(biāo)號而言,此屬性指出其引用類型,段內(nèi)引用屬于NEAR類,指針長度為2字節(jié);段間引用屬于FAR類,指針長度為4字節(jié)。對變量而言,此屬性指出其字節(jié)長度,可為1、2、4、8、10個字節(jié)。名字項屬性6/962.操作項可以是指令、宏指令、偽指令的助記符。

【例】LOOP:

MOV

AX,BX

BUFFER DB

1,2,3,4,5,6,7

;數(shù)據(jù)定義偽指令,在主存中開辟7個連續(xù)的字節(jié)單元,初值依次為1~7,BUFFER表示首地址7/963.操作數(shù)項操作數(shù)項可以由常量、寄存器、標(biāo)號、變量或表達(dá)式等組成。(1)常量常量是沒有屬性的純數(shù),其數(shù)值在匯編過程中被確定,并在程序運行時保持不變。分為數(shù)值常量和字符型常量。各種形式數(shù)字常量格式對照表8/96字符串常量字符串常量是用單引號或雙引號引起來的一個或多個字符。字符串常量是以各字符的ASCⅡ碼表示的。如‘A’用41H表示,字符串‘A1B2’用41H,31H,42H,32H表示。9/96常數(shù)項舉例[例5.2]SUB DH,22 ;常數(shù)22為立即數(shù),匯編后為16HMOV BX,[SI十32H] ;常數(shù)32H作位移量DB 12H ;定義一個字節(jié)數(shù)據(jù)DW 1234H ;定義一個字?jǐn)?shù)據(jù)DD 12345678H ;定義一個雙字?jǐn)?shù)據(jù)DB ′9BD′ ;定義三個字節(jié)的字符串?dāng)?shù)據(jù),在 內(nèi)存中就是39H、42H、44H10/96(2)表達(dá)式及運算符算術(shù)運算符移位運算符邏輯運算符關(guān)系運算符分析運算符綜合運算符表達(dá)式由常數(shù)、寄存器、標(biāo)號、變量與一些運算符組合而成,分為數(shù)字表達(dá)式和地址表達(dá)式。匯編過程中,匯編程序按照一定的優(yōu)先規(guī)則,對表達(dá)式進(jìn)行計算后得到一個數(shù)值或地址,用作指令的操作數(shù)。11/96算術(shù)運算符:+(加)、-(減)、*(乘)、/(除)、MOD(求模)移位運算符:SHL(左移)、SHR(右移)可以用于數(shù)值表達(dá)式又可用于地址表達(dá)式。算術(shù)運算符和移位運算符12/96【例】算術(shù)和移位運算符進(jìn)行數(shù)值表達(dá)式運算

┆NUM1 EQU 25*4–50 ;NUM1=50NUM2 EQU NUM1/7 ;NUM2=7NUM3 EQU NUM1MOD7 ;NUM3=1NUM4 EQU 0FH ┆MOV AL,NUM4SHL4 ;(AL)=11110000B表達(dá)式賦值操作符EQU有時候程序中多次出現(xiàn)同一個表達(dá)式,為方便起見,可以用賦值偽操作給表達(dá)式賦予一個名字。其格式如下:

Expression_nameEQUExpression此后程序中凡需要用到該表達(dá)式指出,就可以用表達(dá)式名來代替了。可見,EQU的引入提高了程序的可讀性,也是其容易修改。上始終的表達(dá)式可以是任何有效的操作數(shù)格式,可以是任何可求出常數(shù)值的表達(dá)式,也可以是任何有效的助記符。13/9614/96與(AND)、或(OR)、異或(XOR)、非(NOT)四種運算。由于邏輯運算是按位操作,且在匯編過程中完成,因而運算的結(jié)果仍為整數(shù)常量?!纠坑眠壿嬤\算符進(jìn)行運算。MOV AL,34HAND0FH ;04H→ALMOV BL,05HOR30H ;35H→BLMOV CX,NOT00FFH ;0FF00H→CXMOV DX,789AHXOR000FH ;7895H→DX邏輯運算符15/96相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。運算結(jié)果成立時邏輯值為真,用0FFFFH表示;關(guān)系不成立時邏輯值為假,用0表示。

【例】用關(guān)系運算符進(jìn)行數(shù)值表達(dá)式運算。NUM1 EQU 10LT5;NUM1=0NUM2 EQU 0AAAAHGT7FFFH

;NUM2=0FFFFHMOV AX,‘A‘EQ41H ;0FFFFH→AXMOV BX,NUM2LTNUM1 ;0→BX關(guān)系運算符16/96把標(biāo)號或變量所指存儲器地址的屬性(段、偏移量和類型)或一些特征分離出來,作為操作數(shù)使用。主要介紹3個:

SEG

運算符

OFFSET運算符

TYPE運算符分析運算符號17/96格式:SEG變量或標(biāo)號功能:分離出其后變量或標(biāo)號所在段的段首址。【例】已知數(shù)據(jù)段從存儲器的23000H地址開始,DBUF是該段中的一個變量名。

MOVBX,SEGDBUF

匯編為:MOVBX,2300H①SEG運算符18/96格式:OFFSET變量或標(biāo)號功能:分離出其后變量或標(biāo)號的偏移地址?!纠恳阎獦?biāo)號START的段地址為2100H,物理地址為21200H。MOVDX,OFFSETSTART匯編為:MOVDX,0200H這條指令與指令LEADX,START功能相同。②OFFSET運算符19/96格式:TYPE變量或標(biāo)號功能:分離出其后變量或標(biāo)號的類型。如果是變量,將返回該變量的類型對應(yīng)字節(jié)數(shù);如果是標(biāo)號,則返回代表標(biāo)號類型的數(shù)值。它們之間的關(guān)系見下表所示。③TYPE運算符【例】已定義

ARRAYDB22,33指令A(yù)DDSI,TYPEARRAY匯編為:ADDSI,120/96①段屬性前綴運算符“∶”格式為:段寄存器名∶地址表達(dá)式或段名∶地址表達(dá)式或組名∶地址表達(dá)式此運算符用來表示一個標(biāo)號、變量或地址表達(dá)式的段屬性?!纠坑枚吻熬Y指定附加段內(nèi)操作數(shù)的地址MOVAL,ES∶DATA;指令源操作數(shù)在附加段DATA地址單元中(5)綜合運算符21/96②LOW和HIGH格式為:

LOW表達(dá)式 或HIGH表達(dá)式此運算符用于對一個16位數(shù)據(jù)或地址表達(dá)式,用HIGH取其高位字節(jié)、LOW取其低位字節(jié)。所以此運算符又稱為字節(jié)分離運算符?!纠恳阎猂ESULTEQU7788H則 MOVAH,HIGHRESULT 匯編為:MOVAH,77H MOVAL,LOWRESULT 匯編為:MOVAL,88H(5)綜合運算符22/96本節(jié)介紹了幾種常用的運算符。為了正確計算表達(dá)式的數(shù)值,應(yīng)該按照運算符的優(yōu)先級:

先高后低、自左向右(優(yōu)先級相同時)地進(jìn)行計算。括號內(nèi)的表達(dá)式應(yīng)優(yōu)先計算。下面給出相關(guān)運算符從高到低的優(yōu)先級排列順序:表達(dá)式及運算符小結(jié)23/96(在圓括號中的項),[方括號中的項],〈結(jié)構(gòu)變量(變量、字段)〉

LENGTH,SIZE、WIDTH和MASK操作符,WIDTH和MASK是作用于記錄類型的兩個專用保留字,利用它們可得到記錄類型的不同屬性PTR,OFFSET,SEG,TYPE,THIS及段運算符

HIGH和LOW*,/,MOD,SHL(左移),SHR(右移)+,-

EQ,NE,LT,LE,GT,GENOTANDOR,XORSHORT表達(dá)式及運算符小結(jié)高低24/964.注釋項一行語句分號后面的內(nèi)容,主要用來說明程序或語句功能,增加程序的可讀性。對于較大的程序,注釋項更不能缺少。分號(;)放在語句后,用來說明該語句的功能;分號放在某一行的開頭,用來說明下面一段程序的功能;分號加到指令前,可暫時凍結(jié)有疑問的指令,調(diào)試正確后,再把這些指令解凍或刪除,這樣可減少語句增、刪的編輯工作。

25/96

MOVCX,0 ;傳送指令,具有2個操作數(shù)DELAY: NOP;空操作指令,沒有操作數(shù),帶有標(biāo)號

LOOPDELAY

;循環(huán)指令,標(biāo)號DELAY說明轉(zhuǎn)移位置BUFFER DB1,2,3,4,5,6,7

;數(shù)據(jù)定義偽指令,在主存中開辟7個連續(xù)的字節(jié)單元,初值依次為1~7,BUFFER表示首地址匯編語言語句實例26/96本節(jié)小結(jié)匯編語言指令格式[名字項]操作項[操作數(shù)項][;注釋項]標(biāo)號和變量的屬性:

段屬性、偏移屬性、類型屬性操作數(shù)的表達(dá)形式

算術(shù)、移位、邏輯、關(guān)系、屬性、綜合運算符首頁27/96二、匯編語言偽指令偽指令:在匯編程序?qū)υ闯绦騾R編期間由匯編程序處理的操作(不是真正執(zhí)行的指令),可以完成處理器選擇、定義程序模式、定義數(shù)據(jù)、分配存儲區(qū)、指示程序結(jié)束等功能。常用偽指令:處理器選擇偽指令;段定義偽指令程序開始與結(jié)束偽指令;數(shù)據(jù)定義與存儲器分配偽指令;賦值偽指令;地址計數(shù)器與對準(zhǔn)偽指令;基數(shù)控制偽指令;偶地址對準(zhǔn)偽指令;28/961.處理器選擇偽操作.8086

選擇8086指令系統(tǒng).286

選擇80286指令系統(tǒng).286P

選擇保護(hù)模式下的80286指令系統(tǒng).386

選擇80386指令系統(tǒng).386P

選擇保護(hù)模式下的80386指令系統(tǒng).486

選擇80486指令系統(tǒng).486P

選擇保護(hù)模式下的80486指令系統(tǒng).586

選擇Pentium指令系統(tǒng).586P

選擇保護(hù)模式下的Pentium指令系統(tǒng)一般放在整個程序的最前面。默認(rèn)值為.808629/962.段定義偽指令完整的匯編語言源程序由段組成一個匯編語言源程序可以包含若干個代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列。需獨立運行的程序必須包含一個代碼段,并指示程序執(zhí)行的起始點,一個程序只有一個起始點所有的可執(zhí)行性語句必須位于某一個代碼段內(nèi),說明性語句可根據(jù)需要位于任一段內(nèi)通常,程序還需要一個堆棧段30/962.段定義偽操作源程序分別用兩種格式書寫第一種格式從MASM5.0開始支持簡化段定義格式第二種格式MASM5.0以前就具有完整段定義格式Hello,Everybody!程序功能31/96;EXAMPLE5.42 ;程序注釋;…………………數(shù)據(jù)段說明2DATASEGMENT; 數(shù)據(jù)段

┇3 DATAENDS;…………………堆棧段說明STACKSEGMENTPARASTACK′STACK′;堆棧段

┇5 STACKENDS;……………代碼段說明6 CODESEGMENT ;代碼段7 STARTPROCFAR ;遠(yuǎn)過程調(diào)用定義8 ASSUMECS∶CODE,DS∶DATA,ES∶DATA,SS∶STACK完整段定義偽操作基本格式(1)32/969PUSHDS ;保存返回地址10 MOVAX,011 PUSHAX12 MOVAX,DATA;初始化DS,ES13 MOVDS,AX14 MOVES,AX

┇ ;自己編寫的程序;………………15 RET ;返回DOS16 STARTENDP;………………17 CODEENDS ;代碼段結(jié)束;………18 ENDSTART ;匯編到此結(jié)束33/96;EXAMPLE5.42 ;程序注釋;…………………數(shù)據(jù)段說明2DATASEGMENT; 數(shù)據(jù)段

┇3 DATAENDS;…………………堆棧段說明STACK SEGMENT STACK;堆棧段

┇5 STACKENDS;……………代碼段說明6 CODESEGMENT ;代碼段8 ASSUMECS∶CODE,DS∶DATA,ES∶DATA,SS∶STACK完整段定義偽操作基本格式(2)34/9612 START: MOVAX,DATA;初始化DS,ES13 MOVDS,AX14 MOVES,AX

┇ ;自己編寫的程序;………………15 MOV AH,4CH ;用DOS調(diào)用功能返回操作系統(tǒng)16 INT 21H;………………17 CODEENDS;………18 ENDSTART35/96;lt401b.asm(文件名)stack segmentstack ;定義堆棧段

dw512dup(?) ;堆棧段有512字(1024字節(jié))空間stack ends ;堆棧段結(jié)束data segment ;定義數(shù)據(jù)段string db’Hello,Everybody!’,0dh,0ah,’$’data endscode segment’code’ ;定義代碼段

assumecs:code,ds:data,ss:stackstart: movax,data ;建立DS段地址

movds,ax【例】完整段定義格式舉例36/96

movdx,offsetstring;顯示字符串 movah,9 int21h movax,4c00h int21h ;利用功能調(diào)用返回DOScode ends ;代碼段結(jié)束

endstart ;匯編結(jié)束,同時指明程序起始點【例】完整段定義格式舉例(續(xù))37/96;SampleC.ASM

.modelsmall;存儲模型(各段在存儲器中的存放方式) .stack 100H ;定義堆棧段

.data ... ;在數(shù)據(jù)段定義數(shù)據(jù)

.codestart:movax,@data movds,ax

... ;在代碼段填入指令序列

movax,4c00h int21h

... ;子程序代碼

endstart簡化段定義格式(

MASM5.x支持)38/96;lt401a.asm(文件名)

.modelsmall ;定義程序的存儲模式

.stack ;定義堆棧段

.data ;定義數(shù)據(jù)段string db’Hello,Everybody!’,0dh,0ah,’$’

;在數(shù)據(jù)段定義要顯示的字符串

.code ;定義代碼段start:movax,@data ;程序起始點,建立DS、SS movds,ax

movdx,offsetstring ;指定字符串

movah,9 int21h

;利用功能調(diào)用顯示信息

movax,4c00h ;程序結(jié)束點,返回DOS int21h end ;匯編結(jié)束【例】簡化段定義格式舉例(

MASM5.x支持)39/96;SampleA.ASM.modelsmall.stack.data

... ;在數(shù)據(jù)段定義數(shù)據(jù).code

.startup

;(定義程序初始入口點)

... ;在代碼段填入指令序列

.exit0

;(返回操作系統(tǒng))

... ;子程序代碼

end

;(源程序結(jié)束)簡化段定義格式(MASM6.x支持)注意:簡化段定義比完整段格式簡單得多。但完整段定義可以全面地說明段的各種類型與屬性,因此在很多情況下仍需使用。40/96(1)程序開始偽指令此指令指明程序模塊的開始,并定義模塊名。指令格式:NAME模塊名或TITLE標(biāo)題名程序中若缺省該偽指令,則取TITLE語句中的頁標(biāo)題前6個字符;若沒有TITLE語句,則取源程序文件名為模塊名。(2)源程序結(jié)束偽指令此指令指明匯編語言程序模塊的結(jié)束。指令格式:END[標(biāo)號]標(biāo)號指示程序的起始地址。多個程序模塊連接時,只有主程序需要使用標(biāo)號,其他子程序模塊則不必指定標(biāo)號。3.程序開始和結(jié)束偽指令41/964.數(shù)據(jù)定義及存儲器分配偽指令指令格式:[變量名]助記符〈表達(dá)式〉[;注釋]功能:從變量名所代表的地址單元開始定義數(shù)據(jù)存儲區(qū),類型由數(shù)據(jù)定義偽指令確定,。[變量名]DB〈表達(dá)式〉;定義字節(jié)變量。[變量名]DW〈表達(dá)式〉;定義字變量。[變量名]DD〈表達(dá)式〉;定義雙字變量。[變量名]DQ〈表達(dá)式〉;定義四字變量。[變量名]DT〈表達(dá)式〉;定義十字節(jié)變量。42/96表達(dá)式項是給變量或指定存儲單元賦予初值,它有以下幾種形式:(1)數(shù)值表達(dá)式(2)字符串表達(dá)式:以單引號括起,存放為ASCII碼(3)?表達(dá)式:保留存儲空間,但不存入數(shù)據(jù)(4)帶DUP的表達(dá)式:數(shù)組表達(dá)式4.數(shù)據(jù)定義及存儲器分配偽指令表達(dá)式的形式43/96【例】操作數(shù)為常數(shù)或表達(dá)式DATA_BYTEDB 15,8,15HDATA_WORDDW200,200H,-10DATA_DWDD4*30,0AFFDH44/96【例】操作數(shù)為字符串STR1DB'Hello'STR2DB'ABC'STR3DW'AB','CD'注意:不能寫成DB‘ABCD’45/96【例】操作數(shù)為?CNT1DB0,?,?,0CNT2DW?,100,?注意:?為系統(tǒng)保留單元,一般系統(tǒng)填充為00H46/96【例】DUP的使用

DA1DB2DUP(5,6);

從DA1地址單元開始存放二組“05H,06H”共4個地址單元DA2DW40DUP(?);

從DA2地址單元開始保留40個字共80個地址單元DA3DB2DUP(1,2DUP(3),4);從DA3地址單元開始存放2組“01,03,03,04”,共占用8個地址單元。47/96data segment ;數(shù)據(jù)段X db'a',-5 db2dup(100),?Y db'ABC'data ends字節(jié)單元定義實例應(yīng)用48/96LEAAX,X;AX←0000H,在數(shù)據(jù)定義偽指令前面的變量的值,是該偽指令中的第一個數(shù)據(jù)項在當(dāng)前段內(nèi)的第一個字節(jié)的偏移地址。MOVAL,X;此處X表示它的第1個數(shù)據(jù),故AL←'a'DECX+1;對X為始的第2個數(shù)據(jù)減1,故成為-6MOVY,AL;現(xiàn)在Y這個字符串成為'aBC'字節(jié)變量的應(yīng)用49/965.表達(dá)式賦值偽操作利用一個標(biāo)識符表達(dá)的一個數(shù)值。MASM提供等價機(jī)制,用于常量定義等價EQU偽指令符號名EQU數(shù)值表達(dá)式符號名EQU<字符串>等號=偽指令符號名=數(shù)值表達(dá)式常數(shù)若使用有意義的符號名來表示,可以提高程序的可讀性,同時更具有通用性EQU和=的區(qū)別:EQU偽操作中的標(biāo)號名是不允許重復(fù)定義的;“=”

偽操作是允許重復(fù)定義的。50/96表達(dá)式名EQU表達(dá)式ALPHAEQU9BETAEQUALPHA+18BBEQU[BP+8]“=”偽操作(允許重復(fù)定義)……EMP=7……EMP=EMP+1……◆表達(dá)式賦值偽操作:51/96符號定義

DosWriteChar equ 2 CarriageReturn = 13 CallDOS equ <int21h>符號應(yīng)用(左邊程序段等價右側(cè)的符號形式)

movah,2 ;movah,DosWriteChar movdl,13 ;movdl,CarriageReturn int21h ;CallDOS符號常數(shù)實例52/966.地址計數(shù)器與對準(zhǔn)偽操作定位偽指令控制數(shù)據(jù)的偏移地址ORG

參數(shù);將當(dāng)前偏移地址指針指向參數(shù)表達(dá)的偏移地址:ORG100h ;從100h處安排數(shù)據(jù)或程序ORG$+10;使偏移地址加10,即跳過10個字節(jié)空間MASM中,符號“$”表示當(dāng)前偏移地址值EVEN ;從偶地址開始ALIGNn ;從n的整數(shù)倍地址開始53/96

org$+10array db45,45h .code movax,segarray movds,ax movbx,offsetarray ;等價于leabx,array movcl,[array+4] ;等效于movcl,array[4] movax,es:[2000h]地址操作符實例

加4個字節(jié)單元54/96ARRAY

DW1,2,$+4,3,4,$+4

假設(shè)匯編時ARRAY分配的偏移地址為0074H,則匯編后,$+4所在的兩個字單元:

(ARRAY+4)=0078+4=007CH

(ARRAY+0A)=007E+4=0082H

地址操作符實例55/961.設(shè)X和X+2單元的內(nèi)容為雙精度數(shù)P,Y和Y+2單元的內(nèi)容為雙精度數(shù)Q,X、Y為低位字。下列程序段使2P>Q時(AX)=1,2P<=Q時(AX)=2。請將程序段填寫完整。

MOVDX,X+2

MOVAX,X

ADDAX,X

ADCDX,X+2

CMPDX,Y+2

L2

L1

CMPAX,Y

L2

L1: MOVAX,1

JMPEXIT

L2: MOVAX,2

EXIT:……JLJGJLE56/962.假設(shè)程序中的數(shù)據(jù)定義如下,

PARTNO DW ?

PNAME

DB 16DUP(?)

COUNT

DD ?

PLENTH EQU $-PARTNO

問PLENTH的值為多少?57/963.給出賦值語句如下:

ALPHA EQU100

BETA EQU25

GAMMA EQU2

下列表達(dá)式的值是多少?

(1)ALPHA*100+BETA

(2)ALPHAMODGAMMA+BETA

(3)(ALPHA+2)*BETA-2

(4)(BETA/3)MOD5

(5)(ALPHA+3)*(BETAMODGAMMA)

(6)ALPHAGEGAMMA

(7)BETAAND7

(8)GAMMAOR3

58/964.對于下面的數(shù)據(jù)定義,各條MOV指令單獨執(zhí)行后,有關(guān)寄存器的內(nèi)容是什么?

FLDB DB?

TABLEA DW20DUP(?)

TABLEB DB'ABCD'

(1)MOVAX,TYPEFLDB

(2)MOVAX,TYPETABLEA

(3)MOVCX,LENGTHTABLEA

(4)MOVDX,SIZETABLEA

(5)MOVCX,LENGTHTABLEB59/96本節(jié)小結(jié)本節(jié)重點掌握:1)DB、DW、DD、DQ、DT功能2)EQU、ORG、END、EVEN偽指令功能3)段定義偽指令SEGMENT/ENDS4)過程定義偽指令作業(yè):P1425,6,10,11首頁60/96四、簡單匯編語言程序設(shè)計一、順序程序設(shè)計

計算機(jī)執(zhí)行程序的方式是“從頭到尾”,逐條順序執(zhí)行指令語句,直到程序結(jié)束。 例5.1:把BUF開始的兩個字節(jié)單元中的壓縮BCD數(shù)相加,結(jié)果存入字單元RES中。NAME EXAM1DATA SEGMENTBUF DB 89H,34HRES DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX

LEA BX,BUFMOV AL,BUF ;取加數(shù)ADD AL,[BX+1] ;做二進(jìn)制加法DAA ;調(diào)整為十進(jìn)制結(jié)果LAHF ;(AH)←(PSW低字節(jié))AND AH,01H ;取CF位MOV RES,AX ;存結(jié)果MOV AH,4CHINT 21HCODE ENDS END START61/961.順序程序設(shè)計例:試編寫一程序計算以下表達(dá)式的值。 w=(v-(x*y+z-540))/x

式中x、y、z、v均為有符號字?jǐn)?shù)據(jù)。設(shè)x、y、z、v的值存放在字變量X、Y、Z、V中,結(jié)果存放在雙字變量W之中,程序的流程圖如圖4.1所示。圖4.1順序運算程序流程圖62/96DATA SEGMENT ;數(shù)據(jù)段 X DW 200 Y DW 100 Z DW 3000 V DW 10000 W DW 2DUP(?)DATA ENDSSTACKSEGMENTSTACK;堆棧段 DB200DUP(0)STACK ENDSCODE SEGMENT ASSUMEDS:DATA,CS:CODE,SS:STACK例:源程序(1):63/96START:MOV AX,DATA MOV DS,AX

;DATA→AX,指定數(shù)據(jù)段段名

MOV AX,X IMUL Y ;(X)*(Y)→DX:AX MOV CX,AX MOV BX,DX;(DX:AX)→(BX:CX)

MOV AX,Z CWD ;(Z)符號擴(kuò)展,在(DX:AX)

ADD CX,AX ADC BX,DX;(BX:CX)+(DX:AX)→(BX:CX)

SUB CX,540 SBB BX,0 ;(BX:CX)-540→(BX:CX)

MOV AX,V例:源程序(2):64/96

CWD ;(V)符號擴(kuò)展

SUBAX,CX SBBDX,BX;(DX:AX)-(BX:CX)→(DX:AX)

IDIVX ;(DX:AX)/X MOVW,AX ;商→W MOV W+2,DX ;余數(shù)DX→W+2

MOV AH,4CH ;返回DOS

INT 21HCODE ENDS ; END START例:源程序(3):2.分支程序設(shè)計方法程序的分支一般用條件轉(zhuǎn)移指令來產(chǎn)生,利用轉(zhuǎn)移指令不影響條件碼的特性,連續(xù)地使用條件轉(zhuǎn)移指令可使程序產(chǎn)生多個不同的分支。

【例4-16】判斷方程是否有實根,如有實根,則將字節(jié)變量tag置1,否則置0.(見書)【例4-17】見書【例4-18】見書65/9666/962.分支程序設(shè)計方式(2):串操作NAME EXAM3 ;將內(nèi)存中以STRI1為首址數(shù)據(jù)傳送到以STRI2為首址的單元DATA SEGMENTSTRIDB 200DUP(?)STRI1EQU STRI+30STRI2EQU STRI+70COUNTEQU 50DATAENDSSTACKSEGMENT PARASTACK’STACK’STAPNDB 100DUP(?)TOPEQU LENGTHSTAPNSTACKENDSCODESEGMENT ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX ;數(shù)據(jù)段地址裝填

MOV ES,AX ;附加段地址裝填

MOV SP,TOP ;送堆棧指針

MOVCX,COUNT ;送串長MOVSI,OFFSETSTRI1;送STRI1地址指針MOVDI,OFFSETSTRI2;送STRI2地址指針

CLD ;正向CMPSI,DI ;兩串首地址比較JARES ;(SI)>(DI),轉(zhuǎn)移ADDSI,COUNT-1 ;源塊尾址ADDDI,COUNT-1 ;目的塊尾址STD ;反向RES: REPMOVSB ;數(shù)據(jù)塊傳送

MOVAH,4CH INT21H ;返回DOSCODE ENDS ENDSTART67/963.循環(huán)程序設(shè)計

循環(huán)程序是強(qiáng)制計算機(jī)重復(fù)執(zhí)行某一指令系列的一種程序結(jié)構(gòu)形式。

1、循環(huán)程序的構(gòu)成

循環(huán)初始部分:為進(jìn)入循環(huán)做必要的準(zhǔn)備工作;循環(huán)體:是程序中重復(fù)執(zhí)行的程序段循環(huán)控制部分:為進(jìn)入下一次循環(huán),修改地址指針、計數(shù)器內(nèi)容等項參數(shù);檢測循環(huán)是否已執(zhí)行了規(guī)定的次數(shù),從而確定繼續(xù)循環(huán)還是結(jié)束循環(huán)。循環(huán)結(jié)束部分:進(jìn)行循環(huán)之后的處理。68/963.循環(huán)程序設(shè)計

2、控制循環(huán)次數(shù)的方法:

1)計數(shù)控制循環(huán):對于循環(huán)次數(shù)已知的程序,或是在進(jìn)入循環(huán)前可由某變量確定循環(huán)次數(shù)的程序,通常用計數(shù)器來控制循環(huán)。例5.4:把BUF開始的10個字節(jié)單元中的二進(jìn)制數(shù)據(jù)累加,求得的和放到RES字單元。69/96例:計數(shù)控制循環(huán)

NAME EXAM5DATA SEGMENT

BUFDB1,4,9,5,21,64,12,6,10,23RES DW?DATA ENDSSTACK SEGMENTPARASTACK’STACK’ DB100DUP(?)STACK ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA MOVDS,AX

MOVAX,0 ;AL清0

MOVCX,0AH ;置計數(shù)器初值MOVBX,OFFSETBUF;置地址指針LP:ADDAL,[BX] ;取一個數(shù)累加到AL上ADCAH,0 INCBX ;地址加1

LOOPLP

;不為0,循環(huán)MOVRES,AX ;傳送結(jié)果MOVAH,4CH;返回DOSINT21HCODE ENDS70/96例:條件控制循環(huán)2)用條件控制循環(huán):適用于某些循環(huán)次數(shù)未知的程序,或循環(huán)次數(shù)可變的程序,可以由問題給出的條件控制循環(huán)結(jié)束。例5.5:編制程序使S=1+2*3+3*4+4*5+…+N*(N+!),直到N*(N+!)項大于200為止。1→DX2→BL(BL)→AL(BL)+1→BL(AL)*(BL)→AX(DX)+(AX)→DX(AX)>200?Y開始結(jié)束N71/96例:條件控制循環(huán)

CMPAX,00C8H;和數(shù)大于200?JNAA1 ;不大于,繼續(xù)A2:INT03H;單步中斷CODEENDS ENDSTARTSTACKSEGMENGSTACK DW64DUP(?)STACKENDSCODESEGMENT ASSUMECS:CODESTART:MOVDX,0001H MOVBL,02HA1: MOVAL,BL INCBL MULBL ;(AL)*(BL) ADDDX,AX ;保存和數(shù)72/964.子程序設(shè)計

子程序是具有獨立功能的程序模塊,可供程序其它地方需要時調(diào)用。在匯編語言中,子程序又稱過程。子程序的執(zhí)行過程:

保護(hù)現(xiàn)場(一些將在子程序運行時將要被破壞的寄存器的內(nèi)容)。依入口參數(shù)從指定位置取要加工處理的信息。加工處理。依出口參數(shù)向指定位置送經(jīng)加工處理后的結(jié)果信息。返回調(diào)用程序。73/96(1)子程序(過程)的定義指令格式:過程名PROC[NEAR]或[FAR]

┇ 過程名ENDP注意:

1)PROC和ENDP必須成對使用。2)過程名是自定義符,可以作為標(biāo)號被指令CALL調(diào)用。調(diào)用格式:CALL過程名3)過程由RET指令返回,返回調(diào)用程序的操作與過程的屬性有關(guān)。NEAR型過程屬于段內(nèi)調(diào)用,則RET是段內(nèi)返回;FAR型過程屬于段間調(diào)用,RET是段間返回。系統(tǒng)設(shè)定的缺省類型為NEAR。74/96(2)子程序應(yīng)用舉例

例5.6求無符號字節(jié)序列中的最大值和最小值。設(shè)有一字節(jié)序列,其存儲首址為BUF,字節(jié)數(shù)為COUNT。利用子程序的方法編程求出該序列中的最大值和最小值。N主程序數(shù)據(jù)首址→SI序列的字節(jié)個數(shù)→CX調(diào)用求最大最小值子程序子程序CX=0?SI、CX、BX入棧(SI)→BHBH→BL(SI)+1→SI(SI)→AL(AL)<(BH)Y(AL)>(BL)Y(CX)-1→CXCX=0?RETYAL→BHAL→BLNNNY開始結(jié)束開始75/96例:程序清單:

;出口:(AH)=大數(shù);(AL)=小數(shù)NAME SHIYAN4DATA SEGMENT

BUFDB1,4,9,5,21,64,12,6,10,23COUNT EQU10DATA ENDSSTACKSEGMENTSTACK DW64DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE;DS:DATA;SS:STACKSTART: MOVAX,DATA MOVDS,AX LEASI,BUF MOVCX,COUNT

CALLBRANCH

;調(diào)用判斷最大和最小值的子程序

INT03HBRANCHPROCNEAR JCXZA4 ;(CX)=0則退出

PUSHSI ;保護(hù)現(xiàn)場

PUSHCX PUSHBX MOVBH,[SI];取源數(shù)據(jù)到BH中

MOVBL,BH;存入BL中A1: LODSB ;取SI指向的單元中的數(shù)據(jù)到AL中

CMPAL,BH;AL和BH中的數(shù)據(jù)比較

JBEA2 ;(AL)<(BH),則轉(zhuǎn)移

MOVBH,AL ;存大數(shù)到BH中

JMPA3 ;跳轉(zhuǎn)到A3標(biāo)號A2: CMPAL,BL ;AL和BL中的數(shù)據(jù)比較

JAEA3 ;(AL)>(BL),則轉(zhuǎn)移

MOVBL,AL ;存小數(shù)到BL中A3: LOOPA1 ;比較完否?

MOVAX,BX;大數(shù)存AH中,小數(shù)存AL中

POPBX ;恢復(fù)現(xiàn)場

POPCXA4: RETBRANCHENDPCODEENDS ENDSTART76/96本節(jié)小結(jié)匯編語言程序結(jié)構(gòu)一般分為順序、分支、循環(huán)和子程序幾種。分支程序一般根據(jù)有條件轉(zhuǎn)移指令進(jìn)行轉(zhuǎn)移判斷,根據(jù)條件可以形成二分支及多分支轉(zhuǎn)移。循環(huán)程序要注意循環(huán)的條件的選擇,一般有計數(shù)器控制和條件控制兩種循環(huán)模式。串操作是循環(huán)的一種簡便模式。學(xué)習(xí)中要多參考例題,多模仿,多訓(xùn)練首頁77/965.宏指令5.4.1宏定義偽指令匯編語言程序設(shè)計中,當(dāng)多處使用一組功能相同的程序段,而只是每次參與操作的參數(shù)不同時,就可以用宏指令將這段程序定義為一個宏名字。宏名可以當(dāng)作指令使用,匯編過程中,匯編程序?qū)⑺淼脑闯绦蛑噩F(xiàn)在宏名字處。1.宏定義用于將程序中重復(fù)出現(xiàn)的一組語句定義為一條宏指令,并確定形式參數(shù)。指令格式如下:宏指令名MACRO[形式參數(shù)1,形式參數(shù)2…,]

┇}宏體

ENDM78/96注意:宏指令名是用戶自定義符號,它可以作為一條指令,直接用在匯編語言程序中。形式參數(shù)是可選項,簡稱形參或啞參數(shù)。宏體是一段可重復(fù)引用的指令序列。宏指令必須先定義后調(diào)用。宏定義可以嵌套。[例5.31]用宏指令定義兩個字節(jié)數(shù)相加,結(jié)果存入RESULT單元的操作。宏定義:ADDMMACROOPR1,OPR2,RESULT ;形參是OPR1,OPR2,RESULT MOVAL,OPR1ADDAL,OPR2MOVRESULT,ALENDM(1)宏定義79/96宏調(diào)用:在匯編語言程序中,使用宏指令稱為宏調(diào)用。宏調(diào)用格式為:宏指令名[〈實在參數(shù)1〉,〈實在參數(shù)2〉,…]宏展開:源程序匯編時,在引用宏名的地方插入宏體。即用宏體取代源程序中的宏指令名,并用實參取代宏定義中的形參。(2)宏調(diào)用與宏展開80/96[例5.32]將例5.31中的宏定義進(jìn)行宏調(diào)用、宏展開操作如下:宏調(diào)用:

┇ ADDM5,6,SUM;實參是5,6,SUM ADDMAUGEND,ADDEND,SUM ;實參是AUGEND,ADDEND,SUM宏展開:

+MOVAL,5+ADDAL,6+MOVSUM,AL

+MOVAL,AUGEND+ADDAL,ADDEND+MOVSUM,AL

┇(2)宏調(diào)用與宏展開第二組宏展開第一組宏展開81/96注意:

通常實參和形參應(yīng)一一對應(yīng),如果實參個數(shù)少于形參,多余的形參作為“空”處理,反之忽略多余的實參。實參可以是空(無實參)、常數(shù)、指令操作碼、字符串、寄存器等。當(dāng)宏定義中形參有前綴“&”符號時,表示宏展開將把“&”前后兩個符號合并為一個符號,它可以是操作碼、操作數(shù)或字符串。(2)宏調(diào)用與宏展開82/96(3)宏指令舉例習(xí)題13.請設(shè)計程序,將存儲器單元2200~2210H清0、2250H~2260H置1、22A0H~22B0H置55H。要求寫出主程序和子程序。方法一:宏指令的方法DSEGSEGMENT'DATA' DSEGENDSSSEGSEGMENTSTACK'STACK' DW100hDUP(?)SSEGENDSCSEGSEGMENT'CODE' ASSUMESS:CSEG,DS:DSEG,ES:DSEG,SS:SSEGSTARTPROCFAR PUSHDSMOVAX,0PUSHAXMOVAX,DSEG MOVDS,AXMOVES,AX

movemacroa1,a2,a3 cld movcx,a2 moval,a1 leadi,[a3] repstosb moveendm

move00h,11h,2200h move01h,11h,2250h move55h,11h,22a0h

RET STARTENDPCSEGENDSENDSTART

83/96(3)宏指令舉例習(xí)題13.請設(shè)計程序,將存儲器單元2200~2210H清0、2250H~2260H置1、22A0H~22B0H置55H。要求寫出主程序和子程序。方法二:子程序調(diào)用的方法DSEGSEGMENT'DATA' DSEGENDSSSEGSEGMENTSTACK'STACK' DW100hDUP(?)SSEGENDSCSEGSEGMENT'CODE' ASSUMESS:CSEG,DS:DSEG,ES:DSEG,SS:SSEGSTARTPROCFAR PUSHDSMOVAX,0PUSHAXMOVAX,DSEG MOVDS,AXMOVES,AX

MOVDI,2200HMOVCX,11HMOVAL,00H CALLZOFMOVMOVDI,2250HMOVCX,11H MOVAL,01HCALLZOFMOV

MOVDI,22A0HMOVCX,11HMOVAL,55HCALLZOFMOV

RETSTARTENDPZOFMOVPROCNEAR CLD REPSTOSB RETZOFMOVENDPCSEGENDSENDSTART84/96(1)宏指令的執(zhí)行過程是宏匯編程序?qū)崿F(xiàn)宏體替換宏指令的過程;子程序的調(diào)用過程是CPU執(zhí)行CALL指令的過程。(2)使用宏指令不能縮短目標(biāo)代碼的長度;使用子程序能縮短目標(biāo)代碼長度,從而節(jié)省內(nèi)存空間。(3)使用宏指令不需要保護(hù)(恢復(fù))程序的斷點和現(xiàn)場,執(zhí)行速度快;子程序的調(diào)用過程則必須進(jìn)行這些操作,耗費CPU的時間,執(zhí)行速度慢。(4)每次宏調(diào)用允許修改參數(shù),使同一條宏指令在各次調(diào)用過程中完成不同的操作;子程序被定義后,一般不允許修改,缺乏靈活性。由此可見,根據(jù)計算機(jī)資源和不同軟件的要求,當(dāng)需要多次執(zhí)行的程序段比較長,對速度要求不很高,并且不要求修改參數(shù)的情況下,可以采用子程序(過程)調(diào)用方式,否則宜采用宏調(diào)用方式。(4)宏指令與子程序(過程)的區(qū)別85/96

IBMPC的BIOS調(diào)用和DOS系統(tǒng)功能調(diào)用BIOS是BASICINPUT/OUTPUTSYSTEM的縮寫,即基本輸入/輸出系統(tǒng),指固化在ROM中的一組程序,又稱ROMBIOS。BIOS提供了最低,最直接的硬件控制,是硬件與軟件之間的接口。BIOS主要包括以下一些功能:系統(tǒng)自檢及初始化。例如,系統(tǒng)加電啟動時對硬件進(jìn)行檢測;對外部設(shè)備進(jìn)行初始化;設(shè)置中斷向量;引導(dǎo)操作系統(tǒng)等。系統(tǒng)服務(wù)。為操作系統(tǒng)和應(yīng)用程序提供系統(tǒng)服務(wù),這些服務(wù)主要與I/O設(shè)備有關(guān),如讀取鍵盤輸入等。為了完成這些操作,BIOS必須直接與I/O設(shè)備打交道,它通過端口與I/O設(shè)備之間傳送數(shù)據(jù),使應(yīng)用程序脫離具體的硬件操作。硬件中斷處理。提供硬件中斷服務(wù)程序。圖是用戶程序和操作系統(tǒng)關(guān)系示意圖,由圖可見,BIOS程序直接建立在硬件基礎(chǔ)上,磁盤操作系統(tǒng)(DOS)和其他操作系統(tǒng)建立在BIOS基礎(chǔ)上,各種高級語言則建立在操作系統(tǒng)基礎(chǔ)上。用戶程序可以使用高級語言,也可以調(diào)用DOS或其他操作系統(tǒng),還可以調(diào)用BIOS,甚至直接指揮硬件設(shè)備。86/96通常,應(yīng)用程序調(diào)用DOS提供的系統(tǒng)功能,完成輸入/輸出或其他操作,這樣做用戶可以少考慮硬件,實現(xiàn)起來容易。應(yīng)用程序直接對硬件編程的優(yōu)點是程序的效率高,缺點是需要程序員對硬件性能有較深的了解,編程復(fù)雜,所以一般不直接對硬件編程。BIOS中斷程序處于DOS功能調(diào)用和硬件環(huán)境之間,和DOS功能調(diào)用相比,其優(yōu)點是效率高,缺點是編程相對復(fù)雜;和直接對硬件編程相比,優(yōu)點是實現(xiàn)相對容易,缺點是效率相對低。在下列情況下可考慮使用BIOS中斷。(1)有些功能DOS沒有提供,但BIOS提供了;(2)有些場合無法使用DOS功能調(diào)用;(3)其他原因。

87/96BIOS中斷調(diào)用方法BIOS的調(diào)用就是人們借用每一臺計算機(jī)中BIOS固有的I/O操作程序來方便地解決自己的問題,由于它已經(jīng)在計算機(jī)中了,因此人們不必再把它寫入自己的程序,只要指明它的操作位置就可以了。1)BIOS調(diào)用的基本操作由于BIOS中的每一種功能調(diào)用往往包含不同的幾個操作細(xì)節(jié),所以調(diào)用時需要說明三部分,基本步驟為:(1)設(shè)置分功能號:按實現(xiàn)的操作功能的要求,給指定寄存器(通常為AH)送入分功能號。88/96(2)置入口參數(shù):按操作要求,給寄存器填寫相應(yīng)參數(shù)的內(nèi)容(某些調(diào)用無參數(shù))。(3)使用中斷語句INTn:執(zhí)行調(diào)用的功能,其中n為中斷號。(4)分析出口參數(shù)。例如 MOV AH,0 ;分功能號為0 MOV AL,10H ;置入口參數(shù) INT 1AH ;1AH為中斷號,功能為讀時間計數(shù)器的值注意:某些BIOS調(diào)用可能沒有出口參數(shù),這時省略第(4)步操作。89/962)BIOS打印功能BIOSI7H號中斷指令提供了由AH寄存器指定的三種不同的操作。(1)BIOS中斷17H號的功能0是打印一個字符。要打印輸出的字符放在AL中,打印機(jī)號放在DX中,BIOS最多允許連接三臺打印機(jī),機(jī)號分別為0,1和2。如果只有一臺打印機(jī),那么就是0號打印機(jī),打印機(jī)的狀態(tài)信息被回送到AH寄存器。MOV AH,0 ;請求打印MOV AL,CHAR ;寫入打印字符MOV DX,0 ;設(shè)置0#打印口INT 17H ;調(diào)用BIOS90/96(2)17H號的功能1是初始化打印機(jī)并回送打印機(jī)狀態(tài)到AH寄存器。如果把打印機(jī)開關(guān)關(guān)上然后又打開,打印機(jī)各部分就復(fù)位到初始值。此功能和打開打印機(jī)時的作用一樣。在每個程序的初始化部分可以用17H號的功能1來初始化打印機(jī)。MOV AH,01 ;初始化打印機(jī)MOV DX,0 ;設(shè)置0#打印口INT 17H ;調(diào)用BIOS這個操作要發(fā)送一個換頁符,因此,這個操作能把打印機(jī)頭設(shè)置在一頁的頂部。對于大多數(shù)打印機(jī),只要一接通電源,就會自動地初始化打印機(jī)。91/96AH=0EH

這個子程序

溫馨提示

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

評論

0/150

提交評論