




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1/96主要內容:一、匯編語言語句格式二、匯編語言偽指令三、匯編語言源程序的匯編與連接四、匯編語言程序設計的基本方法第4講匯編語言程序設計2/96本講重點:偽操作匯編語言程序格式
簡單匯編程序設計第4講匯編語言程序設計3/96一、匯編語言語句格式匯編語言語句有指令性語句、偽指令語句和宏指令語句三種類型。1、指令性語句:[標號:]操作碼[操作數][;注釋]是機器指令的符號表示,經匯編產生對應的機器指令代碼,在形成執(zhí)行文件時執(zhí)行。2、偽指令語句:[名字]偽指令助記符[操作數][;注釋]只是給匯編程序提供一些控制信息,幫助匯編程序正確匯編指令性語句,沒有對應的機器碼。說明:名字可以是符號常量名、變量名、過程名、段名等,名字后面不能有“:”。偽指令命令助記符共有40多個,按功能不同分成八類。操作數之間須用逗號分隔。3、宏指令語句:[宏名]宏操作助記符[操作數][;注釋]是指令性語句和指示性語句的復合體,在匯編時被展開。說明:宏名即宏指令名,是一標識符,宏名后面不能有“:”。宏操作助記符有MACRO、ENDM、LOCAL、REPT、IRP、PURGE等8個。匯編程序不區(qū)分大小寫4/96匯編語言語句統(tǒng)一格式規(guī)定
指令性語句、偽指令語句和宏指令語句的統(tǒng)一格式:[名字項]操作項[操作數項][;注釋項]1.名字項:最多由21個字符組成??捎上铝凶址M成。
①字母A~Z、a~z ②數字0~9 ③特殊符號?、·
、@、-、$等注意:名字項的第一個字符不可以是數字,必須是字母或特殊字符,但是問號本身不能單獨作為名字;如果用到特殊符號,則它必須是首字符。匯編語言的專用保留字、寄存器名、8088/8086匯編語言中的指令助記符、偽指令名、表達式中使用的運算符和屬性運算符等均不能作為名字項,否則匯編會給出錯誤信息;名字項在程序中不能重復定義。5/96(1)段屬性:可用SIG偽指令求出此屬性用于定義標號和變量的段起始地址。標號通常在代碼段CS中定義,變量通常在DS、ES和SS段中定義。(2)偏移屬性:可用OFFSET偽指令求出此屬性指出標號或變量距離段起始地址的字節(jié)數,它是一個16位的無符號數。(3)類型屬性:可用TYPE偽指令求出對標號而言,此屬性指出其引用類型,段內引用屬于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
;數據定義偽指令,在主存中開辟7個連續(xù)的字節(jié)單元,初值依次為1~7,BUFFER表示首地址7/963.操作數項操作數項可以由常量、寄存器、標號、變量或表達式等組成。(1)常量常量是沒有屬性的純數,其數值在匯編過程中被確定,并在程序運行時保持不變。分為數值常量和字符型常量。各種形式數字常量格式對照表8/96字符串常量字符串常量是用單引號或雙引號引起來的一個或多個字符。字符串常量是以各字符的ASCⅡ碼表示的。如‘A’用41H表示,字符串‘A1B2’用41H,31H,42H,32H表示。9/96常數項舉例[例5.2]SUB DH,22 ;常數22為立即數,匯編后為16HMOV BX,[SI十32H] ;常數32H作位移量DB 12H ;定義一個字節(jié)數據DW 1234H ;定義一個字數據DD 12345678H ;定義一個雙字數據DB ′9BD′ ;定義三個字節(jié)的字符串數據,在 內存中就是39H、42H、44H10/96(2)表達式及運算符算術運算符移位運算符邏輯運算符關系運算符分析運算符綜合運算符表達式由常數、寄存器、標號、變量與一些運算符組合而成,分為數字表達式和地址表達式。匯編過程中,匯編程序按照一定的優(yōu)先規(guī)則,對表達式進行計算后得到一個數值或地址,用作指令的操作數。11/96算術運算符:+(加)、-(減)、*(乘)、/(除)、MOD(求模)移位運算符:SHL(左移)、SHR(右移)可以用于數值表達式又可用于地址表達式。算術運算符和移位運算符12/96【例】算術和移位運算符進行數值表達式運算
┆NUM1 EQU 25*4–50 ;NUM1=50NUM2 EQU NUM1/7 ;NUM2=7NUM3 EQU NUM1MOD7 ;NUM3=1NUM4 EQU 0FH ┆MOV AL,NUM4SHL4 ;(AL)=11110000B表達式賦值操作符EQU有時候程序中多次出現同一個表達式,為方便起見,可以用賦值偽操作給表達式賦予一個名字。其格式如下:
Expression_nameEQUExpression此后程序中凡需要用到該表達式指出,就可以用表達式名來代替了??梢姡珽QU的引入提高了程序的可讀性,也是其容易修改。上始終的表達式可以是任何有效的操作數格式,可以是任何可求出常數值的表達式,也可以是任何有效的助記符。13/9614/96與(AND)、或(OR)、異或(XOR)、非(NOT)四種運算。由于邏輯運算是按位操作,且在匯編過程中完成,因而運算的結果仍為整數常量?!纠坑眠壿嬤\算符進行運算。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)。運算結果成立時邏輯值為真,用0FFFFH表示;關系不成立時邏輯值為假,用0表示。
【例】用關系運算符進行數值表達式運算。NUM1 EQU 10LT5;NUM1=0NUM2 EQU 0AAAAHGT7FFFH
;NUM2=0FFFFHMOV AX,‘A‘EQ41H ;0FFFFH→AXMOV BX,NUM2LTNUM1 ;0→BX關系運算符16/96把標號或變量所指存儲器地址的屬性(段、偏移量和類型)或一些特征分離出來,作為操作數使用。主要介紹3個:
SEG
運算符
OFFSET運算符
TYPE運算符分析運算符號17/96格式:SEG變量或標號功能:分離出其后變量或標號所在段的段首址?!纠恳阎獢祿螐拇鎯ζ鞯?3000H地址開始,DBUF是該段中的一個變量名。
MOVBX,SEGDBUF
匯編為:MOVBX,2300H①SEG運算符18/96格式:OFFSET變量或標號功能:分離出其后變量或標號的偏移地址。【例】已知標號START的段地址為2100H,物理地址為21200H。MOVDX,OFFSETSTART匯編為:MOVDX,0200H這條指令與指令LEADX,START功能相同。②OFFSET運算符19/96格式:TYPE變量或標號功能:分離出其后變量或標號的類型。如果是變量,將返回該變量的類型對應字節(jié)數;如果是標號,則返回代表標號類型的數值。它們之間的關系見下表所示。③TYPE運算符【例】已定義
ARRAYDB22,33指令ADDSI,TYPEARRAY匯編為:ADDSI,120/96①段屬性前綴運算符“∶”格式為:段寄存器名∶地址表達式或段名∶地址表達式或組名∶地址表達式此運算符用來表示一個標號、變量或地址表達式的段屬性?!纠坑枚吻熬Y指定附加段內操作數的地址MOVAL,ES∶DATA;指令源操作數在附加段DATA地址單元中(5)綜合運算符21/96②LOW和HIGH格式為:
LOW表達式 或HIGH表達式此運算符用于對一個16位數據或地址表達式,用HIGH取其高位字節(jié)、LOW取其低位字節(jié)。所以此運算符又稱為字節(jié)分離運算符?!纠恳阎猂ESULTEQU7788H則 MOVAH,HIGHRESULT 匯編為:MOVAH,77H MOVAL,LOWRESULT 匯編為:MOVAL,88H(5)綜合運算符22/96本節(jié)介紹了幾種常用的運算符。為了正確計算表達式的數值,應該按照運算符的優(yōu)先級:
先高后低、自左向右(優(yōu)先級相同時)地進行計算。括號內的表達式應優(yōu)先計算。下面給出相關運算符從高到低的優(yōu)先級排列順序:表達式及運算符小結23/96(在圓括號中的項),[方括號中的項],〈結構變量(變量、字段)〉
LENGTH,SIZE、WIDTH和MASK操作符,WIDTH和MASK是作用于記錄類型的兩個專用保留字,利用它們可得到記錄類型的不同屬性PTR,OFFSET,SEG,TYPE,THIS及段運算符
HIGH和LOW*,/,MOD,SHL(左移),SHR(右移)+,-
EQ,NE,LT,LE,GT,GENOTANDOR,XORSHORT表達式及運算符小結高低24/964.注釋項一行語句分號后面的內容,主要用來說明程序或語句功能,增加程序的可讀性。對于較大的程序,注釋項更不能缺少。分號(;)放在語句后,用來說明該語句的功能;分號放在某一行的開頭,用來說明下面一段程序的功能;分號加到指令前,可暫時凍結有疑問的指令,調試正確后,再把這些指令解凍或刪除,這樣可減少語句增、刪的編輯工作。
25/96
MOVCX,0 ;傳送指令,具有2個操作數DELAY: NOP;空操作指令,沒有操作數,帶有標號
LOOPDELAY
;循環(huán)指令,標號DELAY說明轉移位置BUFFER DB1,2,3,4,5,6,7
;數據定義偽指令,在主存中開辟7個連續(xù)的字節(jié)單元,初值依次為1~7,BUFFER表示首地址匯編語言語句實例26/96本節(jié)小結匯編語言指令格式[名字項]操作項[操作數項][;注釋項]標號和變量的屬性:
段屬性、偏移屬性、類型屬性操作數的表達形式
算術、移位、邏輯、關系、屬性、綜合運算符首頁27/96二、匯編語言偽指令偽指令:在匯編程序對源程序匯編期間由匯編程序處理的操作(不是真正執(zhí)行的指令),可以完成處理器選擇、定義程序模式、定義數據、分配存儲區(qū)、指示程序結束等功能。常用偽指令:處理器選擇偽指令;段定義偽指令程序開始與結束偽指令;數據定義與存儲器分配偽指令;賦值偽指令;地址計數器與對準偽指令;基數控制偽指令;偶地址對準偽指令;28/961.處理器選擇偽操作.8086
選擇8086指令系統(tǒng).286
選擇80286指令系統(tǒng).286P
選擇保護模式下的80286指令系統(tǒng).386
選擇80386指令系統(tǒng).386P
選擇保護模式下的80386指令系統(tǒng).486
選擇80486指令系統(tǒng).486P
選擇保護模式下的80486指令系統(tǒng).586
選擇Pentium指令系統(tǒng).586P
選擇保護模式下的Pentium指令系統(tǒng)一般放在整個程序的最前面。默認值為.808629/962.段定義偽指令完整的匯編語言源程序由段組成一個匯編語言源程序可以包含若干個代碼段、數據段、附加段或堆棧段,段與段之間的順序可隨意排列。需獨立運行的程序必須包含一個代碼段,并指示程序執(zhí)行的起始點,一個程序只有一個起始點所有的可執(zhí)行性語句必須位于某一個代碼段內,說明性語句可根據需要位于任一段內通常,程序還需要一個堆棧段30/962.段定義偽操作源程序分別用兩種格式書寫第一種格式從MASM5.0開始支持簡化段定義格式第二種格式MASM5.0以前就具有完整段定義格式Hello,Everybody!程序功能31/96;EXAMPLE5.42 ;程序注釋;…………………數據段說明2DATASEGMENT; 數據段
┇3 DATAENDS;…………………堆棧段說明STACKSEGMENTPARASTACK′STACK′;堆棧段
┇5 STACKENDS;……………代碼段說明6 CODESEGMENT ;代碼段7 STARTPROCFAR ;遠過程調用定義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 ;代碼段結束;………18 ENDSTART ;匯編到此結束33/96;EXAMPLE5.42 ;程序注釋;…………………數據段說明2DATASEGMENT; 數據段
┇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調用功能返回操作系統(tǒng)16 INT 21H;………………17 CODEENDS;………18 ENDSTART35/96;lt401b.asm(文件名)stack segmentstack ;定義堆棧段
dw512dup(?) ;堆棧段有512字(1024字節(jié))空間stack ends ;堆棧段結束data segment ;定義數據段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 ;利用功能調用返回DOScode ends ;代碼段結束
endstart ;匯編結束,同時指明程序起始點【例】完整段定義格式舉例(續(xù))37/96;SampleC.ASM
.modelsmall;存儲模型(各段在存儲器中的存放方式) .stack 100H ;定義堆棧段
.data ... ;在數據段定義數據
.codestart:movax,@data movds,ax
... ;在代碼段填入指令序列
movax,4c00h int21h
... ;子程序代碼
endstart簡化段定義格式(
MASM5.x支持)38/96;lt401a.asm(文件名)
.modelsmall ;定義程序的存儲模式
.stack ;定義堆棧段
.data ;定義數據段string db’Hello,Everybody!’,0dh,0ah,’$’
;在數據段定義要顯示的字符串
.code ;定義代碼段start:movax,@data ;程序起始點,建立DS、SS movds,ax
movdx,offsetstring ;指定字符串
movah,9 int21h
;利用功能調用顯示信息
movax,4c00h ;程序結束點,返回DOS int21h end ;匯編結束【例】簡化段定義格式舉例(
MASM5.x支持)39/96;SampleA.ASM.modelsmall.stack.data
... ;在數據段定義數據.code
.startup
;(定義程序初始入口點)
... ;在代碼段填入指令序列
.exit0
;(返回操作系統(tǒng))
... ;子程序代碼
end
;(源程序結束)簡化段定義格式(MASM6.x支持)注意:簡化段定義比完整段格式簡單得多。但完整段定義可以全面地說明段的各種類型與屬性,因此在很多情況下仍需使用。40/96(1)程序開始偽指令此指令指明程序模塊的開始,并定義模塊名。指令格式:NAME模塊名或TITLE標題名程序中若缺省該偽指令,則取TITLE語句中的頁標題前6個字符;若沒有TITLE語句,則取源程序文件名為模塊名。(2)源程序結束偽指令此指令指明匯編語言程序模塊的結束。指令格式:END[標號]標號指示程序的起始地址。多個程序模塊連接時,只有主程序需要使用標號,其他子程序模塊則不必指定標號。3.程序開始和結束偽指令41/964.數據定義及存儲器分配偽指令指令格式:[變量名]助記符〈表達式〉[;注釋]功能:從變量名所代表的地址單元開始定義數據存儲區(qū),類型由數據定義偽指令確定,。[變量名]DB〈表達式〉;定義字節(jié)變量。[變量名]DW〈表達式〉;定義字變量。[變量名]DD〈表達式〉;定義雙字變量。[變量名]DQ〈表達式〉;定義四字變量。[變量名]DT〈表達式〉;定義十字節(jié)變量。42/96表達式項是給變量或指定存儲單元賦予初值,它有以下幾種形式:(1)數值表達式(2)字符串表達式:以單引號括起,存放為ASCII碼(3)?表達式:保留存儲空間,但不存入數據(4)帶DUP的表達式:數組表達式4.數據定義及存儲器分配偽指令表達式的形式43/96【例】操作數為常數或表達式DATA_BYTEDB 15,8,15HDATA_WORDDW200,200H,-10DATA_DWDD4*30,0AFFDH44/96【例】操作數為字符串STR1DB'Hello'STR2DB'ABC'STR3DW'AB','CD'注意:不能寫成DB‘ABCD’45/96【例】操作數為?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 ;數據段X db'a',-5 db2dup(100),?Y db'ABC'data ends字節(jié)單元定義實例應用48/96LEAAX,X;AX←0000H,在數據定義偽指令前面的變量的值,是該偽指令中的第一個數據項在當前段內的第一個字節(jié)的偏移地址。MOVAL,X;此處X表示它的第1個數據,故AL←'a'DECX+1;對X為始的第2個數據減1,故成為-6MOVY,AL;現在Y這個字符串成為'aBC'字節(jié)變量的應用49/965.表達式賦值偽操作利用一個標識符表達的一個數值。MASM提供等價機制,用于常量定義等價EQU偽指令符號名EQU數值表達式符號名EQU<字符串>等號=偽指令符號名=數值表達式常數若使用有意義的符號名來表示,可以提高程序的可讀性,同時更具有通用性EQU和=的區(qū)別:EQU偽操作中的標號名是不允許重復定義的;“=”
偽操作是允許重復定義的。50/96表達式名EQU表達式ALPHAEQU9BETAEQUALPHA+18BBEQU[BP+8]“=”偽操作(允許重復定義)……EMP=7……EMP=EMP+1……◆表達式賦值偽操作:51/96符號定義
DosWriteChar equ 2 CarriageReturn = 13 CallDOS equ <int21h>符號應用(左邊程序段等價右側的符號形式)
movah,2 ;movah,DosWriteChar movdl,13 ;movdl,CarriageReturn int21h ;CallDOS符號常數實例52/966.地址計數器與對準偽操作定位偽指令控制數據的偏移地址ORG
參數;將當前偏移地址指針指向參數表達的偏移地址:ORG100h ;從100h處安排數據或程序ORG$+10;使偏移地址加10,即跳過10個字節(jié)空間MASM中,符號“$”表示當前偏移地址值EVEN ;從偶地址開始ALIGNn ;從n的整數倍地址開始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
假設匯編時ARRAY分配的偏移地址為0074H,則匯編后,$+4所在的兩個字單元:
(ARRAY+4)=0078+4=007CH
(ARRAY+0A)=007E+4=0082H
地址操作符實例55/961.設X和X+2單元的內容為雙精度數P,Y和Y+2單元的內容為雙精度數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.假設程序中的數據定義如下,
PARTNO DW ?
PNAME
DB 16DUP(?)
COUNT
DD ?
PLENTH EQU $-PARTNO
問PLENTH的值為多少?57/963.給出賦值語句如下:
ALPHA EQU100
BETA EQU25
GAMMA EQU2
下列表達式的值是多少?
(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.對于下面的數據定義,各條MOV指令單獨執(zhí)行后,有關寄存器的內容是什么?
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é)重點掌握:1)DB、DW、DD、DQ、DT功能2)EQU、ORG、END、EVEN偽指令功能3)段定義偽指令SEGMENT/ENDS4)過程定義偽指令作業(yè):P1425,6,10,11首頁60/96四、簡單匯編語言程序設計一、順序程序設計
計算機執(zhí)行程序的方式是“從頭到尾”,逐條順序執(zhí)行指令語句,直到程序結束。 例5.1:把BUF開始的兩個字節(jié)單元中的壓縮BCD數相加,結果存入字單元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 ;取加數ADD AL,[BX+1] ;做二進制加法DAA ;調整為十進制結果LAHF ;(AH)←(PSW低字節(jié))AND AH,01H ;取CF位MOV RES,AX ;存結果MOV AH,4CHINT 21HCODE ENDS END START61/961.順序程序設計例:試編寫一程序計算以下表達式的值。 w=(v-(x*y+z-540))/x
式中x、y、z、v均為有符號字數據。設x、y、z、v的值存放在字變量X、Y、Z、V中,結果存放在雙字變量W之中,程序的流程圖如圖4.1所示。圖4.1順序運算程序流程圖62/96DATA SEGMENT ;數據段 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,指定數據段段名
MOV AX,X IMUL Y ;(X)*(Y)→DX:AX MOV CX,AX MOV BX,DX;(DX:AX)→(BX:CX)
MOV AX,Z CWD ;(Z)符號擴展,在(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)符號擴展
SUBAX,CX SBBDX,BX;(DX:AX)-(BX:CX)→(DX:AX)
IDIVX ;(DX:AX)/X MOVW,AX ;商→W MOV W+2,DX ;余數DX→W+2
MOV AH,4CH ;返回DOS
INT 21HCODE ENDS ; END START例:源程序(3):2.分支程序設計方法程序的分支一般用條件轉移指令來產生,利用轉移指令不影響條件碼的特性,連續(xù)地使用條件轉移指令可使程序產生多個不同的分支。
【例4-16】判斷方程是否有實根,如有實根,則將字節(jié)變量tag置1,否則置0.(見書)【例4-17】見書【例4-18】見書65/9666/962.分支程序設計方式(2):串操作NAME EXAM3 ;將內存中以STRI1為首址數據傳送到以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 ;數據段地址裝填
MOV ES,AX ;附加段地址裝填
MOV SP,TOP ;送堆棧指針
MOVCX,COUNT ;送串長MOVSI,OFFSETSTRI1;送STRI1地址指針MOVDI,OFFSETSTRI2;送STRI2地址指針
CLD ;正向CMPSI,DI ;兩串首地址比較JARES ;(SI)>(DI),轉移ADDSI,COUNT-1 ;源塊尾址ADDDI,COUNT-1 ;目的塊尾址STD ;反向RES: REPMOVSB ;數據塊傳送
MOVAH,4CH INT21H ;返回DOSCODE ENDS ENDSTART67/963.循環(huán)程序設計
循環(huán)程序是強制計算機重復執(zhí)行某一指令系列的一種程序結構形式。
1、循環(huán)程序的構成
循環(huán)初始部分:為進入循環(huán)做必要的準備工作;循環(huán)體:是程序中重復執(zhí)行的程序段循環(huán)控制部分:為進入下一次循環(huán),修改地址指針、計數器內容等項參數;檢測循環(huán)是否已執(zhí)行了規(guī)定的次數,從而確定繼續(xù)循環(huán)還是結束循環(huán)。循環(huán)結束部分:進行循環(huán)之后的處理。68/963.循環(huán)程序設計
2、控制循環(huán)次數的方法:
1)計數控制循環(huán):對于循環(huán)次數已知的程序,或是在進入循環(huán)前可由某變量確定循環(huán)次數的程序,通常用計數器來控制循環(huán)。例5.4:把BUF開始的10個字節(jié)單元中的二進制數據累加,求得的和放到RES字單元。69/96例:計數控制循環(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 ;置計數器初值MOVBX,OFFSETBUF;置地址指針LP:ADDAL,[BX] ;取一個數累加到AL上ADCAH,0 INCBX ;地址加1
LOOPLP
;不為0,循環(huán)MOVRES,AX ;傳送結果MOVAH,4CH;返回DOSINT21HCODE ENDS70/96例:條件控制循環(huán)2)用條件控制循環(huán):適用于某些循環(huán)次數未知的程序,或循環(huán)次數可變的程序,可以由問題給出的條件控制循環(huán)結束。例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開始結束N71/96例:條件控制循環(huán)
CMPAX,00C8H;和數大于200?JNAA1 ;不大于,繼續(xù)A2:INT03H;單步中斷CODEENDS ENDSTARTSTACKSEGMENGSTACK DW64DUP(?)STACKENDSCODESEGMENT ASSUMECS:CODESTART:MOVDX,0001H MOVBL,02HA1: MOVAL,BL INCBL MULBL ;(AL)*(BL) ADDDX,AX ;保存和數72/964.子程序設計
子程序是具有獨立功能的程序模塊,可供程序其它地方需要時調用。在匯編語言中,子程序又稱過程。子程序的執(zhí)行過程:
保護現場(一些將在子程序運行時將要被破壞的寄存器的內容)。依入口參數從指定位置取要加工處理的信息。加工處理。依出口參數向指定位置送經加工處理后的結果信息。返回調用程序。73/96(1)子程序(過程)的定義指令格式:過程名PROC[NEAR]或[FAR]
┇ 過程名ENDP注意:
1)PROC和ENDP必須成對使用。2)過程名是自定義符,可以作為標號被指令CALL調用。調用格式:CALL過程名3)過程由RET指令返回,返回調用程序的操作與過程的屬性有關。NEAR型過程屬于段內調用,則RET是段內返回;FAR型過程屬于段間調用,RET是段間返回。系統(tǒng)設定的缺省類型為NEAR。74/96(2)子程序應用舉例
例5.6求無符號字節(jié)序列中的最大值和最小值。設有一字節(jié)序列,其存儲首址為BUF,字節(jié)數為COUNT。利用子程序的方法編程求出該序列中的最大值和最小值。N主程序數據首址→SI序列的字節(jié)個數→CX調用求最大最小值子程序子程序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開始結束開始75/96例:程序清單:
;出口:(AH)=大數;(AL)=小數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
;調用判斷最大和最小值的子程序
INT03HBRANCHPROCNEAR JCXZA4 ;(CX)=0則退出
PUSHSI ;保護現場
PUSHCX PUSHBX MOVBH,[SI];取源數據到BH中
MOVBL,BH;存入BL中A1: LODSB ;取SI指向的單元中的數據到AL中
CMPAL,BH;AL和BH中的數據比較
JBEA2 ;(AL)<(BH),則轉移
MOVBH,AL ;存大數到BH中
JMPA3 ;跳轉到A3標號A2: CMPAL,BL ;AL和BL中的數據比較
JAEA3 ;(AL)>(BL),則轉移
MOVBL,AL ;存小數到BL中A3: LOOPA1 ;比較完否?
MOVAX,BX;大數存AH中,小數存AL中
POPBX ;恢復現場
POPCXA4: RETBRANCHENDPCODEENDS ENDSTART76/96本節(jié)小結匯編語言程序結構一般分為順序、分支、循環(huán)和子程序幾種。分支程序一般根據有條件轉移指令進行轉移判斷,根據條件可以形成二分支及多分支轉移。循環(huán)程序要注意循環(huán)的條件的選擇,一般有計數器控制和條件控制兩種循環(huán)模式。串操作是循環(huán)的一種簡便模式。學習中要多參考例題,多模仿,多訓練首頁77/965.宏指令5.4.1宏定義偽指令匯編語言程序設計中,當多處使用一組功能相同的程序段,而只是每次參與操作的參數不同時,就可以用宏指令將這段程序定義為一個宏名字。宏名可以當作指令使用,匯編過程中,匯編程序將它所代表的源程序重現在宏名字處。1.宏定義用于將程序中重復出現的一組語句定義為一條宏指令,并確定形式參數。指令格式如下:宏指令名MACRO[形式參數1,形式參數2…,]
┇}宏體
ENDM78/96注意:宏指令名是用戶自定義符號,它可以作為一條指令,直接用在匯編語言程序中。形式參數是可選項,簡稱形參或啞參數。宏體是一段可重復引用的指令序列。宏指令必須先定義后調用。宏定義可以嵌套。[例5.31]用宏指令定義兩個字節(jié)數相加,結果存入RESULT單元的操作。宏定義:ADDMMACROOPR1,OPR2,RESULT ;形參是OPR1,OPR2,RESULT MOVAL,OPR1ADDAL,OPR2MOVRESULT,ALENDM(1)宏定義79/96宏調用:在匯編語言程序中,使用宏指令稱為宏調用。宏調用格式為:宏指令名[〈實在參數1〉,〈實在參數2〉,…]宏展開:源程序匯編時,在引用宏名的地方插入宏體。即用宏體取代源程序中的宏指令名,并用實參取代宏定義中的形參。(2)宏調用與宏展開80/96[例5.32]將例5.31中的宏定義進行宏調用、宏展開操作如下:宏調用:
┇ 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)宏調用與宏展開第二組宏展開第一組宏展開81/96注意:
通常實參和形參應一一對應,如果實參個數少于形參,多余的形參作為“空”處理,反之忽略多余的實參。實參可以是空(無實參)、常數、指令操作碼、字符串、寄存器等。當宏定義中形參有前綴“&”符號時,表示宏展開將把“&”前后兩個符號合并為一個符號,它可以是操作碼、操作數或字符串。(2)宏調用與宏展開82/96(3)宏指令舉例習題13.請設計程序,將存儲器單元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)宏指令舉例習題13.請設計程序,將存儲器單元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
MOVDI,2200HMOVCX,11HMOVAL,00H CALLZOFMOVMOVDI,2250HMOVCX,11H MOVAL,01HCALLZOFMOV
MOVDI,22A0HMOVCX,11HMOVAL,55HCALLZOFMOV
RETSTARTENDPZOFMOVPROCNEAR CLD REPSTOSB RETZOFMOVENDPCSEGENDSENDSTART84/96(1)宏指令的執(zhí)行過程是宏匯編程序實現宏體替換宏指令的過程;子程序的調用過程是CPU執(zhí)行CALL指令的過程。(2)使用宏指令不能縮短目標代碼的長度;使用子程序能縮短目標代碼長度,從而節(jié)省內存空間。(3)使用宏指令不需要保護(恢復)程序的斷點和現場,執(zhí)行速度快;子程序的調用過程則必須進行這些操作,耗費CPU的時間,執(zhí)行速度慢。(4)每次宏調用允許修改參數,使同一條宏指令在各次調用過程中完成不同的操作;子程序被定義后,一般不允許修改,缺乏靈活性。由此可見,根據計算機資源和不同軟件的要求,當需要多次執(zhí)行的程序段比較長,對速度要求不很高,并且不要求修改參數的情況下,可以采用子程序(過程)調用方式,否則宜采用宏調用方式。(4)宏指令與子程序(過程)的區(qū)別85/96
IBMPC的BIOS調用和DOS系統(tǒng)功能調用BIOS是BASICINPUT/OUTPUTSYSTEM的縮寫,即基本輸入/輸出系統(tǒng),指固化在ROM中的一組程序,又稱ROMBIOS。BIOS提供了最低,最直接的硬件控制,是硬件與軟件之間的接口。BIOS主要包括以下一些功能:系統(tǒng)自檢及初始化。例如,系統(tǒng)加電啟動時對硬件進行檢測;對外部設備進行初始化;設置中斷向量;引導操作系統(tǒng)等。系統(tǒng)服務。為操作系統(tǒng)和應用程序提供系統(tǒng)服務,這些服務主要與I/O設備有關,如讀取鍵盤輸入等。為了完成這些操作,BIOS必須直接與I/O設備打交道,它通過端口與I/O設備之間傳送數據,使應用程序脫離具體的硬件操作。硬件中斷處理。提供硬件中斷服務程序。圖是用戶程序和操作系統(tǒng)關系示意圖,由圖可見,BIOS程序直接建立在硬件基礎上,磁盤操作系統(tǒng)(DOS)和其他操作系統(tǒng)建立在BIOS基礎上,各種高級語言則建立在操作系統(tǒng)基礎上。用戶程序可以使用高級語言,也可以調用DOS或其他操作系統(tǒng),還可以調用BIOS,甚至直接指揮硬件設備。86/96通常,應用程序調用DOS提供的系統(tǒng)功能,完成輸入/輸出或其他操作,這樣做用戶可以少考慮硬件,實現起來容易。應用程序直接對硬件編程的優(yōu)點是程序的效率高,缺點是需要程序員對硬件性能有較深的了解,編程復雜,所以一般不直接對硬件編程。BIOS中斷程序處于DOS功能調用和硬件環(huán)境之間,和DOS功能調用相比,其優(yōu)點是效率高,缺點是編程相對復雜;和直接對硬件編程相比,優(yōu)點是實現相對容易,缺點是效率相對低。在下列情況下可考慮使用BIOS中斷。(1)有些功能DOS沒有提供,但BIOS提供了;(2)有些場合無法使用DOS功能調用;(3)其他原因。
87/96BIOS中斷調用方法BIOS的調用就是人們借用每一臺計算機中BIOS固有的I/O操作程序來方便地解決自己的問題,由于它已經在計算機中了,因此人們不必再把它寫入自己的程序,只要指明它的操作位置就可以了。1)BIOS調用的基本操作由于BIOS中的每一種功能調用往往包含不同的幾個操作細節(jié),所以調用時需要說明三部分,基本步驟為:(1)設置分功能號:按實現的操作功能的要求,給指定寄存器(通常為AH)送入分功能號。88/96(2)置入口參數:按操作要求,給寄存器填寫相應參數的內容(某些調用無參數)。(3)使用中斷語句INTn:執(zhí)行調用的功能,其中n為中斷號。(4)分析出口參數。例如 MOV AH,0 ;分功能號為0 MOV AL,10H ;置入口參數 INT 1AH ;1AH為中斷號,功能為讀時間計數器的值注意:某些BIOS調用可能沒有出口參數,這時省略第(4)步操作。89/962)BIOS打印功能BIOSI7H號中斷指令提供了由AH寄存器指定的三種不同的操作。(1)BIOS中斷17H號的功能0是打印一個字符。要打印輸出的字符放在AL中,打印機號放在DX中,BIOS最多允許連接三臺打印機,機號分別為0,1和2。如果只有一臺打印機,那么就是0號打印機,打印機的狀態(tài)信息被回送到AH寄存器。MOV AH,0 ;請求打印MOV AL,CHAR ;寫入打印字符MOV DX,0 ;設置0#打印口INT 17H ;調用BIOS90/96(2)17H號的功能1是初始化打印機并回送打印機狀態(tài)到AH寄存器。如果把打印機開關關上然后又打開,打印機各部分就復位到初始值。此功能和打開打印機時的作用一樣。在每個程序的初始化部分可以用17H號的功能1來初始化打印機。MOV AH,01 ;初始化打印機MOV DX,0 ;設置0#打印口INT 17H ;調用BIOS這個操作要發(fā)送一個換頁符,因此,這個操作能把打印機頭設置在一頁的頂部。對于大多數打印機,只要一接通電源,就會自動地初始化打印機。91/96AH=0EH
這個子程序
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設備出售外貿合同范本
- 借用房租合同范本
- 信息技術服務合同認定流程
- 心理社團心理健康活動策劃
- 一年級上冊寫字課堂活動計劃
- 食品安全監(jiān)督服務承諾措施
- 保險業(yè)務流程再造與優(yōu)化計劃
- 2025年二手房買賣合同附加協(xié)議手冊
- 2025年汽車租賃合同屆滿退出協(xié)議范本
- 2025年網絡安全防護服務合同案例
- 大眾汽車使用說明書
- (高清版)DZT 0145-2017 土壤地球化學測量規(guī)程
- 供熱公司安全教育知識
- 高中英語課程綱要
- 《藥物設計學》課件
- 隨機微分方程
- 道路設施施工現場安全管理基本要求
- 公寓樓改造裝修施工方案
- 煙臺大學化學化工學院實驗室儀器設備搬遷項目
- 安全生產管理組織架構圖
- 2022版10kV架空配電線路無人機自主巡檢作業(yè)導則
評論
0/150
提交評論