計算機原理課件-匯編語言程序設計_第1頁
計算機原理課件-匯編語言程序設計_第2頁
計算機原理課件-匯編語言程序設計_第3頁
計算機原理課件-匯編語言程序設計_第4頁
計算機原理課件-匯編語言程序設計_第5頁
已閱讀5頁,還剩85頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

計算機原理計算機原理*24.1概述4.2匯編語言源程序的格式4.3偽指令操作4.4DOS功能調用4.5匯編語言程序設計

第四章匯編語言程序設計計算機原理*3機器語言(MachineLanguage):二進制表示的指令和數據。匯編語言(AssemblyLanguage):

助記符來編寫指令,地址和數據也可用符號表示。用匯編語言編寫的程序必須翻譯成機器語言目標程序(或目標代碼)才能執行,這種翻譯過程稱為匯編。高級語言:不針對某個具體的計算機,通用性強。但高級語言編寫的源程序同樣必須“翻譯”成機器語言,計算機才能執行,所用的系統軟件稱為編譯程序或解釋程序。第四章匯編語言程序設計4.1概述第四章匯編語言程序設計4.1概述第四章匯編語言程序設計4.1概述計算機原理*4用匯編語言編寫源程序,經過匯編程序和連接程序生成目標程序和執行程序。

文件名.ASM

文件名.OBJ

文件名.EXE匯編語言源程序

匯編目標程序連接執行程序編輯程序EDIT.EXE匯編程序MASM.EXE連接程序LINK.EXE第四章匯編語言程序設計4.1概述計算機原理*5用文本編輯程序編寫匯編語言源程序,產生擴展名為.ASM的源文件;用匯編語言編寫的源程序經過匯編程序MASM.EXE自動翻譯成目標程序,產生擴展名為.OBJ的目標文件;用鏈接程序LINK.EXE將目標程序鏈接產生擴展名為.EXE的可執行程序。用Debug.EXE進行調試。編譯器可采用MicrosoftMASM或者BorlandTASM第四章匯編語言程序設計4.1概述計算機原理*6匯編程序(MASM.EXE)的主要功能是:將匯編語言源程序翻譯成機器語言;按程序員指定,分配存儲區域(包括程序區,數據區,堆棧區等);將各種進位制數據轉換成二進制數;把字符轉換成ASCII碼;計算出數值表達式的值;對源程序進行檢查,如果有指令錯或程序格式錯則給出相應提示。第四章匯編語言程序設計4.1概述計算機原理*7在8086/8088匯編語言中,有兩類匯編語言指令,一類是執行性指令,另一類是說明性指令。對執行性指令,匯編程序都為之產生機器指令代碼;而說明性指令的作用僅僅是告訴匯編程序對源程序中的執行性指令應該如何產生代碼,或分配存儲區。1、執行性指令“執行性指令”又稱“指令語句”。這類語句經匯編后總有目標程序與之對應,按其與匯編后目標程序對應情況又可分為兩種類型:一般性執行性指令和宏指令。執行性指令的功能主要由其對應的目標程序在運行時來實現。

第四章匯編語言程序設計4.1概述計算機原理*8(1)一般性執行指令:這種指令是一條指令對應一條8086/8088的機器指令,即指令系統中包括的指令。(2)宏指令:這種指令是由偽操作定義的。宏指令是一般性指令的擴展。(3)執行性指令的格式

[標號:][前綴]指令助記符[操作數表][;注釋]其中[]表示根據不同的指令或不同情況可以任選的部分。操作數表是由逗號分隔開的多個操作數。標號代表“:”后指令的存儲地址,供JMP,CALL和LOOP等指令操作使用。除此之外,它還具備一些其他“屬性”。第四章匯編語言程序設計4.1概述計算機原理*9前綴

是8086/8088中一些特殊指令,它們同其他指令配合使用,如“串操作指令”的重復指令REP。指令助記符包括8086/8088指令助記符以及用宏定義語句定義過的宏指令名。操作數對8086/8088的一般性執行指令來說,可以是一個或二個操作數,這時我們稱左邊的操作數為目標操作數,右邊的操作數為源操作數,對宏指令來說,可能有多個操作數,操作數之間有逗號隔開。注釋以“;”開始,用來簡要說明該指令在程序中的作用,以提高程序的可讀性。第四章匯編語言程序設計4.1概述計算機原理*102、說明性指令(偽指令)“說明性指令”又稱“指示性語句”。由偽操作符定義,用于程序以源程序方式同“匯編程序”通信。程序采用說明性指令表示源程序的起始終止信息、分段情況、內存結構和變量說明等信息。說明性指令的功能由匯編程序來完成。說明性指令在匯編時不產生任何代碼。說明性指令的格式如下:

[名字]偽操作指令[操作數表][;注釋]

其中“名字”可以是標識符定義的常量名、變量名、過程名、段名以及結構名*或記錄名*等。所謂標識符是由字母、數字、特殊字符(如?或下劃線)等組成的字符串。第四章匯編語言程序設計4.1概述計算機原理*11匯編語言源程序的例子

DATASEGMENT;定義數據段

DATA1DB0F8H,60H,0ACH,74H,3BH;被加數

DATA2DB0C1H,36H,9EH,0D5H,20H;加數

DATAENDS;數據段結束

CODESEGMENT;定義代碼段

ASSUMECS:CODE,DS:DATA;告訴匯編程序段范圍

START:MOVAX,DATAMOVDS,AX;初始化DSMOVCX,5;循環次數送CXMOVSI,0;置SI初值為零第四章匯編語言程序設計4.2匯編語言源程序的格式第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*12CLC;清CF標志LOOPER:MOVAL,DATA2[SI];取一個字節加數

ADCDATA1[SI],AL;與被加數相加

INCSI;SI加1指向下一字節

DECCX ;計數器CX減1JNZLOOPER ;不等于零,轉LOOPERMOVAH,4CH;系統功能調用,AH=4CINT21H;退出并返回DOSCODEENDS;代碼段結束

ENDSTART;源程序結束,指定起始地址標號第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*13常用的匯編語言源程序框架:

DATASEGMENT ;定義數據段

VAL1DB12H,8EH;定義變量

……DATAENDS ;數據段結束

STACKSEGMENTSTACK……STACKENDSEXTRASEGMENT……EXTRAENDS

堆棧段數據段擴展段第四章匯編語言程序設計4.2匯編語言源程序的格式第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*14CODESEGMENT ;定義代碼段

ASSUMECS:CODE,DS:DATA,ES:EXTRA,SS:STACK;段屬性說明START:MOVAX,DATA;初始化DSMOVDS,AXMOVAX,EXTRA;初始化ESMOVES,AXMOVAX,STACK;初始化SSMOVSS,AX ……MOVAX,4C00H ;返回DOSINT21HCODEENDS;代碼段結束

ENDSTART ;源程序結束第四章匯編語言程序設計4.2匯編語言源程序的格式第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*15匯編語言的語句執行/指令性語句:可以產生相應的機器碼,與機器指令相對應。

LOOPER:MOVAL,DATA[SI]指示性語句(偽操作指令):不產生機器碼,僅為匯編程序提供匯編時所需要的信息。如:datalDW12abH該語句將告訴匯編程序data1定義為一個字12abH,匯編程序將為它分配一個存儲器地址,而且把該存儲單元與下一個存儲單元初始化為abH和12H。第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*16宏指令語句

為了書寫方便,把一個匯編語句序列用一條指令代替,這種指令稱為宏指令。由宏指令組成的語句稱為宏指令語句。在匯編時,凡是有宏指令的地方將用相應的匯編語句序列取代,所以宏指令可以產生目標代碼。例如:funmacrox;x是形式參數

mov

ah,x

int21h

endm則fun為宏指令,使用時直接寫成:fun2;其中2是宏參數,匯編時產生:

movah,2

int21h

兩條語句,并將它們匯編成目標代碼。第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*17匯編語言語句的格式⑴指令語句格式

標號:助記符操作數,‥,操作數;注釋

⑵偽指令語句格式

名字助記符參數,‥,參數;注釋

⑶宏指令語句格式

宏指令名實參數,‥,實參數;注釋第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*181、標識符標識符即標號和名字,標號和名字的區別是標號后面必須跟冒號,而名字后面沒有冒號。一個標號與一條指令的地址的符號名相聯系,即標號是符號地址。例如上面的示例程序中Start是標號。名字可以是變量名、段名、過程名等,例如上面的示例程序中DATA、CODE是段名,Data1、Data2是變量名。匯編語言中的幾個基本概念第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*19

2、保留字保留字是一個匯編語言中預先保留下來的具有特殊含義的符號,這些符號不能濫用。

如:SEGMENTENDSOFFSETSIZEDBDWDDMOVPUSHADDSUBMULDIVINCDECLOOPPROCENDPCALLRETEND

第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*203、數的表示⑴常數:

二進(B)、八進(O)、十進(D)和十六進(H)制數,注意十六進制數若以字母開頭,前面要加數字0。缺省情況下是十進制數,但可用偽指令RADIXn來改變缺省的基數。⑵字符串常數:用單引號括起來的一個或多個字符組成一個字符串常數,例如:‘Therezultis:’在內存中。以字符的ASCII碼值存放,注意一個空格也是一個字符。如‘The’,在內存中是54H、68H、65H和20H。第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*214、變量

變量是代表存放在某些存儲單元的數據。這些數據在程序運行期間隨時可以修改。變量有三個屬性:段屬性、偏移屬性和類型屬性。⑴變量的定義與預置①定義變量就是給變量分配存儲單元,且對該存儲單元賦于一個符號名—變量名,同時預置初值。定義變量用數據定義偽指令DB、DW、DD、DQ、DT等。例:VAR_DATASEGMENTdata1DB12Hdata2DW5678HVAR_DATAENDS第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*22②變量的屬性

ⅰ段屬性(SEG):表示變量存放在那一個邏輯段中,例如上面定義的變量名data1和data2存放在VAR_DATA邏輯段中。對它們進行存取時要先將它們所在段的段基值放在DS中,即執行下面語句:

mov

ax,VAR_DATA

mov

ds,ax

ⅱ段的偏移屬性(offset):表示變量在邏輯段中離段起點的字節數。如上面的data1的偏移量為0,data2的偏移量為1。

變量的段屬性和偏移屬性構成了變量的邏輯地址。

ⅲ類型屬性(type):表示變量占用存儲單元的字節數

DB1字節,DW2字節,DD4字節,

DQ8字節,DT10字節第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*23⑵

數據定義偽指令

格式:變量名偽指令名表達式1,表達式2,‥‥

這里表達式有以下幾種情況:

①數值表達式例:DA_BYTEDB50H,50,0caHDA_WORDDW0a3f1H,498dH

②?表達式,不帶引號的?表示可預置任何內容例:DA_BDB?,?;要求分配兩個字節單元

DA_WDW?,?;要求分配兩個字單元

③字符串表達式數據項可以寫成字符串形式,但只能用DB、DW、DD定義,而且DW、DD語句定義的串只允許包含兩個字符。參看下面的例子。第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*24注意:定義多于兩個以上字符的字符串時,只能使用DB偽指令,不能使用DW和DD等偽指令。例:S1 DB‘ABCDEF’S2 DW‘AB’,‘CD’,‘EF’S3 DD‘AB’,‘CD’

這幾個變量在存儲器中存放情況如下:S141HS242HS342H42H41H41H

43H44H00H44H43H00H45H46H44H46H45H43H00H00H第四章匯編語言程序設計4.2匯編語言源程序的格式第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*25

可以用DW語句把變量或標號的偏移地址存入存儲器;也可用DD語句把變量或標號的段地址和偏移地址都存入存儲器,此時低位字存偏移地址,高位字存段地址,例如:VAR DW 1234HLABEL:MOVAL,04H… PRVDDVAR PRLDWLABELPRRDDLABEL

…PRVPRLPRRVAR的偏移地址VAR的段地址LABEL的偏移地址LABEL的偏移地址LABEL的段地址第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*26④

帶DUP表達式,DUP是定義重復數據操作符格式:

變量名數據定義偽指令表達式1DUP(表達式2)其中表達式1是重復次數,表達式2是重復內容。例:D_B1DB20HDUP(?);保留20H個字節

D_B2DB10HDUP(‘ABCD’);字符串‘ABCD’

;重復10H次

D_W1DW10HDUP(4);字4重復10H次

ARRAYDB100DUP(0,2DUP(1,2),0,3)

;定義ARRAY700個字節⑤‘$’符號,表示地址計數器的當前值

第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*27例:ARRAYDW1,2,$+4,3,4,$+4

如果在匯編時,ARRAY的偏移地址是0074H,則在ARRAY數組中,兩個$+4得到的結果是不同的,這是由于$的值是在不斷變化的。此定義在存儲器中的表示如下圖所示。

$用在偽操作的參數字段時,和用在指令中的情況是不同的,用在偽操作中它表示的是地址計數器的當前值。用在指令中它只表示該指令的首地址,而與$本身所在的字節無關。例如指令JNE$+6表示滿足條件時轉移到該指令的首地址加6以后所在的單元。

1000:2543JNE$+6則轉移地址是2549H.第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*2801H00H03H00H04H00H82H00HARRAY00H02H00H7CH01HARRAY00H01HARRAY02H00H01HARRAY00H02H00H01HARRAY7CH00H02H00H01HARRAY00H7CH00H02H00H01HARRAY03H00H7CH00H02H00H01HARRAY00H03H00H7CH00H02H00H01HARRAY04H00H03H00H7CH00H02H00H01HARRAY00H04H00H03H00H7CH00H02H00H01HARRAY82H00H04H00H03H00H7CH00H02H00H01HARRAY00H82H00H04H00H03H00H7CH00H02H00H01HARRAY第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*29例4-1:下面的數據段定義,COUNT表示什么?

DATASEGMENTBUFDB‘0123456789ABCD’ COUNTEQU$-BUFDATAENDS這里,COUNT的值就是數據區的長度,所以COUNT=145、標號

標號是一條指令的目標代碼的符號地址,它常用作轉移指令(或子程序調用指令)的操作數。標號有三個屬性:段屬性、偏移屬性和類型屬性。段屬性是該標號的段地址,偏移屬性是該標號的偏移地址,類型屬性是表示該標號的范圍是本段(NEAR)或段間(FAR),或稱為近或遠屬性。第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*306、表達式和運算符表達式由常數、操作數、操作符和運算符組成。有六種運算符,即算術運算符、邏輯運算符和關系運算符、分析運算符、綜合運算符和分離運算符。1、算術運算符+、-、*、/、MOD(取余)、SHL(左移)、SHR(右移)例:32MOD5;結果為2MOVDX,BLOCK+(6-1)*22、邏輯運算符(按位操作)

AND(與) OR(或) XOR(異或) NOT(非)

例:INAL,Port_VALOUTPort_VALANDOFEH,AL 第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*313、關系運算符關系運算是邏輯判定,當為真時結果為全1(0FFFFH),為假時結果為全0。

EQ(等于);若PP=25,則25EQPP=0FFFFHNE(不等于);25NEPP=0LT(小于);25LT26=0FFFFHLE(小于等于);25LEPP=0FFFFHGT(大于);26GTPP=0FFFFHGE(大于等于);24GEPP=0關系運算符一般不單獨使用,常與其它運算符結合使用。例如:ADDAX,((portGT60)AND50)OR((portLE60)AND70)當port的值>60時,上述指令匯編為ADDAX,50當port的值≤60時,上述指令匯編為ADDAX,70第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*324、分析運算符把存儲器地址操作數分解成它的組成部分。

SEG(求段地址),格式:SEG﹤符號名﹥

OFFSET(求偏移地址),格式:OFFSET﹤符號名﹥

TYPE(求符號名類型值),格式:TYPE﹤符號名﹥

SIZE求為符號名分配的字節數格式:SIZE﹤符號名﹥

回送分配給該符號名的字節數,但此值是LENGTH的值和TYPE的值的乘積。類型byteworddwordqwordtbyteNEARFAR類型值124810-1(FFH)-2(FEH)第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*33LENGTH,求為符號名分配的項數。格式:LENGTH﹤符號名﹥

這里為符號名定義的數據項必須是用重復格式DUP()定義的。而對于其他情況則回送1。例

:K2DW10DUP(?)

則LENGTHK2=10 TYPEK2=2 SIZEK2=20

例:AARRDW2,4,6

則LENGTHAARR=1,TYPEAARR=2SIZEAARR=2可以看出:

SIZE<符號名>=(LENGTH<符號名>)*(TYPE﹤符號名﹥)第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*345、綜合運算符

⑴定義符號名為新類型/類型屬性操作符格式:﹤類型﹥PTR﹤符號名﹥

PTR的功能歸納如下:

①保證運算時操作數類型的匹配

例:F1 DB16H,38H F2DW 1234H,26ABH MOVAX,WORDPTRF1 ;AX=3816H MOVBL,BYTEPTRF2 ;BL=34H第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*35②通過PTR指明是字單元還是字節單元例:MOVBYTEPTR[BX],10H;[BX]為字節單元

MOVWORDPTR[SI],20H;[SI]為字單元③用PTR來改變距離屬性例:JMPFARPTRLLOOP CALLDWORDPTR[BX] ⑵指定新類型

格式:﹤符號名﹥EQUTHIS﹤類型﹥

例:LABCEQUTHISBYTE;LABC是字節類型

LABDDW4321H,2255H;LABD是字類型

MOVAL,LABC;AL=21HMOVAX,LABD;AX=4321H第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*366、分離運算符

⑴取低字節格式:LOW﹤符號名﹥

取高字節格式:HIGH﹤符號名﹥

例:設SSY=2050H

moval,LOW3080H;al=80H

movah,HIGHSSY;ah=20H

mov

cl,LOW3a4bH;cl=4bH7、專用運算符8、其它運算符如果需要,請參考相關的參考書。9、匯編運算符的優先級第四章匯編語言程序設計4.2匯編語言源程序的格式計算機原理*374.3偽指令操作

偽指令沒有對應的機器指令,不是由CPU執行,而是由匯編程序識別,并完成相應的功能。偽指令越多,應用越方便,MASM86的偽指令可分為14類。

1、符號定義偽指令

﹤符號名﹥EQU﹤表達式﹥﹤符號名﹥

=﹤表達式﹥

例:port1EQU78port2EQUport1+2counterEQUcx

;定義為寄存器

cbdEQUDAA;定義為助記符

A=6 A=A+2

第四章匯編語言程序設計4.3偽指令操作第四章匯編語言程序設計4.3偽指令操作計算機原理*38=和EQU的區別是用=定義的符號名在同一程序中可以重復定義,而用EQU定義的符號名在同一程序中不允許重復定義。

EQU與特殊運算符PTR或THIS連用,可以給變量或標號定義新的類型屬性并重新命名,但其段屬性和偏移屬性不變。例:某一程序段中有以下幾條偽指令語句,試分析個變量的屬性。

DATA SEGMENTDDBUFEQUTHISDWORD BUF DB100DUP(?)

DWBUFEQUWORDPTRBUFDATA ENDS…FIRSTEQUTHISFAR;定義遠標號,其段屬性和偏移

LEASI,BUF;屬性與緊跟其后指令的存儲地址相同

…DDBUF,BUF,DWBUF分別是雙字類型、字節類型和字類型,它們為同一數據區的首址。第四章匯編語言程序設計4.3偽指令操作計算機原理*392、內存數據定義偽指令

DB定義字節(前面已講過定義方法)

DW定義字(2字節)

DD定義雙字(4字節)

DQ定義8字節

DT定義10字節3、段定義偽指令

﹤段名﹥SEGMENT[定位方式][連接方式][‘類別名’]…

﹤段名﹥ENDS

⑴定位方式

PAGE指定起始地址的低8位是0PARA指定起始地址的低4位是0(隱含)

WORD指定起始地址的最低位是0BYTE指定起始地址是任意值第四章匯編語言程序設計4.3偽指令操作計算機原理*40⑵連接方式(組合類型)組合類型告訴連接程序本段與其它段的關系。有NONE,PUBLIC,COMMON,STACK,MEMORY和AT6種。缺省下是NONE,表示本段與其他段邏輯上不發生關系。STACK則指定該段在運行時為堆棧段的一部分。(參看相關參考書)。⑶‘類別名’類別名是用單引號括起來的字符串,連接程序只使同類別的段發生關聯。

4、段寄存器說明偽指令

ASSUME段寄存器:段定義名1[,段寄存器:段定義名2,…]

例:ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK第四章匯編語言程序設計4.3偽指令操作計算機原理*415、過程(子程序)定義偽指令

﹤過程名﹥PROC[NEAR或FAR];

NEAR可省略

﹤過程名﹥ENDP調用過程的格式為:

CALL﹤過程名﹥過程返回

RET ;段內返回

RETF ;段間返回第四章匯編語言程序設計4.3偽指令操作計算機原理*426、定位偽指令格式:ORG﹤表達式﹥這里表達式是一個無符號數,表示以下的程序或數據的開始地址。例4-2:下面程序段,指出變量BUF和NUM的偏移地址為多少?DATA SEGMENT ORG10 BUFDB ‘ABCD’ ORG$+5 NUMDW 50DATA ENDS

變量BUF的偏移地址為10;變量NUM的偏移地址為19第四章匯編語言程序設計4.3偽指令操作計算機原理*437、對準偽操作

格式:EVEN

;使下一個字節地址成為偶數。8、基數控制偽操作指令

格式:RADIX表達式該表達式表示進制的基數值(2-16),注意用十進制表示

其它類型的偽指令及宏指令,請參看相關的參考書。第四章匯編語言程序設計4.3偽指令操作計算機原理*44

通常把DOS提供的INT21H中斷服務程序稱為DOS功能調用,調用時根據AH的值來選擇子功能。AH=1鍵盤鍵入并回顯,輸入字符的ASCII碼在AL中返回例:MOVAH,1INT21HAH=2顯示輸出字符,輸出字符的ASCII碼放入DL中例:MOVAH,2 MOVDL,‘A’INT21HAH=7鍵盤輸入無回顯,輸入字符的ASCII碼在AL中返回例:MOVAH,7INT21H第四章匯編語言程序設計4.4DOS功能調用第四章匯編語言程序設計4.4DOS功能調用計算機原理*45AH=9顯示字符串,字符串以‘$’結束,開始位置用DS:DX指示例:MOVAX,MY_DATAMOVDS,AXLEADX,StringMOVAH,9INT21HAH=4C程序運行結束,返回操作系統,返回碼由AL給出例:MOVAX,4C00HINT21H第四章匯編語言程序設計4.4DOS功能調用計算機原理*461、程序編制及調試匯編語言源程序的編制

編輯環境:EDIT、ULTRAEDIT、NOTEPAD等。存盤形式:ASCII形式注意:編輯好的源程序必須以擴展名.ASM來命名。匯編源程序的編譯將匯編源程序轉換成目標(OBJ)文件編譯器:MICROSOFTMASM5.0+、BROLANDTASM2.0+存盤形式:Binary形式注意:編譯完成后生成擴展名為.OBJ的目標文件。如果源程序有語法錯誤,則給出相應的錯誤提示及錯誤代碼。連接將一個目標文件或者多個目標文件連接(再定位)生成可執行文件。第四章匯編語言程序設計4.5匯編語言程序設計第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*47連接器:MICROSOFTLINK5.0+、BROLANDTLINK2.0+存盤形式:Binary形式.COM文件與.EXE文件的區別1、.COM文件是內存映像文件,執行時直接裝入內存即可執行。其中代碼段、數據段、堆棧段等的段地址完全相同。一般程序長度小于64KB。裝入執行速度相對較快。2、.EXE文件不是內存映像文件,執行時需要把代碼段、數據段、堆棧段等重新定位,然后才能夠執行。程序長度可以大于64KB。裝入執行速度相對較慢。3、不論是.COM文件還是.EXE文件裝入內存時都產生一個PSP(程序前綴段),里面是程序運行的一些基本信息,存放在程序的開始位置0-FFH,PSP的長度是256Byte。調試

調試工具:DEBUG、TDEBUG。

第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*48常用的匯編語言程序框架:

DATA SEGMENT ;定義數據段

VAL1DB12H,8EH ;定義變量

……DATA ENDS ;數據段結束STACKSEGMENTSTACK……STACKENDSEXTRASEGMENT……EXTRAENDSCODESEGMENT ;定義代碼段ASSUMECS:CODE,DS:DATA,ES:EXTRA,SS:STACK;段屬性說明START:MOVAX,DATA ;初始化DSMOVDS,AXMOVAX,EXTRA;初始化ESMOVES,AXMOVAX,STACK;初始化SSMOVSS,AX……

第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*49MOVAX,4C00H ;返回DOSINT21HCODEENDS ;代碼段結束ENDSTART ;源程序結束第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*502、開發調試例程例4-2編寫一個.EXE文件,顯示’Hello!’并響鈴

(Test1.asm)

Datasegment;定義數據段

stringdb‘Hello!’,7,’$’ Dataends Stacksegmentstack ;定義堆棧段

db256dup(0) Stackends Codesegment;代碼段開始

assumecs:Code,ds:Data,ss:Stack

Start:movax,data

mov

ds,ax leadx,string;取String的有效地址

movah,09h

int21h;調用dos的09號功能

movah,4c

int21h;退出

codeendsendstart第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*51將程序存盤為Test1.asmd:\>masmTest1 ;編譯程序,不需加.asm

擴展名d:\>linkTest1 ;連接程序,不需加.obj

擴展名編譯時,當執行d:\>masmTest1時,屏幕會出現

Objectfilename[Test1.OBJ]: Sourcelisting[NUL.LST]: Cross-reference[NUL.CRF]:如果有語法錯誤,則還會出現類似的錯誤提示:Test1.ASM(18):errorA2056:Immediatemodeillegal編譯輸入為.ASM文件,輸出有三個文件:.OBJ,二進制目標文件.LST,列表文件,該文件列出源程序和機器碼清單,并給出符號表,以便調試。該文件可有可無。.CRF,用于產生交叉引用表,給出用戶定義的所有符號及所在行號。該文件可有可無。第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*52例2編寫一個.COM文件

codesegmentassumecs:code,ds:code,ss:code,es:code org100h ;偽指令,表示下面代碼的偏移地

mainprocfar ;址從100h處開始

leadx,string

movah,09h

int21h

movax,4c00h

int21h mainendp stringdb‘Hello!’,7,’$’ ;數據定義

codeends endmain第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*53DEBUG調試命令介紹

DEBUG軟件是DOS系統下的匯編語言調試分析工具,在DOS下執行DEBUG.EXE出現提示符‘-’,進入到DEBUG調試環境。默認條件為:

默認使用十六進制數據,并且不用加后綴H;地址一般由段地址和偏移量組成,若在命令中不指明段地址,默認使用DS中的段地址。進入DEBUG后,可按Q鍵退出,或按?查看幫助。第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*54命令介紹匯編命令A(Assemble)一般用法:-A;從當前地址輸入匯編源程序

-A地址;從指定位置輸入匯編程序反匯編命令U(Unassemble)一般用法:-U;從當前位置將機器碼反匯編成源程序

-U地址;從指定位置將機器碼反匯編成源程序

-U地址1地址2;按照指定位置將機器碼反匯編;成源程序,地址1為開始位置,;地址2為結束位置第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*55Debug環境下執行匯編命令A所見畫面Debug環境下執行反匯編命令U所見畫面第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*56顯示內存命令D(Display)

-D ;從當前位置開始顯示128個字節的內容

-D地址;從指定位置開始顯示128個字節的內容

-D地址1地址2;功能同上,地址1為起始地址,;地址2為結束地址修改內存單元命令E(Editor)

-E地址 ;顯示指定內存單元的內容,并修改

-E地址數據;修改指定地址的內存單元的內容,

;多個數據可以用空格隔開,用回車;完成修改例:-e100‘Hello’7‘$’;單引號表示輸入ASCII碼第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*57Debug環境下執行顯示內存命令d后所見畫面Debug環境下執行顯示寄存器命令r后所見畫面第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*58顯示和修改寄存器命令R(Register)

-R ;顯示所有寄存器的內容

-R寄存器名;顯示并修改指定寄存器的內容在DEBUG環境中用一些符號表示標志位,說明如下:

標志邏輯真邏輯假標志邏輯真邏輯假

OFOVNVAFACNADFDNUPPFPEPOIFEIDICFCYNCSFNGPL沒有TF:跟蹤單步標志

ZFZRNZ第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*59執行命令G(Go)-G;從當前IP指示的地址開始執行程序

-G=起始地址;從指定的地址開始執行程序

-G=起始地址斷點地址;從指定的地址開始執行程序,并;執行到斷點處暫停單步執行指令T和PT:跟蹤進入子程序

P:不跟蹤進入子程序一般用法:-T;執行一條指令

-Tn;執行n條指令其他指令:N(定義名字)W(寫磁盤)L(從磁盤裝入)退出命令:Q;退出DEBUG,返回DOS第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*60在debug環境下編制匯編程序寫匯編程序

MOVDX,10CMOVAH,9;顯示字符串,DS:DX=串地址;‘$’=結束符

INT21;DOS功能調用

MOVAH,4C ;帶返回碼結束,AL=返回碼

INT21寫數據-E10C‘Hello!’7‘$’運行程序-G=100取程序名字-NT;默認存放在當前目錄設置程序長度

-RBX ;設置程序長度

:0 ;64K的倍數

-RCX ;設置程序長度

:20 ;字節數第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*61寫入磁盤:-W

;存盤,若未指定地址則從CS:0100H開始,

;要寫入的文件字節數應先放入BX和CX中 執行:-G=100或退出DEBUG后,在DOS下執行T裝入程序:-NT-L;把文件裝入存儲器,若未指定地址,則數據從CS:0100H開始第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*621、順序結構程序設計第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*63例4.3從鍵盤輸入一個小寫字母,轉換成大寫字母輸出。分析:AH=1,int21h從鍵盤輸入一個字符并回顯AH=2,int21h輸出一個字符,輸出字符的ASCII碼放在DL中字符ASCII碼

a-z 61h–7AhA–Z 41h–5Ah;4_3.asmDataSegmentstring1db‘Pleaseinput(a–z):$’string2db0dh,0ah,‘Theresultis:$’DataEndsStacksegmentstackdb256dup(?)StackEndsCodeSegmentassumecs:code,ss:stack,ds:datamainprocfarstart:mov

ax,data

第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*64

mov

ds,ax leadx,string1

movah,9 ;顯示提示符1

int21h

movah,1 ;輸入小寫字符

int21hsubal,20hpushaxleadx,string2

movah,9;顯示提示符2

int21hpopax

movah,2;輸出大寫字符

movdl,al

int21h

movax,4c00h

int21h ;返回DOSmainendpcodeendsendstart第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*65例4.4在數據段中存放兩個32位二進制無符號數DATA1和DATA2,編制一程序計算兩數之和,結果存于RESULT單元中。分析:;4_4.asmdatasegmentdata1dd1565764587data2dd1293773646resultdd?dataendsstacksegmentstack

dw128dup(0)stackendsdata1data2result+高16位低16位CF第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*66codesegmentassumecs:code,ds:data,ss:stackmainprocfarstart: pushds

movax,0 pushax

movax,data

mov

ds,ax

movax,wordptrdata1 ;低16位相加

addax,wordptrdata2

movwordptrresult,ax

movax,wordptrdata1+2

adcax,wordptrdata2+2;高16位相加

movwordptrresult+2,ax

retfMainendpCodeendsEndstart第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*67例4.5以16進制形式顯示存儲器中一個字節的無符號數VAR。例如:11010101顯示D5分析:將一個字節分為高4位,低4位兩部分先顯示高4位,后顯示低4位,顯示時若用int21h中的2號子功能,需要字符的ASCII碼數值字符ASCII碼

0000~10010~930h~39h 1010~1111A~F41h~46h;4_5.asmdatasegment

var db100dataendsstacksegmentstackdb 256dup(?)Stackends第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*68Codesegmentassumecs:code,ds:data,ss:stackmainprocfar

movax,data

mov

ds,ax

moval,var

mov

dh,al

movcl,4

shral,clcallubasccallpchar

moval,dhcallubasc

callpchar

movax,4c00h

int21hmainendp;顯示一個字符pcharproc

movah,02h

movdl,al

int21h

ret

pchar

endp;將AL的低4位轉換為ASCII碼ubascprocandal,0fh

addal,30h

cmpal,‘9’

jnaubasc1

addal,07h

ubasc1:retubasc

endpcodeendsendstart;ubascproc;andal,0fh;addal,90h;daa;adcal,40h;daa;ret;ubasc

endp;將AL的低4位轉換為ASCII的另一種方法第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*692、分支結構程序設計第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*70二分支結構例4.6在數據段中有兩個16位二進制無符號數DATA1和DATA2,找出其中較小數,并存于MIN中。;4_6.asmdatasegmentdata1dw2000hdata2dw3f80hmindw?dataendsstacksegmentstackdb256dup(?)stackendscodesegmentassumecs:code,ds:data,ss:stackmainprocfarpushds

movax,0pushax

movax,data

mov

ds,ax

movax,data1

cmpax,data2

jnaenext

movax,data2next:

movmin,axretmainendpcodeendsendmain第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*71三分支結構例4.7判斷變量var中的值,若為正數,在result中存入0001H;為負數,在result中存入FFFFH;為零,在result中存入0000H。;4_7.asmdatasegment

var

dw2000hresultdw0dataendsstacksegmentstack

dw100dup(0)stackendscodesegmentassumecs:code,ds:data,ss:stackmainprocfar pushds

movax,0pushax

movax,data

mov

ds,ax

movax,var

cmpax,0

jlless

jggreat

movax,0

jmpshortnextless:

movax,0ffffh

jmpshortnextgreat:

movax,0001hnext:

movresult,axretmainendpcodeendsendmain

第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*72多分支機構例4.8根據內存字節變量control被置位的情況控制程序轉移到8個子程序中的一個。;4_8.asmdatasegment

brn_tab

dwsubr1,subr2,subr3

dwsubr4,subr5,subr6

dwsubr7,subr8controldb40hdataendsstacksegmentstackdb100dup(0)stackendscodesegmentassumecs:code,ds:data,ss:stackmainprocfarStart:pushds

xor

ax,ax變量control轉入子程序00000001subr100000010subr200000100subr300001000subr400010000subr500100000subr601000000subr710000000subr8第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*73pushax

movax,data

mov

ds,axleabx,brn_tab

moval,controlgtbit:

rcral,1

jc

getagaddbx,2

jmpshortgtbitgetag:call[bx]retmainendpsubr1proc……retsubr1endp...subr8proc……retsubr8endpcodeendsendmain第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*743、循環程序設計第四章匯編語言程序設計4.5匯編語言程序設計計算機原理*75單重循環例4.9在數據段中以buffer單元開始存放10個16位二進制有符號數,把其中最大數找出來存于MAX單元中,試編程。;4_9.asmdatasegmentbufferdw-100,300

dw5281,222

dw4262,9232

dw2238,-3632

dw-3144,6322countequ($-buffer)/2maxdw?dataendsstacksegmentstackdb256dup(?)stackends

codesegment assumecs:code,ds:data,ss:stackmainprocfarstart:pushds

movax,0pushaxmovax,datamov

ds,axleabx,buffermov

cx,count-1movax,[bx]circle:incbxin

溫馨提示

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

評論

0/150

提交評論