《微機原理與接口技術(shù)》第3版 課件 05 匯編語言程序設(shè)計_第1頁
《微機原理與接口技術(shù)》第3版 課件 05 匯編語言程序設(shè)計_第2頁
《微機原理與接口技術(shù)》第3版 課件 05 匯編語言程序設(shè)計_第3頁
《微機原理與接口技術(shù)》第3版 課件 05 匯編語言程序設(shè)計_第4頁
《微機原理與接口技術(shù)》第3版 課件 05 匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩137頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

微機原理與接口技術(shù)(第3版)5匯編語言程序設(shè)計匯編語言程序基本格式匯編語言中的數(shù)據(jù)運算符與表達式偽指令系統(tǒng)功能調(diào)用宏指令匯編語言程序設(shè)計舉例匯編語言程序上機過程調(diào)試程序DEBUG的使用5.1.1匯編語言源程序和匯編程序5.1匯編語言程序基本格式

匯編程序以匯編語言源程序文件作為輸入,并由它產(chǎn)生兩種輸出文件:目標(biāo)程序文件和源程序列表文件。

目標(biāo)程序文件經(jīng)鏈接定位后由計算機執(zhí)行;

源程序列表文件將列出源程序、目標(biāo)程序的機器語言代碼及符號表。

匯編語言源程序的處理過程如下:匯編程序Assembler匯編語言源程序.ASM機器語言目標(biāo)文件.OBJLINK鏈接程序機器語言執(zhí)行文件.EXE5.1.2匯編語言的特點5.1匯編語言程序基本格式①執(zhí)行速度快。②程序短小。③可以直接控制硬件。④可以方便地編譯。⑤輔助計算機工作者掌握計算機體系結(jié)構(gòu)。5.1.3一般匯編語言程序的結(jié)構(gòu)形式stackSEGMENTPARA‘stack‘DB100DUP(‘stack’)

stackENDS

dataSEGMENT

<數(shù)據(jù)、變量在此定義>

dataENDS

codeSEGMENTASSUMECS:code,DS:data,ES:data,SS:stack

start:MOVAX,dataMOVDS,AXMOVES,AX

<此處加入你自己的程序段>MOVAL,4CHINT21H

codeENDSENDstart

堆棧段數(shù)據(jù)段代碼段真指令每一段的語句體由語句序列組成,8086匯編語言語句分為如下三類。①指令語句:8086指令系統(tǒng)的指令形式,與機器指令一一對應(yīng)。②偽指令語句:又稱管理語句。在匯編語言源程序的匯編過程中起作用,它是對匯編程序的命令語句,一般沒有相應(yīng)的目標(biāo)代碼。③宏指令語句:是宏匯編程序能識別的、預(yù)先定義的指令代碼序列。一旦定義以后,宏指令就像一條指令一樣,可以在源程序中被引用,其效果等同于引入一段代碼序列。5.1匯編語言程序基本格式一般情況下,匯編語言的指令性語句可以由以下幾部分組成:

[標(biāo)號:][前綴]

操作碼助記符[操作數(shù)][;注釋]

偽指令語句又稱為指示性語句,其格式為:

[名字]偽指令定義符[操作數(shù)][;注釋]5.1匯編語言程序基本格式5.2.1常量5.2匯編語言中的數(shù)據(jù)?數(shù)字常量:可以是二進制數(shù)、八進制數(shù)、十進制數(shù)或十六進制數(shù)表示。

二進制:00011101B十六進制:0C5AAH十進制:9856D八進制:237O?字符常量:是用單引號‘’括起來的ASCII字符,其值是該字符的ASCII代碼值。’The2Xmeans2multipleX’?符號常量:是用標(biāo)識符定義的常量。

例如,采用符號定義語句PORTAEQU80H, 則指令MOVAL,PORTA

與指令MOVAL,80H

等價。5.2.2變量5.2匯編語言中的數(shù)據(jù)1.數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令用來定義一個變量,并將所需要的數(shù)據(jù)放入指定的存儲單元中,也可以只給變量分配存儲單元,而不賦予特定的值。

◆數(shù)據(jù)定義偽指令的一般格式為:[變量名]數(shù)據(jù)定義符操作數(shù)[,操作數(shù)…][;注釋]

◆常用的數(shù)據(jù)定義偽指令定義字節(jié)變量偽指令DB

定義字變量偽指令DW

定義雙字變量偽指令

DD

定義四字變量偽指令DQ

定義十字節(jié)變量偽指令

DT經(jīng)過定義的變量有三個屬性:數(shù)據(jù)類型、偏移量、段基址5.2匯編語言中的數(shù)據(jù)表達式是給變量預(yù)置的初值,可以是下述情況之一:①數(shù)值表達式:數(shù)值允許用二進制、八進制、十進制、十六進制形式書寫。②?:表示不預(yù)置確定的初值。③字符串表達式:用引號括起來的不超過255個字符或其他ASCII碼符號。DB偽指令將按順序為字符串中每一個字符或符號分配一個字節(jié)單元,存放它們的ASCII編碼,但DB以外的數(shù)據(jù)定義偽指令只允許定義最多兩個字符的字符串,且按逆序存放在低地址開始的單元。注意:3個及其以上的字符,只能用DB定義。當(dāng)字符串的長度不超過兩個字符時可用DW定義。str1DW‘a(chǎn)bcd’str2DD‘a(chǎn)bcd’④帶DUP操作符的表達式:DUP是定義重復(fù)數(shù)據(jù)操作符,它的使用格式是:NDUP(Exp);其中,N為重復(fù)次數(shù),EXP為表達式。5.2匯編語言中的數(shù)據(jù)例如:DATA1DB25,25H,10011010B;數(shù)值表達式DATA2DB?,?;?表達式DATA3DB2DUP(2DUP(4),15);DUP表達式DATA4DB’AB’,’CD’;字符串表達式DATA5DW?,?,-32768;字類型DATA6DD80000000H,36.625;雙字類型DATA119HDATA442HDATA600H

25H

41H

00H

9AH

44H

00HDATA2?

43H

80H

?DATA5?

00DATA304H

?

80

04H

?

12H

0FH

?

42H

04H

00H

04H

80H

0FH

2.變量的屬性5.2匯編語言中的數(shù)據(jù)變量有三種屬性:段屬性、偏移屬性、類型屬性。①段屬性(SEGMENT):變量所在的段的起始地址(16位),此值必須在一個段寄存器中。②偏移屬性(OFFSET):該變量與段的起始地址之間相距的字節(jié)數(shù)。對于16位段,是16位無符號數(shù);對于32位段,則是32位無符號數(shù)。在當(dāng)前段內(nèi)給出的變量的偏移值等于當(dāng)前地址計數(shù)器的值,當(dāng)前地址計數(shù)器的值可以用$來表示。③類型屬性(TYPE):定義該變量的字節(jié)數(shù)。如BYTE(DB,1B長)、WORD(DW,2B長)、DWORD(DD,4B長)、FWORD(DF,6B長)、QWORD(DQ,8B長)、TBYTE(DT,10B長)。5.2匯編語言中的數(shù)據(jù)3.變量的使用①變量名作為存儲單元的直接地址:變量名用直接尋址時,變量的類型必須與指令的要求相符合。例如:AB已定義字節(jié)變量,AW定義為字變量,用變量名作直接尋址形式如下:MOVAH,ABMOVAX,AW②用合成運算符PTR可以臨時改變變量類型。例如,AB已定義字節(jié)變量,AW定義為字變量,指令序列如下:MOVCX,WORDPTRABMOVCL,BYTEPTRAW則臨時把AB變?yōu)樽诸愋?AW變?yōu)樽止?jié)類型,但段和偏移屬性不變。5.2匯編語言中的數(shù)據(jù)③變量名作為相對尋址中的偏移量例如,AB已定義字節(jié)變量,AW定義為字變量,在如下指令序列中:MOVAX,AB[SI]MOVAX,AW[BX][SI]AB,AW分別表示它們的偏移量而不是它們所表示的數(shù)據(jù),常用于數(shù)組或表格操作,AB[SI]就表示AB數(shù)組中第SI個元素。④變量名僅對應(yīng)數(shù)據(jù)區(qū)第一個數(shù)據(jù)項例如:WORDDW20DUP(?)MOVAX,WORD ;第一個元素送AX,MOVAX,WORD+38 ;第20個元素送AX.5.2.3標(biāo)號5.2匯編語言中的數(shù)據(jù)●在指令性語句中,標(biāo)號表示本條語句的符號地址;●標(biāo)號、名字統(tǒng)稱為標(biāo)識符,都具備3種屬性——段屬性、偏移屬性及類型屬性。①標(biāo)號的段屬性是定義標(biāo)號在程序段的段地址。當(dāng)程序中引用一個標(biāo)號時,該標(biāo)號的段值應(yīng)在CS寄存器中。②標(biāo)號的偏移量屬性表示標(biāo)號所在段的起始地址到定義該標(biāo)號的地址之間的字節(jié)數(shù)。偏移量是一個16位無符號數(shù)。③標(biāo)號的類型屬性有兩種:NEAR和FAR。前一種標(biāo)號可以在段內(nèi)被引用,地址指針為2字節(jié);后一種標(biāo)號可以在其他段被引用,地址指針為4字節(jié)。5.3運算符與表達式表達式由操作數(shù)和運算符組成,如3+2、77AND55、NOT5AH等。1.操作數(shù)操作數(shù)用于代表一個數(shù)據(jù)或一個地址。2.運算符運算符包括算術(shù)、邏輯、關(guān)系、分析、綜合五類運算符。

①算術(shù)運算符包括+、-、*、/、MOD

參加運算的內(nèi)容可以是數(shù)據(jù),也可以是地址,但在一個算術(shù)運算符的兩邊不能都是地址。②邏輯運算符包括AND、OR、NOT、XOR③關(guān)系運算符包括相等:EQ

大于:GT

不等:NE

小于或等于:LE

小于:LT

大于或等于:GE5.3運算符與表達式關(guān)系運算結(jié)果只有兩個——真、假。如果關(guān)系是真,則結(jié)果為0FFH(0FFFFH);如果關(guān)系是假,則結(jié)果為0。例如

MOVBX,DATA1LT0010HMOVBX,0FFFFH

MOVBX,DATA1LT0010HMOVBX,0當(dāng)DATA1<0010H時

當(dāng)DATA1>0010H時

5.3運算符與表達式④取值運算符取值運算在匯編語言程序設(shè)計中很重要。它可以把它存儲器操作數(shù)分解成它的組成部分:包括取存儲單元偏移:OFFSET

取存儲單元段:

SEG

取類型:TYPE

取字節(jié)數(shù):

SIZE

按類型取長度:LENGTH5.3運算符與表達式設(shè)有數(shù)據(jù)段中使用

DATA1DB?定義了一個單元,則

MOVAL,DATA1

可將DATA1中的數(shù)傳送到AL中,AL=05

MOVAX,SEGDATA1可將DATA1的所在段地址傳到AX中,AX=2000MOVAX,OFFSETDATA1可將DATA1的偏移地址傳入AX中,AX=1500例2:設(shè)有數(shù)據(jù)段中使用

DATA1DW100DUP(?)

定義了100個字單元,則

MOVAX,TYPEDATA1AX=2MOVAX,SIZEDATA1AX=200MOVAX,LENGTHDATA1AX=10005A2001085DSCSDATA12000:15005.3運算符與表達式⑤綜合運算符綜合運算符包括兩個地址操作符PTR

PTR——改變存儲器地址操作數(shù)的操作類型,但其段地址和偏移地址不變。如:

DATA1DW100DUP(?)05A2001085DSMOVAL,DATA1

MOVAL,BYTEPTRDATA1√DATA15.3運算符與表達式在計算具有多個運算符的表達式值時,按以下規(guī)則操作:◎優(yōu)先級高的先運算,優(yōu)先級低的后運算?!虍?dāng)優(yōu)先級相同時,按表達式中從左到右的順序進行運算◎使用括號可以提高表達式運算的優(yōu)先級?!虮磉_式中的運算符的優(yōu)先級

高優(yōu)先級低1括號中的項,即(…)和[…]2LENGTH,SIZE,WIDTH,MASK3PTR,OFFSET,SEG,TYPE,THIS4×,/,MOD5+,-6EQ,NE,L,LE,GT,GE7NOT8AND9OR,XOR5.4偽指令在8086/8088匯編語言中偽指令是用于諸如數(shù)據(jù)定義、存儲區(qū)分配等功能。所謂偽指令是非機器指令,它是在匯編期間進行操作的。

1.符號定義偽指令符號定義偽指令的用途是給表達式賦予一個符號名或為標(biāo)號/變量定義新的類型屬性。表達式可以是匯編語言中的變量名、標(biāo)號名、過程名、寄存器名以及指令助記符等,符號可自行定義。在以后的程序中凡需要用到該表達式的地方都可用此符號名來代替。常用的符號定義偽指令有:等值語句EQU、等號語句=、LABEL5.4偽指令

格式:符號名EQU/

=表達式

名字LABEL類型作用:給程序中的表達式賦予一個符號名,其中表達式可以是任何有效的操作數(shù)。匯編時用語句中的表達式代替程序中符號所在的地方。

同一符號不能賦幾個不同的值。應(yīng)用:1.定義符號常量,方便修改程序。2.某表達式多次出現(xiàn)時,用等值偽操作可以方便編程。

1.符號定義偽指令5.4偽指令可在語句中進行運算,如:

DATA_PORTEQU3F8HSTAT_PORTEQU3F8H+2

SEEDEQU10FUNCEQUSEED*SEED+2*SEED+1

‘=’號操作

對符號的賦值還可使用“=”操作,它與EQU的區(qū)別是“=”操作可以重復(fù)定義,而EQU則不能重復(fù)定義。如:

X=3Y=6Y=Y*Y-X……MOVAX,Y

通過上述操作,最后使Y=33,后面的MOV語句中,當(dāng)生成目標(biāo)代碼時將用33取代Y。即

MOVAX,21H(33D)2.數(shù)據(jù)定義偽指令5.4偽指令DB 用來定義字節(jié)DW用來定義字DD用來定義雙字DF用來定義6字節(jié)內(nèi)容DQ用來定義4字內(nèi)容DT用來定義10字節(jié)內(nèi)容偽指令助記符有如下幾種:格式:[名稱]

偽指令助記符

數(shù)據(jù)表

;[注釋]其中變量名用符號地址表示,后面不能跟冒號。3.段定義偽指令5.4偽指令

段定義偽指令的用途是在匯編語言程序中定義邏輯段,用它來指定段的名稱和范圍,并指明段的定位類型、組合類型及類別。常用的段定義偽指令有

SEGMENT/ENDS

和ASSUME等。

(1)段定義偽指令

SEGMENT/ENDS格式——段名

SEGMENT[定位類型][組合類型][分類名]

段體;本段程序內(nèi)容(指令語句或偽指令語句)段名

ENDS段名為所定義段的名稱或標(biāo)識符,用于識別段,指示匯編程序為該段分配的存儲器起始位置。5.4偽指令

段定義由偽指令SEGMENT開始、ENDS結(jié)束。其中:SEGMENT和ENDS必須成對出現(xiàn),且語句前必須有段名,段名必須相同。

SEGMENT和ENDS語句之間可以有指令和其他偽操作,

表示存放在該段內(nèi)存的變量、指令或其他偽操作對該段內(nèi)存的處理。程序中可以定義多個段,如數(shù)據(jù)段、代碼段、堆棧段、附加段。程序經(jīng)匯編、鏈接及裝入內(nèi)存后,段名為一具體的段值。段名

SEGMENT[定位類型][組合類型][分類名]

段體;本段程序內(nèi)容(指令語句或偽指令語句)段名

ENDS5.4偽指令2)BYTE起始地址××××××××××××××××××××4)DWORD起始地址××××××××××××××××××005)PAGE起始地址××××××××××××00000000①定位方式(定位類型)

(Align)說明如何確定邏輯段的邊界。定位類型有四種:1)PARA(Paragraph)(缺省情況)起始地址××××××××××××××××00003)WORD

起始地址×××××××××××××××××××05.4偽指令②組合類型

:一個匯編語言源程序往往有許多模塊組成,而每一個模塊常常又有自己的數(shù)據(jù)段、代碼段和堆棧段。組合類型用于告訴LINK程序,多個模塊連接是本段與其他模塊中同名段的組合連接關(guān)系。

NONE:無組合關(guān)系。(默認)

PUBLIC:依次連接。

STACK:與PUBLIC方式相同,但僅用于堆棧段。

COMMON:從相同的地址開始,具有同樣的段地址。

MEMORY:裝在被鏈接的其它段之后。

AT表達式:相應(yīng)段定位在表達式的值指定的段地址上。③類別名:由單引號括起來的字符串,表示該段的類別,如’STACK’、‘CODE’、’DATA’等。5.4偽指令(2)段寄存器說明偽指令

ASSUME格式:ASSUME段寄存器:段名[,段寄存器:段名,…]

其中:段寄存器為CS、DS、ES、SS中的一個,

段名為用SEGMENT段定義偽指令定義過的段名。例

ASSUMECS:cc,DS:aa

ASSUME偽操作的作用設(shè)定特定的段寄存器指向特定的段,說明源程序中定義的段由哪個段寄存器去尋址。不如此,匯編程序無法生成目標(biāo)代碼程序。

ASSUME語句只起指示作用,并無實際的操作。

ASSUME并未真正將段地址裝入相應(yīng)的段寄存器,段寄存器(CS除外)的初值設(shè)定還是要由程序中的MOV指令來完成。31程序中有ASSUME語句,經(jīng)匯編,鏈接和裝入內(nèi)存后的情況:dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;給DS賦值

MOVDS,AXMOVAX,value;取數(shù)

ADDAX,value+2;兩數(shù)相加

MOVresult,AX;保存結(jié)果

MOVAH,4CH;返回DOSINT21HcodeENDSENDstartD:\MASM>DEBUGassume.exe-R;查看程序執(zhí)行前各寄存器AX=0000BX=0000CX=0023DX=0000SP=0000BP=0000SI=0000DI=0000DS=1295ES=1295SS=12A5CS=12A6IP=0000NVUPEIPLNZNAPONC12A6:0000B8A512MOVAX,12A5-U;查看在內(nèi)存的程序12A6:0000B8A512MOVAX,12A512A6:00038ED8MOVDS,AX12A6:0005A10000MOVAX,[0000]12A6:000803060200ADDAX,[0002]12A6:000CA30400MOV[0004],AX12A6:000FB44CMOVAH,4C12A6:0011CD21INT21……-注意:

程序裝入內(nèi)存后,執(zhí)行程序前,當(dāng)前的DS值并非程序定義的data段值,1295不等于

12A5。5.4偽指令4.過程定義偽指令PROC/ENDP

在程序設(shè)計中,經(jīng)常將一些重復(fù)出現(xiàn)的語句組定義為子程序。子程序又稱為過程,可以采用CALL指令來調(diào)用。過程定義格式:

過程名PROC[NEAR]/FAR…

…RET;過程體

過程名ENDP

調(diào)用一個過程的格式為:

CALL

過程名

5.4偽指令過程名常用作CALL調(diào)用指令的操作數(shù),

子程序的最后安排RET返回指令,使執(zhí)行完子程序后能返回調(diào)用處。過程有兩種類型:NEAR和FAR

無類型項時,默認為NEAR類型。當(dāng)過程與調(diào)用指令不在同一段時,應(yīng)將過程定義為FAR類型。過程類型決定子程序中RET的返回類型。5.程序標(biāo)題偽指令TITLETITLE偽指令指定一個標(biāo)題,以便能在列表文件每一頁的第一行打印出這個標(biāo)題,放置在程序的開始處。格式:TITLE

文本其中,文本是用戶給出的字符串,要求長度不超過6個字符。5.4偽指令6.地址計數(shù)器與對準(zhǔn)偽指令5.4偽指令(1)$

——地址計數(shù)器

字符“$”在8086宏匯編中具有一種特殊的意義,把它稱為程序計數(shù)器。表示位置計數(shù)器的當(dāng)前值,它可以在數(shù)值表達式中使用。在程序中,“$”出現(xiàn)在表達式里,它的值為程序下一個所能分配的存儲單元的偏移地址。BLOCKDB‘HELLO!’NUMEQU$-BLOCK‘H’‘E’‘L’‘L’‘O’‘!’BLOCK$NUM6(2)移動地址指針偽指令ORG5.4偽指令 作用:指定某源程序或數(shù)據(jù)塊起點在段內(nèi)的偏移地址,利用ORG偽指令可以強行改變位置計數(shù)器的值。

使用格式:

ORG

exp

exp

為能計算出16位立即數(shù)的表達式

例:

ORG2000H ORG$+1000H5.4偽指令(3)EVEN偽指令EVEN偽指令使下一個變量或指令開始于偶數(shù)字節(jié)地址。一個字的地址最好從偶地址開始。對于字?jǐn)?shù)組,為保證其從偶地址開始,可以在其前用EVEN偽指令。DATA_SEGSEGMENT

EVENWORD_ARRAYDW100DUP(?)

DATA_SEGENDS(4)ALIGN偽指令A(yù)LIGN偽指令使下一個變量或指令開始于指定的位置。格式:ALIGN BOUNDARY其中,BOUNDARY必須是2的冪例如,為保證雙字?jǐn)?shù)組邊界從4的倍數(shù)開始,則可以使用如下語句:.DATA

ALIGN4ARRAYDB100DUP(?)

“ALIGN2”和“EVEN”是等價的7.基數(shù)控制偽指令.RADIX5.4偽指令.RADIX表達式

;規(guī)定無標(biāo)記數(shù)的基數(shù)MOVBX,0FFHMOVBX,178.RADIX16MOVBX,0FFMOVBX,178D等價在用.RADIX16把基數(shù)定為十六進制后,十進制數(shù)后面都應(yīng)跟字母D。5.5系統(tǒng)功能調(diào)用

為節(jié)省編程工作量與優(yōu)化程序結(jié)構(gòu),在DOS及BIOS中預(yù)先設(shè)計好了一系列通用子程序,以便供DOS及BIOS調(diào)用。由于這種調(diào)用采用的是以中斷指令I(lǐng)NTn的內(nèi)部中斷方式進行的,所以常稱為DOS及BIOS中斷調(diào)用。在一個中斷服務(wù)程序中往往包含有多個功能相對獨立的子程序,所以也將中斷調(diào)用稱為系統(tǒng)功能調(diào)用或功能調(diào)用或中斷功能調(diào)用。用戶程序磁盤管理模塊(DOS內(nèi)核)MSDOS.SYS系統(tǒng)功能基本輸入/輸出BIOS模塊IO.SYS設(shè)備驅(qū)動ROMBIOS基本I/O系統(tǒng)硬件裝入命令處理模塊COMMAND.COM用戶命令DOS系統(tǒng)層次結(jié)構(gòu)操作系統(tǒng)提供了許多通用子程序供程序員使用,這些子程序分別用于I/O管理、內(nèi)存管理、文件管理、作業(yè)管理。5.5系統(tǒng)功能調(diào)用5.5.1系統(tǒng)功能調(diào)用方法格式:INTn其中,n是中斷類型碼。當(dāng)n=5~1FH時,調(diào)用BIOS中的服務(wù)程序,稱作系統(tǒng)中斷調(diào)用;當(dāng)n=20~3FH時,調(diào)用DOS中的服務(wù)程序,稱作功能調(diào)用。調(diào)用的方法如下:①AH或AX←功能號;②在其它寄存器中放入該功能所要求的入口參數(shù);③執(zhí)行INTn指令;5.5.2BIOS調(diào)用5.5系統(tǒng)功能調(diào)用BIOS常駐ROM,獨立于DOS,可與任何操作系統(tǒng)一起工作。它的主要功能是驅(qū)動系統(tǒng)所配置的外部設(shè)備,如磁盤驅(qū)動器、顯示器、打印機及異步通信接口等。通過INT10H~INT1AH向用戶提供服務(wù)程序的入口,使用戶無須對硬件有深入了解,就可完成對I/O設(shè)備的控制與操作。BIOS的中斷調(diào)用與DOS功能調(diào)用類似。軟中斷指令功

軟中斷指令功

能INT00H除法出錯INT0DH硬盤中斷INT01H單步中斷INT0EH軟盤中斷INT02H非屏蔽中斷INT10H顯示器中斷INT03H斷點中斷INT12H內(nèi)存大小檢查INT04H溢出中斷INT15H盒式磁帶機I/OINT09H鍵盤中斷INT16H鍵盤輸入INT0BH異步通信串行口1中斷INT17H打印機輸出INT0CH異步通信串行口2中斷INT1AH時鐘BIOS與DOS功能調(diào)用比較:1.調(diào)用BIOS功能子程序比調(diào)用DOS功能子程序要復(fù)雜一些,但運行速度快,功能更強。2.DOS功能調(diào)用只是在DOS的環(huán)境下使用,而BIOS功能調(diào)用不受任何操作系統(tǒng)的約束。3.某些功能只有BIOS具有。5.5系統(tǒng)功能調(diào)用5.5.3DOS系統(tǒng)功能調(diào)用5.5系統(tǒng)功能調(diào)用DOS功能調(diào)用:指DOS為系統(tǒng)程序員和用戶提供的一組常用子程序。用中斷指令I(lǐng)NT21H進入各功能調(diào)用子程序的總?cè)肟?,再為每個功能調(diào)用規(guī)定一個功能號以便進入相應(yīng)各子程序的入口。子程序的入口參數(shù)及出口參數(shù)在每個功能調(diào)用的說明中可以查到。在DOS中斷服務(wù)程序中,有近百個功能供用戶選擇使用,其中,功能最多的是向量號為21H的向量中斷。1.鍵盤輸入并顯示(01號功能調(diào)用)5.5系統(tǒng)功能調(diào)用功能調(diào)用號AH=01H。功能:接收從鍵盤輸入的一個字符并在屏幕回顯。輸入字符的ASCII碼存入AL寄存器。若按下組合鍵Ctrl+Break或Ctrl+C,則程序返回DOS;如果按下的是Tab鍵,屏幕上光標(biāo)自動移至下一個制表位。入口參數(shù):無出口參數(shù):AL寄存器存放輸入字符的ASCII碼值格式:MOVAH,01HINT21H2.輸出單字符(02H號功能)5.5系統(tǒng)功能調(diào)用功能調(diào)用號AH=02H。功能:在屏幕上顯示一個字符。入口參數(shù):DL=輸出字符出口參數(shù):無例如: MOVDL,'A' ;A字符的ASCII碼置入DL中 MOVAH,2 INT21H3.不帶顯示的單字符鍵盤輸入(07H號、08H號功能)5.5系統(tǒng)功能調(diào)用功能調(diào)用號AH=07H(08H)。功能:與01H號功能類似,區(qū)別僅僅是輸入的字符不在屏幕上顯示。其中,07H號功能調(diào)用對Ctrl+C鍵和Tab鍵無反應(yīng)。入口參數(shù):無出口參數(shù):DL=輸出字符格式: MOV AH:07H INT21H

或 MOV AH,08H INT21H4.字符串輸出(09H號功能)5.5系統(tǒng)功能調(diào)用功能調(diào)用號AH=9。功能:在屏幕上顯示一個字符串。入口參數(shù):是被輸出字符串首址,接收入口參數(shù)的是寄存器DS和DX,分別存入被輸出字符串首址的段基值和偏移量。采用9號功能輸出字符串,要求字符串以‘$’結(jié)束,該字符作為字符串結(jié)束符,不輸出。出口參數(shù):無格式:MOV DX,字符串偏移量MOV AH,09HINT 21H5.5系統(tǒng)功能調(diào)用字符串輸出(續(xù))例如:DATASEGMENTSSTRING DB 'AEXAMPLE'0DH,0AH,'$’;定義字符串

…DATAENDSCODESEGMENT…MOVDX,OFFSETSTRINGMOVAH,9INT21H…CODEENDS5.字符串輸入(0AH號功能調(diào)用)5.5系統(tǒng)功能調(diào)用功能調(diào)用號AH=0AH。功能:從鍵盤接受字符串后存入以DS:DX為首地址的內(nèi)存緩沖區(qū),同時顯示該字符串,輸入過程以回車鍵結(jié)束。要求先建立緩沖區(qū),并且:

1.第一個字節(jié)緩沖區(qū)能容納的字符個數(shù)

2.第二個字節(jié)保留,以存放實際放入的字符個數(shù)

3.第三個字符開始存放從鍵盤輸入的字符。

4.實際輸入不足,則補0;太多,則忽略。入口參數(shù):DS:DX=緩沖區(qū)首址

[DS:DX]=緩沖區(qū)最大字符個數(shù)出口參數(shù):[DS:DX+1]=實際輸入的字符個數(shù)[DS:DX+2]單元開始存放實際輸入的字符字符串輸入(續(xù))5.5系統(tǒng)功能調(diào)用格式:MOV DX,緩沖區(qū)偏移量MOV DS,緩沖區(qū)段基址MOV AH,0AHINT 21H例如:BUF DB30,?,30DUP(?)

MOV DX,OFFSETBUFMOV DS,SEGBUFMOV AH,0AHIN T21H6.返回操作系統(tǒng)(4CH號功能)5.5系統(tǒng)功能調(diào)用功能調(diào)用號AH=4CH。功能:使系統(tǒng)結(jié)束程序運行后返回DOS狀態(tài)。。入口參數(shù):AL=返回碼出口參數(shù):無格式:MOV AH,4CHINT 21H5.6宏指令為減少重復(fù)編寫相同語句段的工作,我們可以使用“宏”功能宏定義是指用一個標(biāo)識符(宏名)來代替一組指令序列(可同時包含指令性語句和指示性語句)宏功能的使用過程是:宏定義、宏調(diào)用、宏展開。1.宏定義5.6宏指令53宏指令定義格式:宏指令名MACRO<形參列表>匯編程序段(宏體)ENDMMACRO與ENDM必須成對出現(xiàn),先定義后引用SHIFTMACROMOVCL,4SALAL,CLENDM宏名程序段:將AL左移4位(乘16)INAL,5FHSHIFTOUT5FH,AL在程序中引用宏指令如下:2.宏調(diào)用宏指令調(diào)用格式:宏指令名[實參列表]5.6宏指令宏指令也可以接收參數(shù),如對X左移Y位。SHIFTMACROX,YMOVCL,YSALX,CLENDM形參列表MOVBX,WORDPTRBUFSHIFT

BX,4MOVWORDPTRBUF,BX在程序中引用宏指令如下:功能:BX的值左移4位。BXX4Y實參形參一一對應(yīng)定義實現(xiàn)源程序結(jié)束功能的宏RETSYSRETSYSMACRO MOVAH,4CH INT21H ENDM源程序在匯編時,宏指令被匯編程序用相應(yīng)的程序代碼所取代,這個過程稱為宏展開。

5.6宏指令3.宏展開定義鍵盤輸入宏指令I(lǐng)NPUT INPUTMACRO MOVAH,01H INT21H ENDM展開前: 展開后:.MODELSMALL.STACK100H.CODESTART: START:INPUT + MOVAH,01H + INT21HCMPAL,‘-’ CMPAL,‘-’JNESTART JNESTARTRETSYS + MOVAH,4CH + INT21HENDSTART5.7匯編語言程序設(shè)計舉例匯編源程序的設(shè)計步驟分析問題,建立數(shù)學(xué)模型確定最佳算法合理分配存儲單元和寄存器繪制流程圖編寫程序調(diào)試程序5.7.1程序基本結(jié)構(gòu)5.7匯編語言程序設(shè)計舉例模塊化設(shè)計方法“自頂向下,逐步細化”結(jié)構(gòu)化編碼方法順序、分支、循環(huán)三種基本結(jié)構(gòu)順序程序結(jié)構(gòu)條件程序結(jié)構(gòu)多分支程序結(jié)構(gòu)...YN5.7匯編語言程序設(shè)計舉例循環(huán)控制結(jié)構(gòu)(當(dāng)型循環(huán))循環(huán)控制結(jié)構(gòu)(直到型循環(huán))YNNY順序程序設(shè)計條件程序設(shè)計

循環(huán)程序設(shè)計

指令指針I(yè)P值線性增加,IP=IP+1IP值受標(biāo)志位的影響而跳變影響標(biāo)志的指令CMP、TEST、JXXIP值受計數(shù)器CX中的值不為零而循環(huán)影響標(biāo)志的指令DEC5.7.2順序結(jié)構(gòu)程序設(shè)計5.7匯編語言程序設(shè)計舉例例5.6編程序計算:SUM=3*(X+Y)+(Y+Z)/(Y-Z),其中,X、Y、Z都是16位無符號數(shù),要求結(jié)果存入SUM單元。假設(shè)運算過程中,中間結(jié)果都不超出16位二進制數(shù)的范圍。設(shè)計思路:(1)在數(shù)據(jù)段中定義3個字型變量X、Y、Z。(2)采用帶符號數(shù)乘除指令,要注意操作數(shù)的屬性問題。(3)假定X、Y、Z的值如程序所示,則(Y+Z)/(Y-Z)結(jié)果應(yīng)為:商AX中。5.7匯編語言程序設(shè)計舉例MOV AX,X ;取XADD AX,Y ;AX←X+Y,乘法操作數(shù)1MOV CX,3 ;乘法操作數(shù)2MUL CX ;DX:AX←3*(X+Y)MOV CX,AX ;CX←3*(X+Y)保存MOV AX,Y ;取YADD AX,Z ;AX←Y+Z,被除數(shù)XOR DX,DX ;DX←0MOV BX,Y ;取YSUB BX,Z ;BX←Y-Z,除數(shù)DIV BX ;AX←(Y+Z)/(Y-Z)的商ADD AX,CX ;AX←3*(X+Y)+(Y+Z)/(Y-Z),兩項之和MOV SUM,AX ;存結(jié)果DATASEGMENT XDW6 YDW7 ZDW8DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAH,4CHINT21HCODEENDSENDSTART5.7.3分支結(jié)構(gòu)程序設(shè)計5.7匯編語言程序設(shè)計舉例1.分支程序的結(jié)構(gòu)形式單純分支、并行分支結(jié)構(gòu)、選擇分支結(jié)構(gòu)?P0?P1P0NYNYI=?P0P1…Pn5.7匯編語言程序設(shè)計舉例例5.8:符號函數(shù)設(shè)計思路:

1.設(shè)X的范圍是[-128,127],取出X放至AL寄存器2.比較AL里面的數(shù)和0的關(guān)系,轉(zhuǎn)至3個分支5.7匯編語言程序設(shè)計舉例DATASEGMENT

XDB-18YDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:

MOVAX,DATAMOVDS,AXMOVAL,XCMP X,0JL PNUM ;X<0轉(zhuǎn)移到PNUMJZ ZERO;X=0轉(zhuǎn)移到ZEROMOV Y,1JMP EXIT;X>0PNUM:MOV Y,-1JMP EXIT;X<0ZERO:MOV Y,;X=0EXIT:MOVY,AL

MOVAH,4CHINT21HCODEENDSENDSTART3.跳躍表法5.7匯編語言程序設(shè)計舉例需要在數(shù)據(jù)段事先安排一個按順序排列的轉(zhuǎn)移地址表。

輸入的數(shù)字作為偏移量。因為只有2個字節(jié)16位偏移地址,所以偏移量需要乘2。

多分支結(jié)構(gòu)的實現(xiàn),還可以使用跳躍表法,使程序能根據(jù)不同的條件轉(zhuǎn)移到多個程序分支中去。關(guān)鍵是要理解間接尋址方式JMP指令地址表分支1地址分支2地址...Table dwdisp1,disp2,disp3,disp4,...例5.9變址尋址方式根據(jù)AL寄存器中哪一位為1(從低位到高位)把程序轉(zhuǎn)移到8個不同的程序分支中去。5.7匯編語言程序設(shè)計舉例DATA SEGMENTDATATAB DWROUTINE_1 DWROUTINE_2 DWROUTINE_3 DWROUTINE_4 DWROUTINE_5 DWROUTINE_6 DWROUTINE_7 DWROUTINE_8DATA ENDS5.7匯編語言程序設(shè)計舉例CODE SEGMENT MAIN PROCFAR

ASSUMECS:CODE,DS:DATASTART: PUSHDS SUBBX,BX PUSHBX MOVBX,DATA MOVDS,BX CMPAL,0 JECONT MOVSI,0LP: SHRAL,1 JNBNOT_YET JMPDATATAB[SI]NOT_YET: ADDSI,TYPEBRANCH TABLE JMPLPCONT:……ROUTINE_1: ………ROUTINE_2: …………………….. RETMAIN ENDPCODE ENDSEND START5.7.4循環(huán)結(jié)構(gòu)程序設(shè)計5.7匯編語言程序設(shè)計舉例1.循環(huán)程序結(jié)構(gòu)

計數(shù)循環(huán)、當(dāng)循環(huán)、直到循環(huán)循環(huán)程序由五個部分組成:循環(huán)初始化部分,循環(huán)體,循環(huán)修改部分,循環(huán)控制部分,結(jié)束處理部分。Y計數(shù)到?循環(huán)初始化循環(huán)體N循環(huán)參數(shù)修改結(jié)束處理循環(huán)條件?循環(huán)初始化循環(huán)體YN循環(huán)參數(shù)修改結(jié)束處理循環(huán)條件?循環(huán)初始化循環(huán)體YN循環(huán)參數(shù)修改結(jié)束處理2.循環(huán)控制方法5.7匯編語言程序設(shè)計舉例⑴計數(shù)控制(循環(huán)次數(shù)已知時,常用)①倒計數(shù)將循環(huán)次數(shù)n,送入一循環(huán)計數(shù)器中,某循環(huán)一次,計數(shù)器減1,直到其值為0?!?/p>

MOVCX,循環(huán)次數(shù)LOOPA:…………DECCXJNELOOPA

②正計數(shù)循環(huán)次數(shù)n。0送入一循環(huán)計數(shù)器中,某循環(huán)一次,計數(shù)器加1,直到其值為n。

……MOVCX,0LOOPA:……

……

INCCXCMPCX,nJNELOOPA例5.10在首地址為BUFF的內(nèi)存緩沖區(qū)中,存放著20H個帶符號的字?jǐn)?shù)據(jù)。要求找出其中的最小值,并將最小值存入MIN單元。5.7匯編語言程序設(shè)計舉例設(shè)計思路:可以先假定第一個數(shù)據(jù)就是最小值(當(dāng)前最小值),然后和其余數(shù)據(jù)比較,如果比當(dāng)前最小值大,則不處理;否則將該數(shù)據(jù)置換為當(dāng)前最小值,直至所有的數(shù)據(jù)都比較完。循環(huán)次數(shù)是20H次。5.7匯編語言程序設(shè)計舉例DSEGSEGMENT

BUFF

DD5,7,19H,23H,0A0H….;放置20H個帶符號數(shù)據(jù)DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:

MOVAX,DSEGMOVDS,AX

LEA SI,BUFF ;設(shè)地址指針 MOV CX,20H ;CX←循環(huán)次數(shù) MOV AX,[SI];AX←第一個數(shù)據(jù) INC SI INC SI ;SI指向第二個數(shù) DEC CX ;修改循環(huán)次數(shù)計數(shù)器AGAIN: CMP AX,[SI]

JLE NEXT;小于或等于時轉(zhuǎn)移

MOV AX,[SI]NEXT: INC SI INC SI ;修改地址指針指向下一個數(shù)

LOOP AGAIN MOV MIN,AXMOVAH,4CH INT21HCSEGENDSENDSTART⑵條件控制5.7匯編語言程序設(shè)計舉例例5.11:編程統(tǒng)計AX寄存器中1的個數(shù),并將結(jié)果存入SUM單元。循環(huán)次數(shù)未知。但是循環(huán)結(jié)束與某些條件(比較、運算的結(jié)果等等)相關(guān),比較所要求的條件是否達到,未滿足繼續(xù)循環(huán),否則結(jié)束循環(huán)。在解決實際問題時,往往要根據(jù)問題給定的已知條件,在認真分析算法之后才能確定選用哪種方法。設(shè)計思路:方法1:要統(tǒng)計二進制數(shù)中1的個數(shù),最方便的方法是將這個數(shù)的各位依次移入CF標(biāo)志,通過檢測CF的值來判斷該位是否為1,依此統(tǒng)計所含1的個數(shù)。這是一個重復(fù)計數(shù)的過程,可以用循環(huán)程序?qū)崿F(xiàn)。

對循環(huán)的控制,可以用計數(shù)方法,共檢測16次;方法2:通過判斷移位后二進制數(shù)是否變?yōu)?作為循環(huán)結(jié)束的條件。當(dāng)二進制數(shù)的后幾位全部為0時,用這種方法可以提前結(jié)束循環(huán),提高程序的運行效率。5.7匯編語言程序設(shè)計舉例程序片段如下: MOV BL,0 ;計數(shù)單元BL清0AGAIN: OR AX,AX ;測試AX是否為0 JZ EXIT

;若AX=0,則轉(zhuǎn)移到結(jié)束點

SHL AX,1 ;將AX最高位移至CF JNC NEXT

;CF=0,轉(zhuǎn)去AGAIN繼續(xù)

INC BL ;CF≠0,BL加1NEXT: JMP AGAIN

EXIT: MOV SUM,BL⑶邏輯尺控制5.7匯編語言程序設(shè)計舉例循環(huán)體內(nèi)的處理任務(wù)在每次循環(huán)執(zhí)行時并無規(guī)律,但確實需要連續(xù)運行。此時,可以給各處理操作標(biāo)以不同的特征位,所有特征位組合在一起,就形成了一個邏輯尺。例5.12在數(shù)據(jù)段中有兩個數(shù)組X和Y,每個數(shù)組含有10個雙字節(jié)數(shù)據(jù)元素?,F(xiàn)將兩個數(shù)組的對應(yīng)元素進行下列計算,形成一個新的數(shù)組M。假定數(shù)組的對應(yīng)元素計算后,結(jié)果不產(chǎn)生溢出。M1=X1+Y1 M2=X2+Y2 M3=X3-Y3M4=X4+Y4 M5=X5-Y5 M6=X6-Y6M7=X7-Y7 M8=X8+Y8 M9=X9+Y9M10=X10-Y10設(shè)計思路:這個問題可以用循環(huán)實現(xiàn),而且循環(huán)次數(shù)確定為10次。但每次循環(huán)的操作是進行加還是減,無規(guī)律可循。為此,可以為每一次操作設(shè)置一個特征位,即0表示加,1表示減,構(gòu)成一個16位的邏輯尺,存放于DX寄存器中。本例邏輯尺如下:0010111001000000從左到右依次為數(shù)組元素1~10的特征位。每次將邏輯尺左移1位,根據(jù)移入CF的特征位,判斷本次循環(huán)體所進行的操作。5.7匯編語言程序設(shè)計舉例程序片段如下: MOV BX,0 ;設(shè)數(shù)組下標(biāo)指針 MOV CX,10 ;設(shè)循環(huán)計數(shù)器AGAIN: MOV AX,X[BX]

SHL DX,1 JC SUBB

;若當(dāng)前特征位為1,則做減法;否則做加法

ADD AX,Y[BX]

JMP NEXTSUBB: SUB AX,Y[BX]NEXT: MOV M[BX],AX;送結(jié)果

INC BX INC BX LOOP AGAIN5.7.5子程序設(shè)計5.7匯編語言程序設(shè)計舉例子程序是具有一定的功能,能被多次調(diào)用的程序。子程序設(shè)計中要解決的問題:1.怎樣正確編寫子程序?(定義)2.怎樣正確調(diào)用子程序?3.主程序與子程序之間怎樣傳遞參數(shù)?主程序每次調(diào)用子程序時提供給子程序加工的數(shù)據(jù)往往是不同的。主程序怎樣把這些數(shù)據(jù)傳送給子程序,而子程序又如何把加工的結(jié)果交給主程序?4.當(dāng)主程序與子程序使用相同的寄存器時,應(yīng)如何處理?(保護/恢復(fù))5.子程序執(zhí)行完之后,怎樣才能返回到主程序的斷點處繼續(xù)往下執(zhí)行?5.7匯編語言程序設(shè)計舉例76①定義:過程名PROC[NEAR/FAR]…

RET過程名ENDP②調(diào)用:CALL過程名子程序名也具有段屬性,偏移地址屬性和類型屬性(FAR和NEAR(缺省))。

NEAR類型為段內(nèi)調(diào)用,即主子程序在同一個代碼段內(nèi),NEAR可省略。

FAR類型為段間調(diào)用,被另外代碼段調(diào)用的過程要定義為FAR過程1.子程序定義與調(diào)用5.7匯編語言程序設(shè)計舉例①段內(nèi)直接調(diào)用(重點)

格式:CALL子程序名功能:①(返回地址:跟在CALL后的下一條指令/斷點的EA)→↓(SP)②目的地址(子程序名)EA→IPCS:1010H

CALLOUTPUTCS:1013H┇CS:1138HOUTPUTPROCNEAR

OUTPUTENDP;CALL1138H;1013H進棧,1138H→IP下一條指令(IP)1013H┇SP→2.子程序的調(diào)用與返回5.7匯編語言程序設(shè)計舉例格式:RET/RETn功能:a.段內(nèi)返回↑(SP)→IPb.段間返回↑(SP)→IP,↑(SP)→CS為了能正確返回主程序,在執(zhí)行子程序過程中,不管是否使用過堆棧,必須保證進入子程序時的棧頂與執(zhí)行RET時的棧頂一樣,否則不能正確返回。注意:CALL和RET不影響標(biāo)志位;是段內(nèi)返回還是段間返回要看子程序定義偽指令PROC后面的類;對于RETn表示返回時,清除堆棧中棧頂?shù)膎/2個無用參數(shù)(n為偶數(shù)),在前述動作之后再作(SP)+n→SP,當(dāng)使用堆棧傳遞子程序參數(shù)的時候經(jīng)常使用。返回地址也稱為斷點,是CALL指令下一條指令的第一個字節(jié)地址(段內(nèi)調(diào)用僅保存IP,段間調(diào)用保存CS和IP)。②返回指令RET3.編寫子程序時的注意事項5.7匯編語言程序設(shè)計舉例子程序通常由子程序說明部分與代碼部分所組成。說明部分由下列幾部分所組成:子程序名稱,子程序功能,入口參數(shù),出口參數(shù),使用的寄存器和存儲單元,調(diào)用的其它子程序,代碼部分:保護現(xiàn)場;根據(jù)入口參數(shù),獲取要處理的數(shù)據(jù);進行數(shù)據(jù)處理;根據(jù)出口參數(shù),將處理后的數(shù)據(jù)送至指定的區(qū)域;恢復(fù)現(xiàn)場;返回主程序。(1)子程序的結(jié)構(gòu)5.7匯編語言程序設(shè)計舉例主程序為子程序提供入口參數(shù) 子程序根據(jù)入口參數(shù)進行一系列處理程序返回結(jié)果給主程序三種傳遞參數(shù)的方式:(1)寄存器法:適合于參數(shù)較少的情況,傳遞速度較快。(2)存儲器法:適合于參數(shù)較多的情況,事先需要在存儲器中建立一個參數(shù)表。(3)堆棧法:適合于參數(shù)較多的情況,尤其是在子程序嵌套與遞歸調(diào)用的情況。(2)主程序與子程序的參數(shù)傳遞的方法約定法5.7匯編語言程序設(shè)計舉例SUBPROC

PROCPUSHAXPUSHCXPUSHSIPUSHDIPUSHF

……;子程序體部分

POPFPOPDIPOPSIPOPCXPOPAXRETSUBPROCENDP現(xiàn)場的保護與恢復(fù)和子程序返回示例:將寄存器壓入堆棧保護的過程稱為保護現(xiàn)場,將寄存器從堆棧中彈出恢復(fù)的過程稱為恢復(fù)現(xiàn)場。保護和恢復(fù)現(xiàn)場的工作既可以在調(diào)用程序中進行,也可以在子程序中進行。4.子程序舉例5.7匯編語言程序設(shè)計舉例例5.14兩個16位十進制數(shù)以壓縮BCD碼的形式存放在內(nèi)存中,求它們的和。設(shè)計思路:

可以通過8次字節(jié)數(shù)相加,每次相加后再進行十進制調(diào)整來實現(xiàn)。①用寄存器和存儲器傳遞參數(shù)采用了寄存器和存儲單元兩種方法傳遞參數(shù)。入口參數(shù):CX中置入組合BCD碼的字節(jié)個數(shù);DAT1和DAT2數(shù)據(jù)區(qū)中存放BCD碼表示的被加數(shù)和加數(shù),低位在前,高位在后。出口參數(shù):運算結(jié)果在以變量SUM為首地址的數(shù)據(jù)區(qū)中。5.7匯編語言程序設(shè)計舉例DATA SEGMENTDAT1 DB34H,67H,98H,86H,02H,41H,59H,23H ;低位在前DAT2 DB33H,76H,89H,90H,05H,07H,65H,12H ;低位在前SUM DB10DUP(0)DATA ENDSSTACK SEGMENT PARA STACKDW 20HDUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV CX,8 ;設(shè)子程序入口參數(shù) CALL ADDP ;調(diào)用加法子程序

MOV AH,4CH ;返回DOS INT 21H5.7匯編語言程序設(shè)計舉例ADDP PROC ;加法子程序,完成2位十進制數(shù)相加

PUSH AX ;保護現(xiàn)場

PUSH BX CLC ;清除進位標(biāo)志

MOV BX,0AGAIN: MOV AL,DAT1[BX] ;相加 ADC AL,DAT2[BX] DAA ;十進制調(diào)整

MOV SUM[BX],AL ;存結(jié)果

INC BX ;修改下標(biāo)

LOOP AGAIN ;循環(huán)執(zhí)行8次

ADC SUM[BX],0 POP BX ;恢復(fù)現(xiàn)場 POP AX RET ;返回主程序ADDP ENDPCODE ENDSEND START②用地址表傳遞參數(shù)5.7匯編語言程序設(shè)計舉例設(shè)計方法:用地址表傳遞的是參數(shù)的地址。在轉(zhuǎn)向子程序前,將參數(shù)的地址放入一個表中,將表的首地址作為入口參數(shù)傳遞給子程序,由子程序根據(jù)參數(shù)表中的地址取出對應(yīng)參數(shù)。DATA SEGMENTDAT1DB34H,67H,98H,86H,02H,41H,59H,23H ;低位在前DAT2DB33H,76H,89H,90H,05H,07H,65H,12H ;低位在前SUMDB10DUP(0)TABLEDW4DUP(0)DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVTABLE,OFFSETDAT1 MOVTABLE[2],OFFSETDAT2 MOVTABLE[4],OFFSETSUM ;建立地址表

MOVBX,OFFSETTABLE ;BX←地址表首址

CALLADDP ;調(diào)用加法子程序

MOVAH,4CH ;返回DOS INT21H5.7匯編語言程序設(shè)計舉例ADDPPROC ;加法子程序 MOVCX,8 ;CX←字節(jié)個數(shù) MOVSI,[BX] ;SI←被加數(shù)首地址 MOVDI,[BX+2

溫馨提示

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

評論

0/150

提交評論