匯編語言程序設(shè)計_第1頁
匯編語言程序設(shè)計_第2頁
匯編語言程序設(shè)計_第3頁
匯編語言程序設(shè)計_第4頁
匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩158頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

爐凹圖叵JLU回

第3章匯編語言程序設(shè)計彩.

3.1概述今

?指令:計算機完成某種操作的命令

?程序:完成某種功能的指令序列

?軟件:各種程序總稱

?機器代碼,匯編語言程序,匯編程序

?匯編語言程序建立步驟:

?(1)用編輯程序建立.ASM源文件

?(2)用LINK程序把.ASM文件轉(zhuǎn)換為OBJ文件

?(3)用LINK程序把.OBJ文件轉(zhuǎn)換為.EXE文件,

或用EXE2BIN程庫把.EXE文件轉(zhuǎn)換為.COM文件

?(4)在DOS下直接鍵入.EXE文件或.COM文件的

文件名就可運行該程序—」

3.2語句格式

■語句格式:[名字]操作在操作數(shù)1,操作數(shù)2;

1.名字

?一種符號地址

?組成:A~Z,a-z,0-9,專用符號?、.、M、-、$

?限制:①第一個字符不能為數(shù)字

②必須為第一個字符

③前31個字符有效

④不能為關(guān)鍵字

,類型:r標(biāo)號:指令符號地址

I變量:數(shù)據(jù)符號地址

2.操作符

?組成:CPU指令,偽指令,宏指令

3.操作效

?指定參與操作的數(shù)據(jù)、或數(shù)據(jù)所在單元地址

4.注釋

?說明程序、指令功能、增加程序可讀性

3.3偽指令

?功能:指示匯編程序完成規(guī)定的操作,如選擇處

理器,定義數(shù)據(jù),分配存儲器等。

廠iLI11m

一、程序開始與結(jié)束%

1.程序開始:可以用nnine.title給程序起名。七

?格式:NAMEmoduleimine

?匯編程序以模塊名作為模塊的名字,若未使用NAME,則可用

TITLE給程序指定標(biāo)題

?格式:TITLEtext

-文本在每一頁上打印出來,若沒有NAME,則text的前6個字符為

模塊名,text最多為60個字符.

?若未使用NAME、TITLE,則源文件名為模塊名。

2.程序結(jié)束:表示原程序結(jié)束,不可缺,源程序的最后一條語句。

?格式:ENI)[Libel]

-標(biāo)號指示程序開始執(zhí)行的起始地址,多個模塊連接,主程序用標(biāo)

號,其他程序不用,主程序缺省值為代碼段第一條指令。

3.MASRI6.0定義的入口點、出口點

?入口點:.STARUP;產(chǎn)生設(shè)置DS、SS、SP代碼,此時,END不

用標(biāo)號。

?出口點:.EXIT;返回操作系統(tǒng),常用值為0。

?例:.STARLTS

.EXIT0

END/L”一〃,,?,C”“,J

二、處理器選擇感

?功能:選擇對應(yīng)的指令集、也即對應(yīng)的匯編執(zhí)行語句集

-放在程序最前面

?缺省值為.8086

?此類指令主要有:

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

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

-.286P選擇保護方式下80286指令系統(tǒng)

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

-.386P選擇保護方式下80386指令系統(tǒng)

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

?.486P選擇保護方式下80486指令系統(tǒng)

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

-.586P選擇保護方式下Pentium指令系統(tǒng)

三、段定義

4

?段定義:確定代碼組織與數(shù)據(jù)存儲的方式

?2種:完整的段定義和簡化的段定義

(MASM5.0以上)

?完整的段定義包括:

(1)segment和end段定義

(2)ASSUME段分配

(3)GROUP段組定義

segment和end段定義(1)

_______-A

?格式:/

[段名isfegment/(.定位類型][組合類均

1°[字長類型]£1亞I方

任殳名ends,—、

?友趙極、

?一般情無下,選項可以不用,用默認(rèn)值,但若需

連接本程序和其他程序,就要使用這些說明。

?段名是段的標(biāo)識符,指明段的基址,由程序員指

定。

㈡凹附叫

segment和end段定義(2)<

①定位類型

?一定位類型:指定段起始邊界,5種

?BYTE:任意位置

?WORD:偶地址,地址低1位為0

?DWORD:4的倍數(shù)地址,地址低2位為0

?PARA:16的倍數(shù)地址,地址低4位為0

?PAGE:256的倍數(shù)地址,地址低8位為0,一頁的

起點,默認(rèn)值。/

segment和end段定義

②組合類型

?組合類型:表示本段與其它段之間,具有超山段名的各段的組合

關(guān)系,為連接程序提供信息,屬于連接類型,6種,

?PUBLIC:本段連接時將與有相同段名.public類型的其它段連接在

一起,連接次序由連接命令指定(共用一個段),即同名段連接

在一起,有共同段地址。

?STACK:用于說明堆棧段.把不同程序段中的具有SARCK類型的同

名段組合而形成一個堆棧段.其長度為各原有段的總和,LINK自

動將新段的段地址送SS,長度送SP,若未定義SARCK類型.需在

程序中用指令設(shè)置SS、SP,

?COMMON:本段連接時.使具有COMMON類型的同名段具有同一個起

始地址,所以會產(chǎn)生覆蓋,新段的長度是最長COMMON段的長度,

新段的內(nèi)容取決于依次覆蓋的最后內(nèi)容。

?MEMORY:表示該段應(yīng)定位在所有段的最下面(即地址最大的區(qū)

域),如果模塊中不止一個MEMORY段,以第一個遇到的作為

MEMORY段.其它段作為COMMON段處理,而LIM程序在處理MEMORY

時與PUBLIC同樣對游

?PRIVATE:獨立段,與其它段邏輯上沒有關(guān)系,不與同名較合并.

默認(rèn)值.

AT表達式:指定本段起始地址為“表達式「偏移量為0.不能用

于代碼段。

segment和end段定義(J)總

——

③字長類型

?字長類型:386以后,說明使用16位尋址方式,

還是32位尋址方式。

?.USE16:16位尋址方式,段長464KB,16位段地

址,16位偏移量,默認(rèn)值。

?.USE32:32位尋址方式,段長《4GB,16位段地

址,32位偏移量。

④類別

?類別:引號括起的字符串,連接時,,類別,相同

的分段(他們可能不同名)均放在連續(xù)的存儲空間

中,但他們?nèi)匀皇遣煌姆侄危ㄟB續(xù)空間)。

/冽兇因的國k

ASSUME段分配短,

?格式:ASSUME談室住器"……

?功能:指定分段寄存器,說明哪個段使用哪個段

寄存器。

?說明:

?①程序段必須用CS,堆棧段必須用SS

?②該語句一般放在代碼段的最前面

?③說明性語句,除CS外(初始化賦值),各段寄

存器在程序中賦值。

?④取消語句:ASSUMENOTHING

一般匯編格式舉例族〃

DATA1SEGMENT①ATA,

???

DATA1ENDS」

DATA2SEGMENT'EXTRA'~

???

DATA2ENDS

DATA3SEGMENT'DATA'

???

DATA3ENDS

CODESEGMENTCODE,

ASSUMECS:CODE,DS:DATA!,ES:DATA3,SS:DATA?

START:MOVAX,DATA1

MOVDS,AX:數(shù)據(jù)段地址就給DS

MOVAX,DATA2

MOVSS.AX:堆棧段地址就給SS

MOVAX,DATA3

MOVES,AX;附加段地址賦給ES

???

MOVAH,4CH

1NT21H;返回DOS

CODEENDS

“EWUSLW;CM」———」:,

GROUP段組定義

?格式:二1組2/2上莖名[.段名一1

?功能:將指定而君莪芬瓦在同一個物理存儲器內(nèi).使用

使用同一個DS內(nèi)容

?用戶自行指定段組中的段.段組不影響各段次序,對定義在不同段中的

變量.可以用同一個DS訪問,但各段仍為獨立段,通常將具有相同性質(zhì)

CODESEGMENT?CODE,

ASSUME4CODEDS:AA5

START:MOVAX,AA5

MOVDS,AX;數(shù)據(jù)段地址賦給DS

???

MOVAH,4CH

INT21H:返回DOS

CODEENDS

E\DSTARTiGr,

£1回四回I國叱

簡化的段定義

?MASM5.0以上支持的段定義,不像SEGMENT定義

得那么完善,但易用。

?簡化段有利于匯編語言程序模塊與高級語言程序

模塊的連接,但.COM程序不能用簡化段定義。

.,」“,、]gJ]

四、地址計數(shù)器偽指令畛

1.地址計數(shù)器sP

?功能:指出匯編地址,是偏移量,記載下一個變量或指令在當(dāng)前

段中的偏移量。

?每個段開始時,s=o.隨著匯編過程的進行而增值,每處理一條

指令,S增加一個值,此值為該指令所需的字節(jié)數(shù)一

?允許直接引用S.如:JNES+6;轉(zhuǎn)向JNE指令的首地址加上6.

?S用于指令時,表示本條指令的第一個字節(jié)地址,S用于其他情況.

表示3的當(dāng)前值,

2.ORG起始地址定義

?格式:ORG表達式

?功旄:定義指令或數(shù)據(jù)的起始地址,把表達式的值送給3(地址

計數(shù)器)

3.EVEN偶數(shù)地址定義

?功能:使下一個變量或指令從偶數(shù)地址開始,便于字存儲對準(zhǔn)

(EVEN在代碼段中可能多出1個NOP語句)。

4.ALIGN邊界定義1

?格式:ALIGNn;n為2的幕次

-功能:使下一個變量或指令從n的接續(xù)整數(shù)倍地址開始.保證雙

字、四倍字對準(zhǔn)。

五、數(shù)據(jù)定義

格式:/變位2攥作符接隹數(shù)[;;i#]

功能:.為操作數(shù)分配存儲單元,用變量與詞單元聯(lián)系。

為變量分品存儲單元,并預(yù)置初值7—

操作苻:

DB:一個操作數(shù)占有1個字節(jié)單元(8位),定義的變量為

字節(jié)變量。

DW:一個操作數(shù)占有1個字單元(16位),定義的變量為字

變量二

DD:一個操作數(shù)占有1個雙字單元(32位),定義的變量為

雙字變量。

DF:一個操作數(shù)占有1個三字單元(48位)、定義的變量為

三字變量。

DQ:一個操作數(shù)占有1個四字單元(64位),定義的變量為

四字變量。

DT:一個操作數(shù)占有1個五字單元(80位),定義的變量為

五字變量.

?操作數(shù):常數(shù)、表達式、字符串、?3

數(shù)據(jù)定義舉例(1)

例1內(nèi)存分況

偏移量存儲單元內(nèi)容

設(shè)置

加一

DATAy"T^~f^?S6.DATAr00HJ2H

201H口犯-

EVEN\r-^02H_能

(即保留原值)]

;偶地址,使$指向偶地址203H.

DATA2r<5ZZ)

DATA2兇7空少

)—205H^78H_

206H(即保留原值)i

(即保留原值),

;4倍地址,使S指向4倍地址、207H

DATA3:口208HJ^L-

DATA3DD12345678Hz--*

---2。9H

DATA4DW$,6699H20AH-3^i_

;詼匚藕指4A16位,設(shè)20BH

當(dāng)前S(原$)的內(nèi)容DATA^QocB>

20DHxjg怨J/

20EH^aaH/

20FH

/咽、

21OH

數(shù)據(jù)定義舉例(2)

例2內(nèi)存分配情況

變量名偏移量存儲單元內(nèi)容

ORG100H—

■3AE^*100H61H

DATA1詬~藐丁丁

101H62H

;字符串必須用單引號102H63H

DATA2DB,AB'103H64H

DATA3DW認(rèn)B‘DAEA2104H41H

105H42H

;按字處理,個數(shù)只能為

DATA3106H42H

107H41H

IDB12H/3M

數(shù)據(jù)定義舉例(3)

例3內(nèi)存分配情況

變量名偏移量單元內(nèi)數(shù)

DAIA1400H01H

401H02H

ORG400H1一年402H(即保留原值)

DATA1DB1,2,?,4403H04H

;按字節(jié)定義DATA2404H05H

DATA2DW5,?,6405H00H

406H(即保留原值)

:按字定義

407H(即保留原值)

DATA3DF?408H06H

:按三字定義409H00H

DATA4DB8DATA340AH(即保留原值)

40BH(即保留原值)

40CH(即保留原值)

40DH(即保留原值)

40EH(即保留原值)

40FH(即保留原值)

DAEA4410H08H

V」

數(shù)據(jù)定義舉例(4<

ORG300H-與

DATA1DB2DUP(12H,34H,56H)

例4內(nèi)存分配情況

羋名儂量存儲單元內(nèi)容

DATl^P300H12H

301H34H

302H56H

303H12H

304H34H

3O5H56H

MU

數(shù)據(jù)定義舉例(5)豫

%

ORG100H

DATA1DB12H,34H,2DUP(56H,3DUP(9AH),78H)

例5內(nèi)存分配情況

變量名偏移量存儲單元幅

57Ax哆…初<DAIA1100H12H

101H34H

DB102H56H

103H9AH

2”飛104H9AH

105H9AH

106H78H

107H56H

108H9AH

109H9AH

10AH9AH

10BH78H

六、PROC.ENDP過程定義畛

?功能:用于定義子程序結(jié)構(gòu),過程名是CALL的操

作數(shù)。

?格式:

過程名PROC[屬性]

???

過程名ENDP

?屬性:FAR,NEAR(默認(rèn)值)

㈣囪國111H

七、模塊連接偽指令、然

?用于定義各模塊之間的共享信息

1.PUBLIC

?格式:PUBLIC符號1[.符號2,…]

?功能:公共引用.說明本模塊定義,而其它模塊引用的共享信息.

2.EXTRN

?格式:EXTRA符號1:類型[,符號2:類型,…]

?功能:外部引用.說明其他模塊定義,而本模塊引用的共享信息.

?類型:

對于變量.可以是字節(jié)(BYTE).字(WORD),雙字

(DWORD),三字(FWORD),四字(QWORD),五字(TWORD)0

對于標(biāo)號、過程名,可以是段內(nèi)引用型(FAR),段間引用

型(NEAR).

?共享信息是全局變量,包括常量、變量、標(biāo)號.過程名等一

?EXT心說明的信息應(yīng)是在PUBLIC中已經(jīng)定義的,否則出錯:

?例:

PUBLICVARI,VAR2

EXTRNVARI:WORD,VAR2:BYTE

L“I-71jIU1I山

、常數(shù)(1)

?包括:數(shù)值常數(shù)、字符串常數(shù)、符號常數(shù)

1.數(shù)值常數(shù)

?數(shù)值常數(shù)可以是二進制數(shù)、八進制數(shù)、十進制數(shù)、十六進

制效。

?基數(shù)控制偽指令:改變基數(shù)默認(rèn)值(原默認(rèn)值為十進制)。

?格式:.RADIX數(shù)值表達式

?功能:把默認(rèn)的基數(shù)改變?yōu)?~16范圍內(nèi)的任何基數(shù):

?例:

MOVBX,0FFH等價于.RADIX16

MOVBX,178MOVBX,OFFH

MOVBX,178D

2.字符串常數(shù)

?字符串常數(shù):包括在單引號中的若干字符。

-字符串在存儲器中儲存的是相應(yīng)字符的ASCII碼。

P'licmnii^ir

常數(shù)(2)

3.符號常數(shù)

,包括:EQU和=

(1)EQU弒值偽指令

?格式:符號常數(shù)名EQU表達式

?功能:將表達式的值獻給符號常數(shù),

?說明:表達式可以是有效的操作數(shù)格式,也可以是任何可求出教

值常數(shù)的表達式,還可以是任何有效的符號(如操作符、寄存器

名、變量名等)。

?EQU定義的一個符號常數(shù)名在程序中只能定義一次,

?例:DATA1EQU88

NEW.CXEQUCX

DATA2EQUDATA1+12

(2)=偽指令

?格式:符號常數(shù)名表達式

?功能:將表達式的值弒給符號常數(shù),

?=定義的一個符號常數(shù)名在程序中可以重復(fù)定義多次-

?例:...

DATA1=88

…X]

DATA1,'出桿抬■協(xié)CMIca.f^Ll'jyy"1>C\\[URI.iUX

W國回盟團in

二、表達式(1)■紜

?表達式:常數(shù)、寄存器、標(biāo)號、變量與一些運算

符相組合的序列。

?包括:數(shù)值表達式,地址表達式。

1.運算符

?六種運算:算術(shù)運算、邏輯運算、移位運算、關(guān)

系運算、返回值運算、屬性運算。

(1)算術(shù)運算符

?算術(shù)運算符:有5個,加(+)、減(-)、乘

(*)、除(/)和取余(MOD)o

(2)邏輯運算符

?邏輯運算符:4個,與(AND)、或(OR)、非

(NOT)和異或(XOR)。

MHJHltLJLtJ

二、表達式(2)

(3)移位運算符

?移位運算符:2個,左移(SHL)和右移(SHR).

,例:

MOVAL,0

MOVBL,11011000B

MOVAL,BLSHR3;(AL)=0001101IB

MOVCL,BLSHL^6;(CL)=110000008

(4)關(guān)系運算苻

?關(guān)系運算符:6個,等于(EQ)、不等(NE)、小于

(LT)、大于(CT)、小于等于(LE)、大于等于(GT)。

?功能:關(guān)系運算苻的兩個操作數(shù)的計算結(jié)果應(yīng)為邏輯值,

結(jié)果為真(關(guān)系成立),表示為0FFFFH,結(jié)果為假(關(guān)系

不成立),表示為0.

?例:

MOVAX,2LT7;(AX)=0FFFFHX|Z

上!兇回回國乜

二、表達式(3)

(5)返回值運算符

?返回值運算符:5個,返回變量或標(biāo)號的薦地址(SEG)、返回變

量或標(biāo)號的偏移地址(OFFSET)、返回變量或標(biāo)號的類型值

(TYPE)、返回變量的單元數(shù)(LENGTH)、返回變量的字節(jié)數(shù)

(SIZE).

①SEG返回變量或標(biāo)號的段地址運算符

?格式:操作級SEG變量/標(biāo)號

?功能:將變量/標(biāo)號所在段的段息址值獻給操作數(shù),

②OFFSET返回變量或標(biāo)號的偏移她址運算符

?格式:操作教OFFSET變量/標(biāo)號

?功能:將變量/標(biāo)號所在段中的偏移值賦給操作數(shù),

③TYPE返回變量或標(biāo)號的類型值運算符

?格式:操作數(shù)TYPE變量/標(biāo)號

?功能:將代表變量/標(biāo)號類型的值獻給操作數(shù)C

?說明:如果是變量,則匯編程序?qū)⒏鶕?jù)變量對應(yīng)的數(shù)據(jù)定義偽指

令回送類型值(即變量類型代表的字節(jié)數(shù)):DB為1,DR為2.DD

為4,DF為6,DQ為8,DT為10返回以字節(jié)數(shù)表示的類型.常數(shù)

返回0如果是標(biāo)號.則匯絹程序?qū)⒒厮痛碓摌?biāo)號類型的數(shù)值:

NEAR為-1,FAR為一2。3」

LIL-IUJIIUII▼]]

二、表達式(4)畛,

④LENGTH返回變量的單元數(shù)運算符

?格式:操作數(shù)LENGTH變量

?功能:將代表變量的單元數(shù)賦給操作數(shù)二

?說明:<1>返回一次數(shù)據(jù)定義的第一不元素的長度,DUP時

返回重復(fù)次數(shù),其他情況返回1.

?<2>對于變量中使用DUP的情況,匯編程序?qū)⒒厮头?/p>

配給該變量的單元數(shù)(按類型TYPE算),而對于其他情況,

則均送1。只對DUP定義的變量有意義,返回分配給該變量

的元素的個數(shù)。只返回第一個DUP前的元素個數(shù),與DUP括

號內(nèi)的數(shù)據(jù)無關(guān)、認(rèn)為只是一組數(shù)據(jù)而已,若與DUP并列

地定義了其它數(shù)據(jù),就只能返回1。

⑤SIZE返回變量的字節(jié)數(shù)運算符

?格式:操作數(shù)SIZE變量

?功能:將代表變量的字節(jié)數(shù)弒給操作效:

?說明:<1>就是返回LENGTHxTYPE的結(jié)果。

?<2》匯編程序?qū)⒒厮头峙浣o該變量的字節(jié)數(shù):只對

DUP定義的變量有意義。

二、表達式(5)

例:

DATASEGMENTAT1000H

ORG3000H

AA1DW100DUP(O)

BB1DW1.2

CC1DB*ABCD'

DDlDW1000DITP(23)

EEIDB50DUP(5.6)

FF1DW1.2.100DIT(?)

GG1DI)5DUP(6DIT(?))

DATAENDS

CODESEGMENT

ASSUMECS:CODE.DS:DATA

HH1:MOVAX.DATA:AX=1000H

MOVDS.AX

MOVAX.SEGAA1:AX=1000H,AT定義

MOVBX.OFFSETAA1:BX=3000H

MOVCL,TYPEAA1:CL=2,字類型

MOVCHTYPECC1:CH=L字節(jié)類型

MOVAL.TYPEGG1:ALT,雙字類型

二、表達式(6)豫"

MOVDX,LENGTHAA1;DX=100,元素個數(shù)

MOVAX,SIZEAA1;AX=200,元素個數(shù)X類型

MOVDX,LENGTHBB1

:DX=1,LENGTH只對DUP定義的變量有意義

MOVAX,SIZEBB1;AX=2

MOVDX.LENGTHCC1:DX=1

MOVAX.SIZECC1:AX=1

MOVDX,LENGTHDD1:DX=1000

MOVAX.TYPEDD1;AX=2000

MOVDX.LENGTHEEI:DX=50

MOVAX.SIZEEEI:AX=50

MOVDX.LENGTHFF1:DX=1

MOVAX,TYPEFF1;AX=2

MOVDX,LENGTHGG1;DX=5

MOVAX.TYPEGG1;AX=20

MOVAH.4CH

INT21H

CODEENDS

FNT)仁心乜門理二c位/*叱4

、表達式(7)

(6)屬性運算符

?屬性運算符:3個,臨時改變類型屬性運算符PTR、指定類

型屬性運算符THIS、定義類型屬性運算符LABEL

①PTR臨時改變類型屬性運算符

?格式:類型PTR變量/標(biāo)號

?功能:將PTR前面的類型臨時減給變量/標(biāo)號、而原有段屬

性和偏移屬性保持不變,其本身并不分配存儲單元。

?說明:對于變量,可以指定類型BYTE、WORD.DNOR、

DFWORD、QWORD.TWORD,對于標(biāo)號,可以指定類型

NEARFAR

?例:

DATADB66H,77H

MOVAX,WORDPRTDATA

、表達式(8)、然

②THIS指定類型屬性運算符

?格式:變量/標(biāo)號EQLITHIS類型

?功能:’將變量/標(biāo)表義成指前類型。

?說明:THIS指定的變量或標(biāo)號本身并不分配存儲

單元,它與緊跟其后的變量或標(biāo)號只藁空丕回,

而段地址和偏移量均相同。THIS指至短■寫PTR

相同。

?例:

DATA1EQUTHISBYTE

DATA2DW1234H;DATA1和DATA2具

有相同的段地址和偏移量,但類型值分別為1和2。

MOVAX,DATA2;AX=1234H

MOVBL,DATA1;BL=34H

、表達式(9)第

③LABEL定義類型屬性運算符

?格式:變量/標(biāo)號LABEL類型

?功能:將變量或標(biāo)號定義成指定的類型。

?說明:LABEL指定的變量或標(biāo)號本身并不分配存儲單元,

它與緊跟其后的變量或標(biāo)號只有類型不同,而段地址和偏

移量均相同。THIS指定類型與PTR相同.

,例:

AA11ABELF竺;AA1為段間轉(zhuǎn)移入口

AA2:...;AA2為段內(nèi)轉(zhuǎn)移入口

???

AA3LABELBYTE

AA4DW1234H

MOVAX,AA4

MOVBH,AA3+1

與㈣固國也任

二、表達式(10)

2.數(shù)字表達式

-數(shù)字表達式:有常數(shù)、變量、標(biāo)號與一些運算符相組合的

序列.運算符可以是算術(shù)運算符、邏輯運算符、移位運算

符、關(guān)系運算符、返回值運算符,但結(jié)果必須是常數(shù)C

3.標(biāo)號

-標(biāo)號:指令所在單元的符號地址。

-標(biāo)號的三種屬性:段地址、偏移量、類型(NEAR、FAR),

4.變量

-變量:數(shù)據(jù)所在單元的符號地址。

-變量的五種屬性:段地址(SEG返回值)、偏移量

(OFFSET返回值)、類型(TYPE返回值)、單元數(shù)

(LENGTH返回值)、字節(jié)數(shù)(SIZE返回值)

5.地址表達式

?地址表達式:存儲器地址,即EA的計算;是常數(shù)、變量、

標(biāo)號與一些運算符相組合的序列。

3.5匯編語言程序設(shè)計及舉例

(一)編寫匯編語言程序的步裂

?1.從實際問題抽象出就學(xué)根主.

?2.碉定解決此數(shù)學(xué)模型的算主.解決同一個問遇可以有不同的算法.它們

的效率可能有很大的差別.例如要做X*10,可以用乘法指令:也可以用

X*8+X*2,而卜2或卜8也可以自身相加.或X左移來實現(xiàn):這些方法的程序復(fù)

雜程度和執(zhí)行時間差別是很大的.又例如查表.是用線,法查找還是用對?分

查找區(qū)別也很大.所以.確定合適的算法是很重要的.

?3.畫出程序三玨圖把根據(jù)算法解決問題的思路和方法.用圖影表示出耒.

?4.分上內(nèi)弓工作單元和寄存器.

?5.根據(jù)流程圖箋制程序.

?當(dāng)然.到這兒只是設(shè)計出了息本程序.此程序是否正確.可靠.還必須上

機調(diào)試.排錯和進行不妥的檢測,

(二)判斷程序質(zhì)量的標(biāo)準(zhǔn)

?為解決同一個問題所編制的程序,往往是多種多樣的,如何衡量程序的質(zhì)

量呢?通常有三個標(biāo)準(zhǔn):

I.程序的執(zhí)行時間

2.程序所占用的內(nèi)存字節(jié)數(shù)

3.程序的語句行數(shù)

?前兩個標(biāo)準(zhǔn)是主要的.由于半導(dǎo)像存儲器容量越來越大,成本急朝降低.

3.5匯編語言程序設(shè)計及舉例

程序流程圖

?在確定問題的算法以后,先不要急于寫一條條指令,而要

用程序流程圖把編制程序的方法和思路勾畫出來,確定程

序的結(jié)構(gòu)和相互之間的關(guān)系。本書中的流程圖,采用以下

一'些慣用的畫法。

i.用方框表示工作框、方框中用簡明的語言標(biāo)明所完

成的特定功能。它有一個入口一個出口,用箭頭表示。

2.用菱形表示判斷框,菱形內(nèi)標(biāo)明比較,判斷和條件,

它有一個入口和幾個出口,各用箭頭表示。在各個出口處

標(biāo)明出口條件,條件成立則寫“是(用Y表示),條件不

成立用“否(用N表示):____

3.程序中要調(diào)用的子程序或過程,用DZZO框表示,

在框中標(biāo)明子程序或過程的名字(包括入口地址、入口條

件、參數(shù)、出口參數(shù))。它有一個入口一個出口,各用箭

頭表示。

?帶箭頭的直線;程序的各框之間用箭頭的直線連接起來,

表示程序的走向,

回回固網(wǎng)后

3

算術(shù)運算程序設(shè)計(宜線運行,

?最簡單的程序是沒有分

支,沒有循環(huán)的直線運1

行程序。

?在8088/8086中,數(shù)據(jù)xIcIDI

是16位的,它只有16位—

的運算指令,若是兩個

32位的數(shù)相乘就無法直段郝

接用指令實現(xiàn)(在80386

中有32位數(shù)相乘的指

令),但可以用16位乘法

指令做4次乘法,然后

把部分積相加來實現(xiàn)。

其原理如圖所示。

算術(shù)運算程序設(shè)計

,例1:兩個32位無

符號數(shù)乘法程序

?若數(shù)據(jù)區(qū)中己有一

個緩沖區(qū)存放了32

位的被乘數(shù)和乘數(shù),

保留了64位的空間

以存放乘積,能實

現(xiàn)上述運算的程序

流程圖如圖所示

引川冽,

算術(shù)運算程序設(shè)計(整

相應(yīng)的程序為:

name32bilmutiply

datasegment

mu1numdw0000.Offffh,0000,Offffh,4dup(?)

dataends

stacksegmentparaslack-stack'

db100dup(?)

stackends

codesegment

assumecs:code,ds:data,ss:stack,es,data

startprocfar

begin:pushds:DS中包含的是程序段前綴的起始地址

movax,0

pushax:設(shè)置返回至DOS的段值和IP值

movax,data

movds,ax

moves,ax;置段寄存器初值

leabx,mu1num

mu1u32:movax,[bx];B->AX

算術(shù)運算程序設(shè)計(3)、修少

、)*

movsi,[bx+4]__二D>SI

movdi,[bx+6];CDI

mulsi_■:BXD

mov[bx+8],ax;保存部分積I

mov[bx+Oah],dx

movax,[bx+2]:A->AX

millsi;AXD

addax,[bx+0;ih]

adcdx,0:部分積2的一部分與部分積1的相應(yīng)部分相加

mov[bx+O;ih],ax

mov[bx+Och],dx;保存

movax.[bx]:B>AX

inuldi;BXC

addax,[bx+0;ih]:與部分積3的相應(yīng)部分相加

adcdx,[bx+Och]

算術(shù)運算程序設(shè)計

mov[bx+0ah],ax

mov[bx+0cli].dx

pushf:保存后一次相加的進位位

movax.[bx+2]:A->AX

mid<li;AXC

popf

:i(lc;ix.[bx+0ch]:與部分積4的相加部分相加

n<k(lx.0

mov[bx+0ch],ax

mov[bx+Oeh],(tx

let

starteiuip

codeends

endbegin

算術(shù)運算程序設(shè)計(5)

?例2:32位符號數(shù)乘法

-在32位無符號數(shù)乘法程

序的基礎(chǔ)上很容易實現(xiàn)

32位帶符號數(shù)的乘法。

?首先設(shè)一個乘積的符號

標(biāo)志初值為0;檢查被乘

數(shù),若為負(fù),一方面對

被乘數(shù)取補,另一方面

對符號標(biāo)志取反;

?再檢查乘數(shù),若是負(fù)數(shù)

也對乘數(shù)取補和符號標(biāo)

志取反;然而調(diào)用32位

無符號數(shù)乘法程序。

?最后檢查乘積符號標(biāo)志,

若為負(fù)(即兩個異號數(shù)

相乘),則對64為乘積

取補。

?程序流程圖如圖所示。

算術(shù)運算程序設(shè)計

相應(yīng)的程序為

nnmesigned32bitinulpty

datasegment

sigil(lb?

inulnmn(lwOil.XXYl,4<lup(?)

dataends

stacksegmentpai,iistack'stack'

<lb100(lup(?)

stackends

codesegment

nssiune€s:€o(le.ds:<latn.ss:stuck

:以下是主過程

startprocfar

begin:push<1$

movax.0

push心:為返回DOS設(shè)置返回地址

V圖闡

算術(shù)運算程序設(shè)計(嘎少

movax,data

mov<k.ax;設(shè)置段寄存器初值

inovsign.0:置符號為初值

leabx,inuluuin

movax,[bx]:B->AX

inov<lx.[bx+2]:A-DX

movsi.[bx+4]:D->SI

movsi.[l)x+6];C->DI

cmp<lx.0:檢驗正或負(fù)

jusother:為正時轉(zhuǎn)至QTHRE

not:ix

not<lx

addax、1,

n<k<lx.0:負(fù)則取補

uotsign:改變符號位

mov[bx],ax

mov[bx+2].<lx:暫存

算術(shù)運算程序設(shè)計(8)電,

;檢查乘數(shù)符號勺

other:一<K.

goimil;為正時轉(zhuǎn)至GOMUL,

not

溫馨提示

  • 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

提交評論