匯編語言課件_第1頁
匯編語言課件_第2頁
匯編語言課件_第3頁
匯編語言課件_第4頁
匯編語言課件_第5頁
已閱讀5頁,還剩105頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

匯編語言

匯編語言程序的開發過程編輯文本編輯器,如EDIT.COM源程序:文件名.asm匯編匯編程序,如ML.EXE目標模塊:文件名.obj連接連接程序,如LINK.EXE可執行文件:文件名.exe調試調試程序,如DEBUG.EXE應用程序錯誤錯誤錯誤錯誤5.18086匯編語言基礎4.2宏匯編基本語法匯編源程序不區分字母大小寫。(1)組成:數據段、代碼段、堆棧段、附加段。(2)段定義起始:段名

SEGMENT

段定義結束:段名

ENDS

前后段名要一致,

每個段不超過64KB。(3)程序語句組成:標號助記符操作數;注釋(4)整個程序結束:

END起始地址AASEGMENTSTR1DB'HELLO!'AAENDSBBSEGMENTSTR2DB6DUP(?)

BBENDSCCSEGMENTASSUMECS:CC,DS:AA,ES:BBSTART:CLDMOVAX,AAMOVDS,AXLEASI,STR1MOVAX,SEGSTR2MOVES,AXMOVDI,OFFSETSTR2MOVCX,6REPMOVSBMOVAH,4CHINT21HCCENDSENDSTART●●1)效率低(與人們描述計算過程的需要差距大);2)機器硬件的具體結構聯系過于緊密——在一種結構的機器上開發

的程序極難移植到另一種不同結構的機器上去。5.18086匯編語言基礎匯編語言進行程序設計的優點1)充分利用機器的硬件功能和結構特點,加快程序的執行速度,

減少目標程序所占用的存儲空間;2)用來編寫實時控制程序、實時通信程序,有時也用來編制某些

系統軟件程序。匯編語言進行程序設計缺點匯編語言基本語法在8086匯編中使用的語句可以分成2種類型這類指令能夠產生目標代碼,是CPU可以執行的能夠完成特定功能的語句,主要由機器指令組成。在匯編時一條指令語句被翻譯成對應的機器碼,對應著特定的操作。

指令語句:偽指令語句:偽指令語句是為匯編程序和連接程序提供一些必要控制的管理性語句,它不產生目標代碼,僅僅在匯編過程中告訴匯編程序應如何匯編,并完成相應的偽操作。5.1.1格式:指令語句:[標號:]

指令助記符

[操作數]

[;注釋]偽指令語句:[名字

]偽指令助記符

[操作數]

[;注釋]匯編語言源程序中的語句可以由四項組成,格式如下:

[名字]操作符

[操作數][;注釋]匯編語言語句5.1.2●1.匯編語言格式●名字項:是程序設計人員自己定義的符號,用于代表內存單元的地址,表示本條語句的符號地址。一般來說,名字可以是和,統稱為標識符。變量標號名字項的組成規則

組成標號的字符:A?Z,a?z,0?9,?,@,$,下劃線;標號的最大長度為3l(字符個數);標號的第一個字符不能是0?9的數字;機器指令語句中標號必須以冒號結束,偽指令語句中的標號不允許有冒號。匯編語言語句5.1.25.1.2匯編語言語句

●偽指令符:指定匯編程序要完成的具體操作如:數據定義偽指令DB、DW、DD,段定義偽指令SEGMENT,假定偽指令ASSUME等。

●操作數:偽指令后面的操作數可以是常數、標號、變量、表達式等,其個數由具體的偽指令決定,各個操作數之間必須以“逗號”分隔。●注釋:偽指令的注釋必須以“;”開始,其作用同指令語句中的注釋部分。

常量:匯編語句中出現的各種常數表達式數值常量

直接以數值形式出現在匯編語句中的常量(1)數字常量(2)字符常量:

字符常量是用單引號或雙引號引起來的一個或多個字符。字符串常量是以各字符的ASCⅡ碼表示的。

[例]‘A’用41H表示,字符串‘A1B2’用41H,31H,42H,32H表示。常量5.1.2匯編語言語句變量:是在程序運行期間可以隨時修改數值的數據對象。主要用來定義M中的數據。數據存放地址的符號表示。

變量的三種屬性段屬性:即指定義變量所在段的段首址;偏移屬性:該變量所在段的偏移地址;類型屬性:指在對該變量中每個元素所包含的字節數;它可以是字節類型(BYTE,),字類型(WORD),雙字類型(DWORD)等.變量匯編語言語句5.1.2標號:是一條指令語句的符號地址。只有在需要轉向一條指令語句時,才為該指令語句設置標號,以便在轉移類指令(含子程序調用指令)中直接引用這個標號。標號可作為轉移類指令的操作數,即轉移地址。格式:標號:指令標號也具有三種屬性(同變量)

段屬性偏移地址屬性類型屬性標號匯編語言語句5.1.2表達式:用來表達語句中的常量?變量和標號,其運算由匯編程序來完成,將得到的結果作為操作數,參加指令所規定的操作。包括:數值表達式和地址表達式●數值表達式:由常量和算術運算符、邏輯運算符、關系運算符組合成的表達式,其結果為數值。算術運算符邏輯運算符關系運算符●地址表達式:其結果為存儲器的地址。匯編語言語句5.1.2表達式5.1.2匯編語言語句5.1.3偽指令2.數據定義偽指令

變量代表內存中的數據區,定義變量就是為數據區中的數據分配存儲單元,并給該數據區取一個名字——變量名。格式:[變量名]數據定義偽指令

操作數

[;...]變量名用符號地址表示,作用與指令的標號相同。偽指令助記符常用的有以下幾種:

DB(字節)、DW(字)、DD(雙字)、

DQ(四字)、DT(五字),其中DB與DW最常用。操作數是賦給變量的初值。

[例]一組數據定義如下:D1DB12,10HD2DW10,100H,-4D3DD2*30,0ABFDHD4DB'HELLO'D5DB?,?,10D6DB2DUP(1,4,?)注釋:定義的數據按各自類型以二進制形式順序存入內存中。如果是字符型數據則存放其ASCII碼。?表示不寫入任何數據,只是分配空單元。NDUP(…)表示存入的數據以括號中的規律重復的排列N次,DUP可以嵌套.[例](1)ABDB0,?,?,?,0DFDW?,52,?(2)AY1DB2DUP(0,1,2,?)DFAY2DB100DUP(?)

52D

AY2

100個字節

00---00--3400--000102-000102--:-AY1AB操作數項5.1.2匯編語言程序格式表達式包括:數值表達式和地址表達式數值表達式:由常量和算術運算符、邏輯運算符、關系運算符組合成的表達式,其結果為數值。

★算術運算符

★邏輯運算符

★關系運算符地址表達式:其結果為存儲器的地址。說明:1.既可以用于數值表達式又可用于地址表達式;

2.除法表示兩個數相除只取商的整數部分;

3.而模除則表示兩個整數相除后取余數。包括:加(+)、減(-)、乘(*)、除(/)模除(MOD)、SHL(左移)、SHR(右移)1.算術運算符5.1.2匯編語言語句【例】用算術運算符進行數值表達式運算。

┆NUM1EQU 25*4–50 ;NUM1=50NUM2EQU NUM1/7;NUM2=7NUM3 DB NUM1MOD7;NUM3=1NUM5EQU 0FH ┆MOV AL,NUM5SHL4;(AL)=11110000BMOV BL,NUM5SHR4;(BL)=00000000B1.算術運算符5.1.2匯編語言語句包括:邏輯乘(AND)、邏輯加(OR)、按位加(XOR)、邏輯非(NOT)四種運算。說明:1.由于邏輯運算是按位操作,且在匯編過程中完成,2.運算的結果仍為整數常量。2.邏輯運算符5.1.2匯編語言語句【例】用邏輯運算符進行運算MOV AL,34HAND0FH ;04H→ALMOV BL,05HOR30H ;35H→BLMOV CX,NOT00FFH ;0FF00H→CXMOV DX,789AHXOR000FH ;7895H→DX2.邏輯運算符5.1.2匯編語言語句包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。

說明:1.關系運算符是在兩個常量之間進行的;2.其結果只有兩種情況:若關系成立則結果為0FFFFH(16為全1);否則結果為零。3.因而運算的結果仍為整數常量。3.關系運算符5.1.2匯編語言語句【例】用關系運算符進行數值表達式運算。NUM1 DB 10LT5 ;NUM1=0NUM2DB 0AAAAHGT7FFFH

;NUM2=0FFFFHMOV AX,‘A‘EQ41H ;0FFFFH→AXMOV BX,NUM2LTNUM1;0→BX3.關系運算符5.1.2匯編語言語句包括:TYPE、、LENGTH、SIZEOFFSET、SEG操作符說明:1.地址操作符的返回值都是數值,相當于立即數;是匯編時由MASM自動計算的。2.它們總是加在運算對象之前,3.返回的結果是運算對象的某個參數值。5.數值返回運算符5.1.2匯編語言語句包括:TYPE、、LENGTH、SIZEOFFSET、SEG操作符

類型

類型值字節1字2雙字4四字8五字10NEAR0FFFFH(-1)FAR0FFFEH(-2)1)取類型操作符TYPE

格式:TYPE變量/標號功能:取變量或標號的類型.5.數值返回運算符5.1.2匯編語言語句[例]ARRAY DW1,

2,

3MOVAX,05HADD AX,TYPEARRAY;AX=5+2=73)取變量所含M單元大小操作符SIZE

格式:SIZE變量 功能:返回直接分配給指定變量的字節數。即LENGTH*TYPE2)取變量所含M單元個數操作符LENGTH格式:LENGTH 變量功能:如果變量是用DUP說明,則返回DUP定義變量的重復次數,否則,返回值為1。5.數值返回運算符4)取偏移地址操作符OFFSET

格式:OFFSET 地址表達式功能:加在變量和標號之前,返回地址表達式的偏移地址,作為立即數使用(匯編時求值)[例]設DAAS為標號,F1為變量

MOVSI,OFFSETDAASMOVDI,OFFSETF15.數值返回運算符5)取段地址操作符SEG

格式:SEG 地址表達式功能:加在變量和標號之前,返回地址表達式的段地址,作為立即數使用(匯編時求值)。[例]設DAAS為標號,F1為變量

MOVAX,

SEGDAASMOVAX,

SEGF1MOVDS,

AX;將段地址送DS5.數值返回運算符[例1]DATASEGMENTADW50,100,-70HBDW‘ABCDEF’DATAENDS…………..MOVAX,SEGBMOVBX,0FFSETBMOVCX,TYPEAMOVDX,TYPEB

5.數值返回運算符[例2]TYPE;LENGTH;

SIZE是什么?A1DB?,’ABCD’A2DD?,10DUP(0)A3DW10DUP(0)A4DW1,2,3,4;TYPE:1;LENGTH:1;SIZE:1;TYPE:4;LENGTH:1;SIZE:4;TYPE:2;LENGTH:10;SIZE:20;TYPE:2;LENGTH:1;SIZE:25.1.2匯編語言語句●

PTR操作符

格式:類型

PTR符號名功能:該操作符用于指定操作數的類型。屬性操作符6.●

段操作符格式:段寄存器名:地址表達式功能:用來表示變量或地址表達式的段屬性。6.屬性運算符1.PTR格式:類型PTR變量或標號功能:指定地址表達式的類型。說明:1.返回一個指定類型的內存操作數或標號,而地址不變。2.對于內存操作數,類型包括BYTE、WORD、

DWORD等。對于標號,類型包括NEAR和FAR。3.PTR只是臨時改變操作數的類型,或必須明確指出類型的場合。5.1.2匯編語言語句包括:PTR;SHORT操作符[例]BUF DB31H,32HMOV AL,BUF ;(AL)=31HMOV BX,WORDPTRBUF ;臨時指定BUF為字型,(BX)=3231HLEA DI,BUFMOV BYTEPTR[DI],6 ;明確指出DI指向字節型單元,否則匯編時出錯2.SHORT格式:SHORT短標號功能:用來修飾JMP指令中轉向地址的屬性,指出轉向地址是在下一條指令地址的-128--+127字節范圍之內。

包括:PTR;SHORT操作符

[例]

JMPSHORTLAB6.屬性運算符5.1.2匯編語言語句優先級運算符(操作符)

低括號中的表達式LENGTH,SIZE,PRT,OFFSET,SEG,TYPE,段前綴HIGH,LOW*,/,MOD,SHL,SHR+,-EQ,NE,LT,TE,GT,GENOTOR,XORSHORT運算的優先級別7.5.1.2匯編語言語句

格式:符號名EQU表達式功能:為常量、表達式及其他各種符號定義一個等價的符號名,但它不申請存儲單元。說明:EQU后的表達式可以是數值、字符串、寄存器名、指令助記符等.EQU不能重復定義,

CTEQU1CTEQUCT+1

偽指令語句1.符號定義偽指令5.1.3●等價偽指令●等號偽指令格式:符號名=常數表達式功能:為常量、表達式及其他各種符號定義一個等價的符號名,并能對所定義的符號多次重復定義,且以最后一次定義的值為準。說明:

=后的表達式只能是常數,對于字符或字符串,匯編時按整數處理。例如:COUNT=20 MOVCX,COUNT;

等價于MOVCX,20=可重復定義,其作用域從定義點到重新定義之前。偽指令語句1.符號定義偽指令5.1.3

[例]X1EQU256BEQU[BP+6]B8EQUDS:[BP+34]LPNEQULP1+6SCAEQUSCASWX1=4X1=35表達式賦值偽指令格式:

5.1.3偽指令語句段定義偽指令段名SEGMENT[定位方式][組合方式][類別]

;段內所有語句段名ENDS說明:同一個段的段名必須相同;段中間的語句可以是指令語句和偽指令語句;[例]定義數據段:將定義的一些數據放置在數據段,但并未指明所對應的段寄存器。以后在代碼段中用ASSUME偽操作來指定其對應關系,但也不能把段地址裝入相應的段寄存器,需要在代碼段中用MOV指令實現。5.1.3偽指令語句段定義偽指令舉例DATASEGMENTDB5,?,78H;定義的數據

DW342H,0ABC8HDATAENDSCODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATASTART:

MOVAX,DATA;將數據段的段基值裝入DS寄存器

MOVDS,AX

MOVAX,4C00H;結束程序

INT21HCODE_SEGENDSENDSTART上例中定義了一個數據段,將定義的一些數據放置在其中。但并未指明所對應的段寄存器。以后在代碼段中用ASSUME偽操作來指定其對應關系,但也不能把段地址裝入相應的段寄存器,需要在代碼段中用MOV指令實現。ASSUME段寄存器名:段名1[,段名2……]段定義時,必須將段和段寄存器自之間建立對應關系,可以用ASSUME偽操作來實現,其格式為:

說明:定位方式(ALIGN_TYPE)

此參數給出了該段的起始地址確定方式。有四種類型:

PAGE:頁邊界,起始地址的低8位為0,即能被256整除。

PARA:段邊界,起始地址的低4位為0,即能被16整除。默認

WORD:字邊界,起始地址的最低位為0,即能被2整除。

BYTE:任意有效地址。組合方式(COMBINE_TYPE)

此參數通知鏈接程序本段與其他段的鏈接方式,有六種類型:

PUBLIC:將本段與其他同名同類別的段連接起來,共用一個段的起始地址,形成一個物理段,連接次序由鏈接命令指定。

STACK:指定本段在運行時為堆棧段,其他與PUBLIC相同。段定義偽指令COMMON:表示本段與同名同類別的段共用相同的起始地址,它們之間是覆蓋連接。MEMORY:將本段放置在所有其他段連接以后的更高的地址上,如有多個MEMORY存在,則第一個段按MEMORY方式安排,其他段與該段用覆蓋方式。AT表達式:表示本段放置在由表達式值指定的地址上。即本段按絕對地址定位,段地址為數值表達式的值,位移量為0。如:AT1234H;表示該段段基址為12340H。空缺:表示本段不與任何段連接。類別('CLASS')

用單括號括起來的類別名是一個合法的符號名,在鏈接時凡類別名相同的段按先后次序連接起來。段定義偽指令

例:CODE SEGMENTAPRC PROC NEAR ADD AX,BX …… RETAPRC ENDPSTART:

MOV AX,CX CALL APOC ……CODE ENDS END START5.1.3偽指令語句

過程定義偽指令格式:功能:完成過程定義,在過程體中實現過程的操作功能。過程名PROC……過程體RET過程名ENDP5.1.3其它偽指令1.置匯編地址計數器偽指令格式:

ORG常數表達式功能:指示匯編程序在它以后的程序段或數據塊存放起點的偏移地址。說明:在匯編程序對源程序匯編的過程中,使用地址計數器保存當前正在匯編的語句地址(段內偏移量),匯編語言允許用戶直接用$引用地址計數器的當前值。 [例1]ORG100H;設置地址計數器的值為100H

[例2]ORG$+6;跳過6個字節的存儲區域練習題選擇題1.下面指令執行后,變量DAB中的內容是(C)。

DAWDW2A05H

DABDB0FAH

MOVAL,BYTEPRTDAW

SUBDAB,AL

A.0DAHB.0FAHC.0F5HD.0D0H2.設數據段中已有:

DA1DB12H,34H

DA2DW56H,78H

下面有語法錯誤的語句是(B)

A.MOVDA2,AXB.MOVDA1+1,AX

C.MOVBYTEPTRDA2+1,ALD.MOVWORDPTRDA1+1,AX3、BUFDW10HDUP(3DUP(2,10H),3,5)

上述語句匯編后,為變量BUF分配的存儲單元字節數是(B)。

A.80HB.100HC.124D.192(字節數=2X16X(3X2+2)=256)4.匯編語言源程序中,每個語句由四項組成,如語句要完成一定功能,那么該語句中不可省略的項是(B)。

A.名字項B.操作項C.操作數項D.注釋項5.在ARDB10DUP(3,2DUP(9))中,含數據字0309H的個數是(D)

A.10B.20C.0D.96.將變量的偏移地址存入數據區宜用偽操作助記符是(A)

A.DWB.DBC.DDD.DQ09090309090303127、設DS=8225H,DI=3942H,指令NEGBYTEPTR[DI]操作數的物理地址是(A)A、85B92HB、86192HC、BB690HD、12169H8、下列寄存器組中在段內尋址時可以提供偏移地址的寄存器組是(B)

A、AX,BX,CX,DXB、BX,BP,SI,DI

C、SP,IP,BP,DXD、CS,DS,ES,SS9、循環指令LOOPNZ終止循環的條件是(B)。

A、CX=0,且ZF=0B、CX=0,或ZF=1

C、CX≠0,且ZF=0D、CX≠0,或ZF=110、與MOVBX,OFFSETVAR指令完全等效的指令是(D)。

A、MOVBX,VARB、LDSBX,VAR

C、LESBX,VARD、LEABX,VAR11、執行下面指令序列后,結果是(A)。

MOVAL,82HCBW

A、AX=0FF82HB、AX=8082HC、AX=0082HD、AX=0F82H

12.沒有語法錯誤的輸出指令是(B)

A.OUTAX,30H B.OUTDX,AL

C.OUTAL,DX D.OUT30H,AH13.下列語句中能與“DA1DB32H,34H”語句等效的是(A)

A.MOVDA1,32HMOVDA1+1,34HB.MOVDA1,32MOVDA1+1,34C.MOVWORDPTRDA1,3234HD.MOVWORDPTRDA1,‘24’14.用MOV指令將十進制數89以非壓縮BCD碼格式存入AX,可使用的指令是(D)

A.MOVAX,89 B.MOVAX,0809

C.MOVAX,89H D.MOVAX,0809H已知數據段定義如下:DATASEGMENT

VADB10H

VBDW3*20

MSGDB‘HELLO!’

COUNTEQU15

BUFDWCOUNTDUP(5,3DUP(1,2),0)DATAENDS問題:(1)畫出數據段中數據存放情況(2)執行MOVBX,0FFSETVA后,(BX)=

(3)執行MOVCX,TYPEBUF后,(CX)=

(4)用一條指令將字母‘O’取到AL中.

(5)經匯編后,BUF占有的存儲空間是字節答:(2)0(3)2(4)MOVAL,MSG+4(5)240填空題

2.下列程序段求數組ARY的累加和,

請將程序填寫完整。

ARYDW45H,68H,…,0ABC1H,9600H;共10項

COUNTDW10

(1)__________

MOVCX,COUNT

XORAX,AX

AGAIN:ADDAX,[SI]

ADDSI,2

(2)____________答:(1)LEASI,ARY(2)LOOPAGAIN3.程序分析題

MOVAX,9B47H

MOVBX,0B568H

ADDAX,BX

JNOL1

JNCL2

SUBAX,BX

JNCL3

JNOL4

JMPSHORTL5

問:(1)程序執行后,(AX)=?

(2)程序轉向哪個標號?答:(1)9B47H(2)L5

4.下列程序測試DL寄存器D6和D2位。若同時為0,轉ZERO,置AX為0,否則轉NO_ZERO,置AX為1。

TESTDL,(1)_________

JZZERONO_ZERO:MOVAX,1

(2)________

ZERO:MOVAX,0

NEXT:

答:(1)01000100B

(2)JMPNEXT5、ARYDW10DUP(?)┇

MOVAL,TYPEARY

MOVBL,LENGTHARY

MOVCL,SIZEARY

上述MOV指令序列執行后的結果是什么?

答:AL=2、BL=10、CL=2*10=206、設某數據段:

DATA

SEGMENT

ORG20H

NUM1=8

NUM2=NUM1+10H

DA1DB'COMPUTER'

DB0AH,0DH

COUNTEQU$-DA1

DA2DW'CO','MP','UT','ER'

DATA

ENDS試回答:(1)DA1的偏移地址是()(2)COUNT的值是()(3)DA2+5字節單元的內容是()(1)0020H(2)002AH-0020H=0AH=10(3)‘U’7、DATASEGMENT

S9DB0,1,2,3,4,5,6,7,8,9DATAENDS

LEASI,S9

LEA,DI,S9+1

MOVCX,5LOP:MOVAL,[SI]

XCHGAL,[DI]

MOV[SI],AL

ADDSI,2

ADDDI,2

LOOPLOP上述程序段運行后,S9開始的10個字節存儲單元內容是什么?(1,0,3,2,5,4,7,6,9,8)8.XDW0123H,2A3EH,89DFH

COUNTEQU$-X

YDBCOUNTDUP(0)

LEASI,X

LEADI,Y

MOVCX,COUNT

CLD

REPMOVSB程序段執行后,Y數據區各字節單元的內容是什么?Y:23H,01,3E,2A,DF,89H

9.下面程序段完成將以BUFF為首地址的內存區域全部存儲0FFH數據。請在空白處添上適當的指令(每一空白處只添一條指令)。

BUFFDB20HDUP(?)

___1__

MOVAX,0FFFFH

MOVCX,10H

___2__________

REPSTOSW(1)LEADI,BUFF(2)CLD[復習]8086/8088指令系統指令類別助記符數據傳送通用傳送輸入輸出目標地址傳送標志傳送算術運算加法減法乘法除法轉換MOV,PUSH,

POP,XCHG,XLATIN,OUTLEA,LDS,LESLAHF,SAHF,PUSHF,POPFADD,ADC,INC,

,DAASUB,SBB,DEC,NEG,CMP,

DASMUL,IMUL,DIV,IDIV,CBW,CWD邏輯指令邏輯運算移位

循環移位串處理串操作重復控制控制轉移轉移無條件轉移條件轉移循環控制過程調用中斷指令處理器控制AND,OR,XOR,NOT,TESTSHL,SAL,SHR,SARROL,ROR,RCL,RCRMOVS,CMPS,SCAS,LODS,STOSREP,REPE/REPZ,REPNE/REPNZJMPJA/JNBE,JAE/JNB,JB/JNAE,JBE/JNA,JC,JCXZ,JE/JZ,JNS,JO,JS,JG/JNLE,JGE/JNL,JL/JNGE,JLE/JNG,JNC,JNE/JNZ,JNO,JNP/JPO,JP/JPELOOP,LOOPE/LOOPZ,LOOPNE/LOOPNZCALL,RETINT,INTO,IRETCLC,STC,CMC,CLD,STD,CLI,STI,NOP,HLT,WAIT,ESC,LOCK指令類別助記符[補充內容]在DOS環境下,匯編語言可以通過DOS系統功能調用中斷(INT21H)使用輸入輸出設備。INT21H可以實現對輸入輸出設備的管理、文件管理、磁盤管理、設置日期和時間等。采用DOS功能調用方法:(以INT21H為入口)將所要調用的功能號送入AH中;根據該功能的規定將入口參數送到相應的寄存器;用INT21H

指令轉入指定子程序;運行子程序結束時按規定取得出口參數。[補充內容]1.程序結束,返回DOS狀態(功能號4CH)入口參數:

無出口參數:無功能:正常結束,返回DOS狀態,將對微機的控制權交給操作系統。一個獨立運行的程序段必須設置的結束工作命令。(尤其主程序不是用過程編寫時)調用格式:

MOVAH,4CHINT21H[補充內容]2.顯示字符串(功能號09H)入口參數:DS:DX指向要輸出的以‘$’(24H)結尾的字符串首地址。出口參數:無功能:在當前光標位置,顯示字符串,遇‘$’停止顯示,且光標右移。(‘$’不算在顯示的字符串之內)說明:字符串必須以$結束(輸出字符串)調用方法示例String db‘Hello!’,‘$‘mov ax,segString mov

ds,ax mov

dx,offsetStringmov ah,9int 21h 輸出字符串“Hello!”到顯示器●衡量程序質量的標準:(1)程序正確、完整

(2)程序的模塊化、易讀性

(3)程序的執行速度快

(4)程序所占內存空間小●匯編語言程序設計的步驟:(1)分析問題

(2)確定算法

(3)繪制流程圖

(4)分配存儲空間及工作單元(包括寄存器)

(5)根據流程圖逐條編寫程序

(6)靜態檢查5.2匯編語言程序設計

●匯編語言程序設計的方法:把系統劃分成多個模塊,模塊的詳細設計采用流程圖的方法;采用結構程序設計的方法設計程序。即程序的每一部分由若干個單元組成;每個單元包含一個有限結構集;每個結構有一個入口和一個出口(便于查錯及調試)結構程序設計有三種:順序結構、分支結構和循環結構。由特定的幾何圖形、指向線、文字說明來表示數據處理的步驟;包括:起止框、判斷框、處理框、指向線、連接框:流程圖優點:這種方法比較直觀、層次清晰、便于發現錯誤,細化后的流程圖更易于匯編語言的代碼實現。5.2匯編語言程序設計

順序程序:完全按指令書寫的前后順序執行每一條指令,是最基本、最常見的程序結構。執行順序程序的特點:指令或語句是按順序執行的,沒有分支或循環。它只有一個起始框、一個結束框和一至多個執行模塊。順序結構中的執行模塊可以是一個指令、一條語句或完成某一功能的程序。數據轉換.例[5-22]計算.例[5-23]5.2.1順序程序設計5.2匯編語言程序設計

B500HEXDATA設內存單元DATA存放一個無符號數據,編制程序將其拆開成兩位16進制數,并存入HEX和HEX+1單元的低4位,HEX存放高位16進制數,HEX+1存放低位16進制數。例題5-225.2.1順序程序設計拆開0B05例題5-22DSEGSEGMENTDATADB0B5HHEXDB0,0DSEGENDSCODESEGMENTASSUMECS:CODE,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVAL,DATAMOVAH,ALANDAL,0F0HMOVCL,04SHRAL,CLMOVHEX,ALANDAH,0FHMOVHEX+1,AHMOVAH,4CHINT21HMAINENDPCODEENDSENDSTART開始DS初始化數據送AL,副本送AH結束取高4位送HEX取低4位送HEX+15.2.1順序程序設計1500RLTYARGA例題5-235.2.1順序程序設計計算Y=5X+8,設X為無符號字節數據,且在ARGX單元存放,計算結果存入RLTY單元。SSEG SEGMENT STACK STK DB 20DUP(0)SSEG ENDS DSEG SEGMENT ARGX DB 15RLTY DW 0DSEG ENDS

CSEG SEGMENT ASSUME CS:CSEG,DS:DSEGASSUME SS:SSEG例題5-235.2.1順序程序設計CALC:MOVAX,DSEG MOV DS,AX MOV AX,SSEG MOV SS,AX MOVSP,LENGTHSTK MOVAL,ARGX MOV BL,05 MUL BL MOV BX,08 ADD AX,BX MOVRLTY,AX MOV AX,4C00H INT21HCSEGENDS END CALC開始DS,SS,SP初始化X送AL結束5X送BL5X+8送AX存結果分支程序設計5.2.2分支程序根據條件是真或假決定執行與否;判斷的條件是各種指令,如CMP、TEST等執行后形成的狀態標志;轉移指令Jcc和JMP可以實現分支控制;還可以采用MASM6.x提供的條件控制偽指令實現JCC條件成立

?分支語句體YesNo(1)單分支結構條件成立跳轉,否則順序執行分支語句體;注意選擇正確的條件轉移指令和轉移目標地址。分支程序設計5.2.2取最大值例[5-24]JCC條件成立

?分支語句體1YesNo(2)雙分支結構分支語句體2JMP條件成立跳轉執行第2個分支語句體,否則順序執行第1個分支語句體。注意第1個分支體后一定要有一個JMP指令跳到第2個分支體后。一般必須先安排比較或算術、邏輯運算等影響標志位的指令,然后用Jcc指令判斷條件,以實現分支轉移。求分段函數例[5-25]例題5-24分支程序設計5.2.2設內存中有三個互不相等的無符號字數據,分別存放在ARG開始的字單元,編制程序將其中最大值存入MAX單元。SSEG SEGMENTSTACKSTK DB20 DUP(0)SSEG ENDSDSEG SEGMENTARG DW7138H,84A6H,29EHMAX DW ?DSEG ENDS3871A6849E02--MAXARGSI::CSEG SEGMENTASSUMECS:CSEG,DS:DSEGASSUME SS:SSEGSTART:MOVAX,DSEGMOV DS,AXMOV AX,SSEGMOV SS,AXMOV SP,SIZESTKLEA SI,ARG MOV AX,[SI]

MOV BX,[SI+2]

CMP AX,BX;兩數比較

JAE FMAX1;AX中的數大

MOV AX,BX FMAX1:CMPAX,[SI+4]

JAE FMAX2;AX中的數大

MOV AX,[SI+4] FMAX2:MOVMAX,AX MOV AX,4C00HINT 21HCSEGENDSENDFSTART開始DS,SS,SP,SI初始化取第1個數送AX取第2個數送BX結束大數送AX第3個數送AX存結果AX≥BX?AX≥第3個數?NNYYDSEG SEGMENTX DW?Y DW?DSEG ENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOV DS,AXLEA SI,X MOVAX,[SI]

ANDAX,AX

JNSLP1MOVY,0FFH;X<0JMP END1LP1:JNZLP2MOV Y,00H

JMPEND1LP2:MOVY,O1HEND1:MOVAH,4CHINT 21HCSEGENDSENDFSTART編寫程序實現函數:

1(X>0)Y=0(X=0)

-1(X<0)例題5-25開始DS,SI初始化X送AX結束Y=-1AX≥0?AX=0?NNYYY=0Y=1DO-UNTIL結構

DO-WHILE結構

1.DO-WHILE結構:先判斷、后執行其特點:是進入循環后,先判斷循環控制條件。若滿足循環結束條件,則退出循環;否則,繼續執行循環體。循環體可能一次也不執行。2.DO-UNTIL結構:先執行、后判斷其特點:是進入循環后,先執行循環體,然后判斷循環控制條件。若滿足循環結束條件,則退出循環;否則,繼續執行循環體。循環體至少執行一次。這兩種結構一般可以隨習慣使用,但在初始循環次數可能為0的情況下則必須使用DO_UNTIL結構。循環程序設計1、循環的結構形式

5.2.3

循環程序一般應包括以下幾部分:①循環初始化。它包括設置循環次數的初始值、地址指針的初始設置等。

②循環體這是循環工作的主體,包括要重復執行的操作,以及循環的修改部分。修改部分包括地址指針的修改、循環控制條件的修改等。

③循環控制部分它是控制循環的關鍵,判斷循環條件滿足與否。

(一)計數控制

適用于循環次數已知的情況,假設循環次數為N,

常用方法為正計數和倒計數。1.倒計數

MOVCX,N;設置循環初值部分

……LOOPA:……;工作部分

……;修改部分

DECCX;控制部分

JNZLOOPA其中工作部分和修改部分被重復N次,當(CX)=0時結束循環。上面兩條語句可用LOOP指令代替,即:

MOVCX,NLOOPA:……LOOPLOOPA

(簡化方法)(一)計數控制

2.正計數

MOVCX,0;設置循環初值部分

……LOOPA:……;工作部分

……;修改部分

INCCX;控制部分

CMPCX,NJNZLOOPA

其中工作部分和修改部分被重復N次,當(CX)=N時結束循環.5.2.3循環程序設計內存DATA開始存放100個單字節數據。編寫程序統計這些數據內所有為

“1”的位的個數,將結果存入NUMB單元。[分析]統計每一個字節數據中“1”的個數,可以用右移指令把該數據的各位逐個移到CF中,當CF=1,計數器值加1,直到100個數據檢查完畢。2、循環程序的設計方法例題5-28152794113B...0NUMBDATASI::SSEG SEGMENTSTACKSTACKDW100DUP(0)SSEG ENDSDSEG SEGMENTASSUMECS:CSEG,DS:DSEGASSUMESS:SSEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,SSEGMOVSS,AX MOV SP,SIZESTACK MOV SI,OFFSETDATA MOV CL,100 XOR AL,AL例題5-28開始DS,SS,SP初始化外循環初始化SI,BH=0,CL=100AL右移1位SI+1,CL-1BH+1CF=1?NYNY內循環初始化CH=8數據送AHCH-1CH=0?CL=0?存結果結束NYLOOP2:MOV CH,08H XOR BH,BHMOV AH,[SI]LOOP1:ROR AH,1 JNC CHT1 INC BHCHT1:DEC CH JNZ LOOP1 INC SI DEC CL JNZ LOOP2 MOV NUMB,BH MOV AH,4CH INT 21HCSEG ENDS END START例題5-28特別要注意循環入口和循環次數的正確設置;地址指針及循環控制條件的修改等。否則會得不到期望的結果。格式:過程名

PROC屬性

……

過程名

ENDP●過程名是過程入口地址的符號表示,在整個程序中必須是唯一的。●

PROC表示過程定義開始,ENDP表示過程定義結束。過程名本質上與標號一樣,也具有3種屬性:段地址、偏移地址和類型(NEAR或FAR)。●

PROC后用關鍵字NEAR、FAR或空,以表示過程的類型(缺省為NEAR)。NEAR型子程序只可以被段內調用,而FAR型子程序可以被段間或段內調用。

一般子程序有五部分組成:子程序設計1.過程定義5.2.42.過程調用和返回

子程序的調用和返回是由設在主程序中的CALL指令和設在子程序末尾的RET指令來完成的。[復習]1.子程序調用指令CALL格式:CALLDST功能:調用子程序。執行時先把返回地址壓入堆棧,再形成子程序入口地址,最后把控制權交給子程序。功能描述:(1)返回地址進棧。 遠調用:CS與IP(下一條指令的地址)依次進棧。 近調用:IP(下一條指令的16位偏移地址)進棧。(2)轉移到過程的第1條指令去執行。 遠調用:根據操作數,將32位分段地址送CS:IP。近調用:根據操作數,將16位偏移地址送IP。

[復習]①段間直接調用: 格式:CALLFARPTR子程序名

功能:調用子程序名。

Push(CS),Push(IP)(IP)目標地址EA,(CS)目標地址的段基址,最后把控制權交給子程序。說明:這種指令使用與轉移地址有關的尋址方式中的段間直接尋址方式。②段內間接調用:格式:CALLWORDPTRDST功能:調用子程序。

PUSH(IP)(IP)(EA)(把指令指定的16位通用寄存器或內存單元的內容送給IP,最后把控制權交給子程序。)

[復習]③段間間接調用: 格式:CALLDWORDPTRDST

功能:調用子程序。

Push(CS),Push(IP)(IP)(EA)(CS)(EA+2)(把M的低字送給IP,高字送給CS,最后把控制權交給子程序。)

說明:其中M為內存的雙字長地址指針,低字部分為16位的偏移量,高字部分為段基址。2.返回指令 格式:RET

功能:按照CALL指令入棧的逆序,從棧頂彈出返回地址(彈出一個字到IP,若子程序是FAR型還需再彈出一個字到CS),然后返回到主程序繼續執行。1.過程調用與返回的類型(1)調用程序和子程序在同一個代碼段的程序結構

code segment main proc far …

調用程序 call sub1;段內調用

ret main endp sub1 proc

子程序 … ret;近返回

sub1 endp code ends

end main(子程序類型可缺省,注意END后必須跟主程序名)2.CALL指令的靈活使用desgsegmentab1dwproc1ab2dwproc2desgendscsegsegmentassumecs:cseg,ds:dsegmainprocmov

ax,desgmov

ds,axcallproc1;近調用callproc2;遠調用movah,4chint21hmainendpproc1procnear

…retproc1endpproc2procfar

…retproc2endpcsegends●近調用(NEAR型)方法:①callproc1;直接近調用

②leaax,proc1callproc1;通過R間接近調用

③callab1;通過M變量間接近調用

④leabx,ab1callwordptr[bx];通過其它M操作數間接近調用●遠調用(FAR型)方法

①callproc2;直接遠調用

②callab2;通過M變量間接遠調用

③leabx,ab2calldword

ptr[bx];通過其它M操作數間接遠調用5.2.4子程序設計●現場——主程序在調用子程序前可能在CPU寄存器和內存中存有一些有用的數據,這些數據就是調用前的現場。●現場保護——在子程序的執行過程中很可能會改表這些單元的內容。因此在子程序開始執行前,把主程序中有用的數據先保存到堆棧中,這向工作稱為現場保護。●恢復——為使子程序返回到主程序后,主程序能夠在原有環境下繼續執行,必須將現場保護時保存在堆棧中的現場數據重新恢復。2.現場的保存與恢復5.2.4子程序設計●子程序調用的方法:簡單調用嵌套調用子程序內包含有子程序的調用就是子程序嵌套沒有什么特殊要求遞歸調用:子程序直接或間接地嵌套調用自身稱為遞歸調用;含有遞歸調用的子程序稱為遞歸子程序;遞歸子程序必須采用寄存器或堆棧傳遞參數,遞歸深度受堆棧空間的限制.●子程序返回:在子程序執行完畢后,必須回到調用它的主程序。在每個子程序結束時必須有返回指令RET。3.子程序的調用和返回基本概念●入口參數(入口條件):主程序在調用子程序前,必須把這次操作中的加工處理數據傳送給子程序,這些加工處理的數據稱為入口參數。●出口參數(出口條件):當執行完返回主程序時,應該把本次操作的最終結果傳遞給主程序,這些加工處理的結果稱為出口參數。●參數傳遞:把主程序傳遞輸入參數和子程序傳遞輸出參數的過程稱為主、子程序間的參數傳遞。5.2.4子程序設計4.子程序的說明文件常用的參數傳遞方法約定寄存器法變量法堆棧法5.2.4子程序設計5.子程序的參數傳遞子程序的入口參數由主程序放入規定的寄存器帶入子程序.執行子程序后的結果也放入規定的寄存器帶回主程序。主、子程序必須按約定在指定的寄存器中取出或存入指定參數。通常某個寄存器可作存放輸入參數的寄存器,又可同時作存放輸出參數的寄存器。適用于傳遞的參數較少情況。采用的寄存器有:傳遞數據或數據地址:AL、AX、DX:AX(或EAX)傳遞16位偏移地址:SI、DI或BX,傳遞32位分段地址:DS:BX;DS:SI;DS:DI;ES:BX;ES:SI(DI)等。寄存器的選擇以方便為主,但很少使用BP來傳遞參數。[補充內容]——DOS功能調用3.從鍵盤讀入一個字符(功能號01H)入口參數:無出口參數:從鍵盤輸入的字符的ASCII碼送入AL中。調用方式:MOVAH,01HINT21H功能:等待從鍵盤輸入一個字符,并回顯在屏幕上。當檢測到^C或^Break時退出。[例]求帶符號數組ARRAY的最大值,設元素個數由變量COUNT定義,結果存入變量MAX中.5.2.4子程序設計6.程序舉例子程序名:FINDMAX功能:求帶符號數組ARRAY的最大值入口參數:存放ARRAY數組M的首地址,

元素個數出口參數:最大值MAX所用寄存器:SI存ARRAY偏移量;

CX存循環次數(1)約定寄存器法DSEGSEGMENTCOUNTDW5ARRAYDW8,-6,30,0,100MAXDW?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXLEASI,ARRAYMOVCX,COUNT

CALLFINDMAXMOVMAX,AXMOVAH,4CHINT21HFINDMAXPROCMINSW=8000HPUSHSIPUSHCXMOVAX,MINSWNEXT:CMPAX,[SI]JGSKIPMOVAX,[SI]SKIP:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論