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

下載本文檔

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

文檔簡(jiǎn)介

第四章匯編語言程序格式§4.1匯編語言語句種類及格式§4.2偽操作§4.4匯編語言的上機(jī)過程§4.1匯編語言語句種類及格式指令語句偽指令語句宏指令一、指令語句使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處理的語句,就是第2章學(xué)習(xí)的處理器指令書寫格式

[標(biāo)號(hào):]指令助記符[DEST[,SRC]][;注釋] 標(biāo)號(hào):一條指令的符號(hào)地址??梢允÷裕缬斜仨氁浴埃骸弊鳛榻Y(jié)束標(biāo)志。在程序段或子程序段的第一條指令處可使用標(biāo)號(hào),以在程序需要時(shí)轉(zhuǎn)移到該處時(shí),以標(biāo)號(hào)的形式引用。二、偽指令語句(Directive)——不產(chǎn)生CPU動(dòng)作、在程序執(zhí)行前由匯編程序處理的說明性語句,例如,數(shù)據(jù)說明、變量定義等等偽指令與具體的處理器類型無關(guān),但與匯編程序的版本有關(guān)[名字]偽指令[操作數(shù)][;注釋]偽指令語句—格式說明符號(hào)名字段:與標(biāo)號(hào)相區(qū)別,不帶“:”可以是常量名、變量名、過程名、結(jié)構(gòu)名、記錄名等可視為指令語句中的操作數(shù)(如符號(hào)名就表示一個(gè)常量或存儲(chǔ)地址命名規(guī)則與標(biāo)號(hào)相同偽指令字段:規(guī)定這條語句要求匯編程序完成的具體操作§4.2偽操作一、數(shù)據(jù)定義及存儲(chǔ)器分配偽操作二、表達(dá)式賦值偽操作三、段定義偽操作四、程序開始和結(jié)束偽操作五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作六、基數(shù)控制偽操作七、處理器選擇偽操作一、數(shù)據(jù)定義及存儲(chǔ)器分配偽操作變量:代表存儲(chǔ)在某些存儲(chǔ)單元中的數(shù)據(jù),在程序運(yùn)行期間可以修改;對(duì)變量的訪問以變量名的形式進(jìn)行;可認(rèn)為變量名為存儲(chǔ)單元的符號(hào)地址變量的定義與預(yù)置 由數(shù)據(jù)定義偽操作完成分配存儲(chǔ)單元起名字賦初值一、數(shù)據(jù)定義偽指令的格式變量名DBDWDDDQ表達(dá)式1,表達(dá)式2,…段屬性(SEG):表示變量存放在哪個(gè)邏輯段中,訪問時(shí)要使之成為當(dāng)前段偏移量屬性(OFFSET):表示變量在所屬邏輯段中距起始點(diǎn)的距離類型屬性(TYPE):表示變量所占字節(jié)數(shù)一、數(shù)據(jù)定義偽指令(表達(dá)式)數(shù)值表達(dá)式 D1DB12H,34H,56H(D1)=12H,(D1+1)=34H,(D1+2)=56HD2DW1234H,5678H(D2)=1234H,(D1+2)=5678H?表達(dá)式:表示該單元的內(nèi)容任意D3DB?,? ;表示分配2個(gè)字節(jié)D4DW?,? ;表示分配2個(gè)字一、數(shù)據(jù)定義偽指令(表達(dá)式)帶DUP的表達(dá)式變量名DBDWDDDQ表達(dá)式1DUP(表達(dá)式2) D1DB20HDUP(?) ;預(yù)留20H個(gè)字節(jié),內(nèi)容任意次數(shù)內(nèi)容 D2DB10HDUP(‘ABCD’) ;重復(fù)10H個(gè)‘ABCD’,共占40H字節(jié) D3DW10HDUP(4) ;重復(fù)10H個(gè)字單元,內(nèi)容0004H,共占20H字節(jié)一、數(shù)據(jù)定義偽指令(表達(dá)式)帶DUP的表達(dá)式—DUP操作符可重復(fù)使用 D4DB10HDUP(4DUP(2),7)

;重復(fù)10H個(gè)(2,2,2,2,7),共占50H字節(jié)標(biāo)號(hào)指令的符號(hào)地址段屬性(SEG)偏移量屬性(OFFSET)距離屬性(Distance類型):表示標(biāo)號(hào)的轉(zhuǎn)移特性類型: NEAR:本標(biāo)號(hào)只能被標(biāo)號(hào)所在段的指令訪問(段內(nèi)轉(zhuǎn) 移、調(diào)用)

FAR:可被其他段的指令訪問(段間調(diào)用、轉(zhuǎn)移)標(biāo)號(hào)設(shè)置標(biāo)號(hào)距離屬性的方法

2)用LABEL偽指令賦予標(biāo)號(hào)距離屬性

名稱LABEL類型SEGOFFSETDistance 標(biāo)識(shí)符標(biāo)號(hào)NEAR/FAR BYTE/WORD 變量 /Type

該偽指令一般與指令語句/數(shù)據(jù)定義偽指令連用,以補(bǔ)充或設(shè)置與值連用的標(biāo)號(hào)/變量的距離/類型屬性設(shè)置標(biāo)號(hào)距離屬性的方法(例1)

SUB1: MOVAL,30H標(biāo)識(shí)符SUB1_FAR SUB1 均為指令的符號(hào)地址,他們具有SEG OFFSET 相同的屬性,但Distance屬性不同SUB1_FAR:FARSUB1:NEAR

段內(nèi)轉(zhuǎn)移/調(diào)用:

SUB1

SUB1_FAR LABELFAR

段間轉(zhuǎn)移/調(diào)用:

SUB1_FAR設(shè)置變量類型屬性的方法(例2)

D_WORD DW20HDUP(?)D_BYTE D_WORD 均為變量名,他們具有相同的SEG OFFSET 屬性,但TYPE屬性不同D_BYTE:BYTED_WORD:WORD

利用D_WORD無法取出數(shù)組中的某字節(jié)

MOV AL,D_WORD+4 ×

D_BYTE LABELBYTE

MOV AL,D_BYTE+4變量的使用—在偽指令語句中DATASEGMENT DA1 DB12HNUM DB75HHARRAYDW20HDUP(0)ADR1DWNUMADR2DDNUMADR3DWARRAY[2] ……DS=21FDH127500210100FDDA1NUMARRAYADR1ADR2ADR30001000004

DW:定義的存儲(chǔ)單元存放相應(yīng)變量的偏移量DD:定義的存儲(chǔ)單元存放相應(yīng)變量的偏移量和段基值不能使用DBN二、表達(dá)式賦值偽操作等值語句符號(hào)EQU表達(dá)式;將表達(dá)式的值賦給左邊的符號(hào)表達(dá)式的形式1)常數(shù)或數(shù)值表達(dá)式

CNTEQU5 NUMEQU13+5+4 2)址表達(dá)式

ADR1EQUDS:[BP+14] 3)變量、標(biāo)號(hào)或指令助記符

W0EQUWORDPTRDA_BYTE

等值語句僅在匯編源程序時(shí)作為替代符號(hào)用,不產(chǎn)生任何目標(biāo)代碼,不占存儲(chǔ)單元在同一程序中,同一符號(hào)不能用EQU重復(fù)定義二、表達(dá)式賦值偽操作等值語句符號(hào)=表達(dá)式;功能與EQU相同,但可重復(fù)定義

CNT=5 NUM=4 …… NUM=NUM+10H CBD=DDA …… CBD=ADD運(yùn)算符算術(shù)操作(運(yùn)算)符邏輯操作(運(yùn)算)符關(guān)系操作(運(yùn)算)符數(shù)值返回操作(運(yùn)算)符屬性修改操作(運(yùn)算)符 運(yùn)算符運(yùn)算符—算術(shù)運(yùn)算符+-*/MODSHRSHL[]實(shí)現(xiàn)加、減、乘、除、取模、移位的運(yùn)算

MOVAX,3*4+5 ;等價(jià)于MOVAX,17其中MOD也稱為取模,它產(chǎn)生除法之后的余數(shù),如19mod7=5加+和減-運(yùn)算符還可以用于地址表達(dá)式表達(dá)式SHR/SHLCNT除加、減外,其他運(yùn)算符的參數(shù)必須是整數(shù)算術(shù)運(yùn)算符—例NUM =11011011B MOVAL,NUMSHL3 MOVAL,11011000B MOVBL,NUMSHR2 MOVAL,00110110B ADDDL,NUMSHR6 ADDDL,00000011B MOVAL,ARRAY[BX][SI] MOVAL,ARRAY[BX+SI]運(yùn)算符—關(guān)系運(yùn)算符EQNEGTLTGELE用于比較和測(cè)試符號(hào)數(shù)值表達(dá)式1 關(guān)系運(yùn)算符表達(dá)式2表達(dá)式為常數(shù)時(shí),按無符號(hào)數(shù)進(jìn)行比較表達(dá)式為變量(同段內(nèi))時(shí),比較其偏移量MASM用0FFH/0FFFFH(補(bǔ)碼-1)表示條件為真MASM用0000H表示條件為假運(yùn)算符—關(guān)系運(yùn)算符(舉例)MOVAX,0FHEQ1111B ←→MOVAX,0FFFFHMOVBX,0FHNE1111B ←→ MOVBX,0VARDWNUMLT0ABH;當(dāng)已定義的常數(shù)NUM小于ABH時(shí),則VAR←0FFH運(yùn)算符—數(shù)值返回運(yùn)算符操作對(duì)象:存儲(chǔ)器操作數(shù)(變量/標(biāo)號(hào))格式: 運(yùn)算符變量名/標(biāo)號(hào)名SEG名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的段基值MOVAX,SEGK1OFFSET名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的段內(nèi)偏移地址MOVSI,OFFSETVAR運(yùn)算符—數(shù)值返回運(yùn)算符TYPE名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的類型屬性,以數(shù)字形式表示類型屬性數(shù)字形式變量BYTE1WORD2DWORD4標(biāo)號(hào)NEAR-1FAR-2運(yùn)算符—數(shù)值返回運(yùn)算符(例)V1 DB‘ABCD’V2 DW1234H,5678HV3 DDV2 …… MOVAL,TYPEV1 ;AL=1 MOVCL,TYPEV2 ;CL=2 MOVCH,TYPEV3 ;CH=4

運(yùn)算符—數(shù)值返回運(yùn)算符LENGTH名字/標(biāo)號(hào)只用于變量,且為DUP所定義

如未用DUP定義則返回值為1如使用DUP定義則返回最外層之值運(yùn)算符—數(shù)值返回運(yùn)算符(例)K1 DB10HDUP(0)K2 DB10H,20H,30HK3 DW20HDUP(0,1,2DUP(2))K4 DB‘ABCD’ …… MOVAL,LENGTHK1 ;AL=10HMOVBL,LENGTHK2 ;BL=1MOVCX,LENGTHK3 ;CX=20HMOVDX,LENGTHK4 ;DX=1運(yùn)算符—數(shù)值返回運(yùn)算符SIZE名字 只用于變量,得到重復(fù)定義的變量的數(shù)組元素所占字節(jié)數(shù)=LENGTH*TYPEK1 DB10HDUP(0)K2 DB10H,20H,30HK3 DW20HDUP(0,1,2DUP(2))K4 DB‘ABCD’ …… MOVAL,LENGTHK1 ;AL=10HMOVBL,LENGTHK2 ;BL=1MOVCX,LENGTHK3 ;CX=20HMOVDX,LENGTHK4 ;DX=1MOVAL,SIZEK1 ;AL=10HMOVBL,SIZEK2 ;BL=1MOVCL,SIZEK3 ;CL=40HMOVDL,SIZEK4 ;DL=1 運(yùn)算符—屬性修改運(yùn)算符對(duì)存儲(chǔ)器操作數(shù)(名字/標(biāo)號(hào))的屬性進(jìn)行修改PTR運(yùn)算符 類型PTR地址表達(dá)式

該修改是臨時(shí)的,只在當(dāng)前語句有效標(biāo)號(hào):NEAR/FAR變量:BYTE/WORD/DWORD 標(biāo)號(hào)名作為地址指針的R變量名

運(yùn)算符—屬性修改運(yùn)算符(例)DA_BYTE DB20HDUP(0)DA_WORDDW30HDUP(0) …… LEABXDA_WORD LEASI,DA_BYTE

MOVAX,WORDPTRBA_BYTE[10H] ADDBYTEPTRDA_WORD[20H],BL INCBYTEPTR[BX] SUBWORDPTR[SI],30H ANDAX,WORDPTR[BX][SI] JMPFARPTRSUB1運(yùn)算符—THIS運(yùn)算符THIS類型名利用THIS說明的操作數(shù)具有匯編時(shí)的當(dāng)前邏輯地址,但具有指定的類型LABEL偽指令的功能等同于“EQUTHIS”D_BYTE EQUTHISBYTEW_WORD DW20HDUP(0);定義20H字單元,該區(qū)域可按字節(jié)訪問,也可以按字訪問JMP_FAR EQUTHISFARJMP_NEAR:MOVAL,30H運(yùn)算符—HIGH/LOW運(yùn)算符操作對(duì)象:常數(shù)/地址表達(dá)式功能:取其高/低8位

CONSTEQU0ABCDH MOVAH,HIGHCONST ;AH=0ABH 運(yùn)算符的優(yōu)先級(jí)1 ()<>[]·LENGTHSIZEWIDTHMASK2 PTROFFSETSEGTPYETHIS:3 HIGELOW4 */MODSHLSHR5 +-6 EQNEGTLTGELE7 NOT8 AND9 ORXOR10 SHORT建議采用圓括號(hào)“()”顯式表達(dá),它可以極大地提高程序的可閱讀性三、段定義偽操作程序的段結(jié)構(gòu)段定義段尋址(指定當(dāng)前段)段寄存器的裝入三、段定義偽操作—完整段定義偽指令段名 SEGMENT定位組合段字'類別'

…… ;語句序列段名 ENDS段定義由SEGMENT和ENDS這一對(duì)偽指令實(shí)現(xiàn),SEGMENT偽指令定義一個(gè)邏輯段的開始,ENDS偽指令表示一個(gè)段的結(jié)束段定義指令后的4個(gè)關(guān)鍵字用于確定段的各種屬性,堆棧段要采用stack組合類型如果不指定,則采用默認(rèn)參數(shù);但如果指定,注意要按照上列次序三、段定義偽操作

—段定位(align)屬性表示對(duì)邏輯段起始邊界的選擇,可為:PAGE 段從一個(gè)頁邊界開始 (XXX00H,256Bytes/Page)

PARA 段節(jié)邊界開始(XXXX0H)DWORD 段從一個(gè)4倍數(shù)地址開始WORD 段從一個(gè)偶地址開始BYTE 段可以從任意單元開始完整段定義偽指令的默認(rèn)定位屬性是PARA三、段定義偽操作

—段組合(combine)屬性指定多個(gè)邏輯段之間如何連接與定位,可為: PRIVATE

本段與其他段沒有連接關(guān)系,這是完整段定義偽指令默認(rèn)的段組合方式 PUBLIC

在滿足定位關(guān)系的前提下,連接程序把本段與所有同名段相鄰地連接在一起,形成新的邏輯段。(可在程序的不同位置及不同的文件中使用段定義語句定義一個(gè)邏輯段) COMMON

產(chǎn)生一覆蓋段,兩個(gè)同名段起始地址相同,用較長(zhǎng)的段覆蓋較短的段三、段定義偽操作

—段組合(combine)屬性STACK

把所有的同類別段連接在一起,段基值→SS,且自動(dòng)為SP初始化。在一個(gè)程序中一般應(yīng)該有一個(gè)堆棧段。AT表達(dá)式表示本段定位在表達(dá)式所指示的節(jié)的邊界上

AT0930H表示本段的物理地址從09300H開始MEMORY

表示本段定位在所有其它段的最高地址三、段定義偽操作

—段類別(class)屬性當(dāng)連接程序組織段時(shí),將所有的同類別段相鄰分配段類別可以是任意名稱,但必須位于單引號(hào)中大多數(shù)MASM程序使用'code'、'data'和'stack’來分別指名代碼段、數(shù)據(jù)段和堆棧段,以保持所有代碼和數(shù)據(jù)的連續(xù)DA1 SEGMENTPARA‘DATA’DD1 DB10DUP(12H)DA1 ENDSSTA1 SEGMENTSTACK‘STACK0’ DW20HDUP(?)STA1 ENDSDA2 SEGMENTPARA‘DATA’DD2 DB20HDUP(13H)DA2 ENDSSTA2 SEGMENTSTACK‘STACK0’ DW30HDUP(?)STA2 ENDSCODE SEGMENT ……CODE ENDSDA11213DA2CODEDD1DD260HSTA1131212STA240H20H10三、段定義偽操作—段尋址指明當(dāng)前段

ASSUME段寄存器名:段名,段寄存器名:段名,……CSDSSSES

已經(jīng)定義的段

在程序運(yùn)行過程中,可重新設(shè)置當(dāng)前段,也可以刪除原有的設(shè)置

ASSUMEES:NOTHING ;刪除對(duì)ES的設(shè)置 ASSUMENOTHING ;刪除對(duì)所有段的設(shè)置三、段定義偽操作

—段寄存器的裝入ASSUME只說明了已哪些段為當(dāng)前段,具體的段基值并沒有裝入DS與ES的裝入 用ASSUME將DS/ES與相應(yīng)的段建立聯(lián)系后,用數(shù)據(jù)傳送指令

MOV AX,段名

MOV DS/ES,AX三、段定義偽操作

—段寄存器的裝入SS的裝入 在定義段時(shí),用組合類型STACK說明

STACK1 SEGMENTPARASTACK DW20HDUP(0) STACK1 ENDS CODE SEGEMNT ASSUMECS:CODE,SS:STACK1 ……

SS獲得STACK1的段基值,且SP=40H三、段定義偽操作

—段寄存器的裝入SS的裝入(類似于DS/ES的方法)

STACK1 SEGMENT DW40HDUP(0) TOP LABELWORD STACK1 ENDS …… CODE SEGEMNT ASSUMECS:CODE …… MOVAX,STACK1 MOVSS,AX MOVSP,OFFSETTOP ;SP=80H ……

中間不得插入其他指令三、段定義偽操作

—段寄存器的裝入CS的裝入 用結(jié)束偽指令:每個(gè)源程序都必須以END偽指令結(jié)束

END起始地址

功能:標(biāo)志源程序的結(jié)束 指定程序運(yùn)行的起始地址標(biāo)號(hào)表達(dá)式不一定是指令語句三、段定義偽操作

—段寄存器的裝入CS的裝入

CODE SEGEMNT ASSUMECS:CODE,SS:STACK1 START: …… …… ENDSTART

將后面的語句全部略去 將START所對(duì)應(yīng)的程序在內(nèi) 存中的位置裝入CS和IP四、程序開始和結(jié)束偽操作開始:

NAMEmodul_name

TITLEtext

程序終止和匯編結(jié)束是兩碼事結(jié)束:

END

起始地址五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作地址計(jì)數(shù)器$:匯編程序在為每條指令或變量分配內(nèi)存時(shí),使用當(dāng)前位置計(jì)數(shù)器來指示下一指令或數(shù)據(jù)的偏移量,用$表示其值定位偽指令: ORG表達(dá)式 將表達(dá)式的值賦給當(dāng)前位置計(jì)數(shù)器。即該偽指令后的指令或變量以表達(dá)式的值為偏移量EVEN

使下一指令或變量的偏移量為偶數(shù)五、地址計(jì)數(shù)器及對(duì)準(zhǔn)偽操作(例)DATA SEGMENT ORG30HDB1 DB12H,34H ORG$+20HSTR DB‘ABC’CNT EQU$-STR EVENDW1 DW20HDUP(0)DATA ENDS ……CODE SEGMENT ASSUMECS:CODE,DS:DATA ORG10HSTART:MOVAX,DATA MOVDS,AX ……CODE ENDS ENDSTARTDATA30HDB143HDD1STRDW142H41H00123440H20H30H00六、基數(shù)控制偽操作匯編語言源程序默認(rèn)使用十進(jìn)制,其他用標(biāo)注表示(B,O,H)格式: RADIX表達(dá)式功能:把默認(rèn)的基數(shù)改為2、8、16等 除指定進(jìn)制外,其他加標(biāo)注MOVBX,0FFHMOVBX,178RADIX16MOVBX,0FFMOVBX,178D過程定義偽指令

過程名 PROC[NEAR/FAR] …… RET ……

過程名 ENDP兩者必須相同;隱含為NEAR屬性:SEG OFFSET Distance;必須包含

在同一個(gè)邏輯段中可包含多個(gè)過程程序結(jié)束返回的方法以過程成形式編制的程序以中斷指令“INT21H”返回程序結(jié)束返回的方法

—以過程成形式編制的程序程序段前綴PSP(ProgramSegmentPrefix)從可用內(nèi)存的最低地址處開始參數(shù)與緩存區(qū)結(jié)合的區(qū)域共占256(100H)字節(jié)操作系統(tǒng)在PSP首址+100H處裝配要運(yùn)行的程序?qū)U(kuò)展名為EXE的程序,運(yùn)行時(shí)DS和ES指向程序段前綴在PSPPSP+1存放指令“INT20H”(該指令使程序返回控制臺(tái)命令接收狀態(tài))PSPDS:0000H,ES:0000附加段已用內(nèi)存各段順序及大小隨程序而定數(shù)據(jù)段堆棧段剩余內(nèi)存程序段前綴PSP代碼段INT20H100HPSP+100H程序結(jié)束返回的方法

—以過程成形式編制的程序?qū)^程的要求過程的距離屬性應(yīng)設(shè)置為FAR保留進(jìn)入程序前的DS(PUSHDS)使過程結(jié)束后執(zhí)行INT20H—過程的最后一條指令RET后從棧頂彈出DS:0000→CS:IP程序結(jié)束返回的方法

—以過程成形式編制的程序MAIN PROCFAR PUSHDS XORAX,AX PUSHAX ……

RETMAINENDP;完成所需要的功能程序結(jié)束返回的方法

—以中斷指令“INT21H”返回DOS軟中斷向用戶提供了一組非常有用的系統(tǒng)功能,其中4CH功能結(jié)束當(dāng)前進(jìn)程,控制返回給調(diào)用該程序的進(jìn)程,因此,在程序結(jié)束前加入語句:

MOVAH,4CH INT21H七、處理器選擇偽操作.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).486P ;選擇保護(hù)方式下的Pentium指令系統(tǒng)簡(jiǎn)單的匯編源程序(例1)編制一匯編源程序,求出下列公式中的Z值,并放在RESULT單元中。(X+Y)*8-X 2Z=開始預(yù)置數(shù)據(jù)段和堆棧段為返回DOS做準(zhǔn)備DX←X+YDX←DX*8DX←DX-XDX←DX/2RESULT←DX返回TITLE EXAMPLEDATA SEGMENT X DW6 Y DW7RESULTDW?DATA ENDSSTA1 SEGMENTPARASTACK DW20HDUP(0)STA1 ENDSCODE SEGMENTPROC1 PROCFAR ASSUMECS:CODE,DS:DATA ASSUMESS:STA1START:PUSHDS ;為返回做準(zhǔn)備 XORAX,AX PUSHAX MOVAX,DATA;裝入DS MOVDS,AX MOVDX,X ;DX=X ADDDX,Y ;DX=X+Y MOVCL,3 SHLDX,CL ;DX=(X+Y)*8 SUBDX,X ;DX=(X+Y)*8-X SARDX,1;DX=((X+Y)*8-X)/2 MOVRESULT,DX RETPROC1ENDPCODE ENDS ENDSTART簡(jiǎn)單的匯編源程序(例2)用查表的方法將1位十六進(jìn)制數(shù)轉(zhuǎn)換成相應(yīng)的ASCII碼。解:將地址及其單元存儲(chǔ)的內(nèi)容建立一種關(guān)系A(chǔ)SCIITABLE04430HEX424144303146451ABCDEFDATA SEGMENTTABLEDB30H,31H,32H,33H,34H,35H DB36H,37H,38H,39H DB41H,42H,43H,44H,45H,46HHEX DB4ASCII DB?DATA ENDSSTA1 SEGMENTPARASTACK DW20HDUP(0)STA1 ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA ASSUMESS:STA1START: MOVAX,DATA;裝入DS MOVDS,AX XORBX,BX MOVBL,HEX MOVDL,TABLE[BX] MOVASCII,DL

MOVAH,2 INT21H MOVAH,4CH INT21HCODE ENDS ENDSTART

MOVBX,OFFSETTABLE MOVAL,HEX XLATTABLE MOVASCII,AL§4.4匯編語言的上機(jī)過程編輯文本編輯器,如EDIT.COM源程序:文件名.asm匯編匯編程序,如MASM.EXE目標(biāo)模塊:文件名.obj連接連接程序,如LINK.EXE可執(zhí)行文件:文件名.exe調(diào)試調(diào)試程序,如DEBUG.EXE應(yīng)用程序錯(cuò)誤錯(cuò)誤錯(cuò)誤錯(cuò)誤匯編語言程序的開發(fā)過程開發(fā)過程—源程序的編輯源程序文件要以ASM為擴(kuò)展名源程序文件的形成(編輯)可以通過任何一個(gè)文本編輯器實(shí)現(xiàn):DOS中的全屏幕文本編輯器EDIT其他程序開發(fā)工具中的編輯環(huán)境MASM程序員工作平臺(tái)PWB中的編輯環(huán)境 EDITTEST.ASM開發(fā)過程—源程序的匯編匯編是將源程序翻譯成由機(jī)器代碼組成的目標(biāo)模塊文件的過程MASM5.x/6.x提供的匯編程序是MASM.EXE:MASMTEST.ASM如果源程序中沒有語法錯(cuò)誤,MASM將自動(dòng)生成一個(gè)目標(biāo)模塊文件(TEST.OBJ);否則MASM將給出相應(yīng)的錯(cuò)誤信息這時(shí)應(yīng)根據(jù)錯(cuò)誤信息,重新編輯修改源程序后,再進(jìn)行匯編開發(fā)過程—目標(biāo)模塊的連接連接程序能把一個(gè)或多個(gè)目標(biāo)文件和庫文件合成一個(gè)可執(zhí)行程序(.EXE、.COM文件):

LINKTEST.OBJ如果沒有嚴(yán)重錯(cuò)誤,LINK將生成一個(gè)可執(zhí)行文件(TEST.EXE);否則將提示相應(yīng)的錯(cuò)誤信息這時(shí)需要根據(jù)錯(cuò)誤信息重新修改源程序后再匯編、鏈接,直到生成可執(zhí)行文件開發(fā)過程—可執(zhí)行程序的調(diào)試經(jīng)匯編、連接生成的可執(zhí)行程序在操作系統(tǒng)下只要輸入文件名就可以運(yùn)行: TEST操作系統(tǒng)裝載該文件進(jìn)入主存,并開始運(yùn)行如果出現(xiàn)運(yùn)行錯(cuò)誤,可以從源程序開始排錯(cuò),也可以利用調(diào)試程序幫助發(fā)現(xiàn)錯(cuò)誤采用DEBUG.EXE調(diào)試程序:

DEBUGTEST.EXE源程序的兩種格式書寫源程序分別用兩種格式書寫第一種格式MASM5.0以前就具有完整段定義格式第二種格式從MASM5.0開始支持簡(jiǎn)化段定義格式存儲(chǔ)模式偽指令.MODEL存儲(chǔ)模式使用簡(jiǎn)化段定義,必須有存儲(chǔ)模式偽指令.model語句必須位于所有段定義語句之前存儲(chǔ)模式?jīng)Q定一個(gè)程序的規(guī)模,確定進(jìn)行子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問的缺省屬性MASM有7種不同的存儲(chǔ)模式:①TINY ②SMALL③COMPACT ④MEDIUM⑤LARGE ⑥HUGE⑦FLAT存儲(chǔ)模式—TINY微型模式微型模式是MASM6.0才引入的 用于創(chuàng)建COM類型程序用微型模式編寫匯編語言程序時(shí),所有的段地址寄存器都被設(shè)置為同一值 這意味著代碼段、數(shù)據(jù)段、堆棧段都在同一個(gè)段內(nèi),不大于64KB;訪問操作數(shù)或指令都只需要使用16位偏移地址存儲(chǔ)模式—SMALL小型模式一般的程序(例如本書的絕大多數(shù)程序示例和習(xí)題)都可用這種模式在小型模式下,一個(gè)程序至多只能有一個(gè)代碼段和一個(gè)數(shù)據(jù)段,每段不大于64KB 這里的數(shù)據(jù)段是指數(shù)據(jù)段、堆棧段和附加段的總和,它們共用同一個(gè)段基址,總長(zhǎng)度不可超過64KB;因此小模式下程序的最大長(zhǎng)度為128KB 訪問操作數(shù)或指令都只需要使用16位偏移地址;這意味著諸如指令轉(zhuǎn)移、程序調(diào)用以及數(shù)據(jù)訪問等都是近屬性(NEAR),即小型模式下的調(diào)用類型和數(shù)據(jù)指針缺省分別為近調(diào)用和近指針存儲(chǔ)模式—COMPACT緊湊模式適合于數(shù)據(jù)量大但代碼量小的程序緊湊模式下,代碼段被限制在一個(gè)不大于64KB的段內(nèi);而數(shù)據(jù)段則可以有多個(gè),超過64KB 這種模式下的調(diào)用類型缺省仍為近調(diào)用;而數(shù)據(jù)指針缺省為遠(yuǎn)(FAR)指針,因?yàn)楸仨氂枚蔚刂穪韰^(qū)別多個(gè)數(shù)據(jù)段存儲(chǔ)模式—MEDIUM中型模式中型模式是與緊湊模式互補(bǔ)的模式 適合于數(shù)據(jù)量小但代碼量大的程序中型模式的代碼段可以超過64KB,有多個(gè);但數(shù)據(jù)段只能有一個(gè)不大于64KB的段 這種模式下的數(shù)據(jù)指針缺省為近指針;但調(diào)用類型缺省是遠(yuǎn)(FAR)調(diào)用,因?yàn)橐枚蔚刂穮^(qū)別多個(gè)代碼段存儲(chǔ)模式—LARGE大型模式較大型程序通常采用的存儲(chǔ)模式大型模式允許的代碼段和數(shù)據(jù)段都有多個(gè),都可以超過64KB;但全部的靜態(tài)數(shù)據(jù)(不能改變的數(shù)據(jù))仍限制在64K字節(jié)內(nèi) 大型模式下的調(diào)用類型和數(shù)據(jù)指針缺省分別為遠(yuǎn)調(diào)用和遠(yuǎn)指針存儲(chǔ)模式—HUGE(巨型模式)與大型模式基本相同,只是靜態(tài)數(shù)據(jù)不再被限制在64K字節(jié)之內(nèi)存儲(chǔ)模式—

FLAT平展模式平展模式用于創(chuàng)建一個(gè)32位的程序, 它只能運(yùn)行在32位x86CPU上。DOS下不能使用FLAT模式, 而編寫32位Wind

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論