第4章匯編語言_第1頁
第4章匯編語言_第2頁
第4章匯編語言_第3頁
第4章匯編語言_第4頁
第4章匯編語言_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章匯編語言1第四章匯編語言1、匯編語言基礎(chǔ)2、PC機匯編語言的基本結(jié)構(gòu)3、匯編語言的偽指令4、匯編語言程序設(shè)計基本技術(shù)5、匯編程序設(shè)計舉例21、匯編語言基礎(chǔ)計算機設(shè)計語言機器語言匯編語言高級語言面向機器的語言機器語言匯編語言高級語言31、匯編語言基礎(chǔ)匯編語言匯編語言是面向機器的程序設(shè)計語言。因計算機而異匯編語言的一條可執(zhí)行語句對應(yīng)機器語言的一條指令。匯編語言比機器語言更易閱讀、編寫和修改。是面向編程人員的最低級語言。匯編語言能全面地反映計算機硬件的功能與特點。匯編語言編寫的程序的優(yōu)點是,運行速度快、能充分利用硬件資源、占用存儲空間少。匯編語言廣泛用于計算機系統(tǒng)的硬件操作程序和核心系統(tǒng)軟件,是一切高級語言編譯程序的開發(fā)工具。

匯編語言程序開發(fā)周期長,對人員素質(zhì)要求高。4匯編語言源程序用助記符編寫源程序的編譯程序匯編程序匯編語言源程序機器語言目標(biāo)程序1、匯編語言基礎(chǔ)匯編語言與機器語言51、匯編語言基礎(chǔ)高級語言脫離了(微)處理器硬件,更符合人們的習(xí)慣。與(微)處理器硬件無關(guān),具有很好的通用性和可移植性。采用高級語言編程,具有比用匯編語言編程高得多的程序設(shè)計效率。高級語言是面向應(yīng)用的語言。容易學(xué)習(xí)和使用。61、匯編語言基礎(chǔ)匯編程序的功能匯編語言:用指令的助記符、符號地址、標(biāo)號等符號書寫程序的一種計算機語言。一般情況下,匯編語言程序的一條語句就是計算機的一條指令。匯編語言源程序:用匯編語言編寫的程序(簡稱源程序)。.asm匯編:把源程序翻譯成機器語言程序(目的程序)的過程。.obj匯編程序(assembler):匯編程序的主要功能是將由匯編語言(助記符)編寫的源程序翻譯成用機器語言(二進制代碼)編寫的目標(biāo)程序。下圖可用以說明這個功能。連接(LINK):將程序的各個組成部分結(jié)合成一整體的程序。.exe71、匯編語言基礎(chǔ)匯編程序的功能(1)輸入?yún)R編語言的源文件。其擴展名為:.asm。(2)用匯編程序把.asm源文件匯編成目標(biāo)文件,其擴展名為.obj,(3)用連接程序(LINK)把目標(biāo)文件.Obj,及所用到的庫文件或其它目標(biāo)文件轉(zhuǎn)換成可執(zhí)行文件.EXE。81、匯編語言基礎(chǔ)連接程序(LINK)把目標(biāo)文件.obj,及所用到的庫文件或其它目標(biāo)文件轉(zhuǎn)換成可執(zhí)行文件,.exe文件(IBMPC).exe文件為可執(zhí)行文件,在DOS操作系統(tǒng)下,直接鍵入該文件名即開始執(zhí)行。庫文件:獨立的函數(shù)過程等文件。集成環(huán)境WAVE6000:將匯編,連接、調(diào)試、運行等集成在一個系統(tǒng)中。91、匯編語言基礎(chǔ)基本匯編和宏匯編(MacroASseMbler)匯編程序是將匯編語言源程序翻譯成機器語言的程序。

按用戶要求自動分配存儲區(qū)(包括程序區(qū)、數(shù)據(jù)區(qū)、堆棧區(qū)等);數(shù)制轉(zhuǎn)換;計算常數(shù)表達式的值;對源程序進行語法檢查,給出錯誤信息等功能。基本匯編程序。宏匯編(MacroASseMbler):在基本匯編程序的基礎(chǔ)上,允許將一組匯編語言語句序列定義為一條宏指令的匯編程序。

101、匯編語言基礎(chǔ)宏指令或宏命令將一組匯編語言語句序列定義為一個功能塊,并賦予一個名字,其表示形式尤如一條計算機指令,并且在隨后的匯編語言源程序中,可以象CPU的其它指令一樣使用。宏指令或宏命令簡稱為“宏”MACRO。宏可以用與原來的計算機指令一樣的符號。111、匯編語言基礎(chǔ)宏匯編的主要功能

1)檢查和編排源程序,

2)對源程序中的宏指令進行展開,

3)檢查源程序中的語法錯誤,并給出出錯信息,

4)把源程序翻譯成目標(biāo)程序.obj,并產(chǎn)生源程序列表文件。.lst122、PC機匯編語言的基本結(jié)構(gòu)一般匯編程序結(jié)構(gòu)datasegmenta1db12h……dataendsexdatasegmente1dd1234h……exdataendsstacksegment'stack'stdw100hspointequ200hstackendscodesegmentassumecs:code,ds:data,es:exdata,ss:stackstart:movax,datamovds,axmovax,exdatamoves,axmovax,stackmovss,axmovsp,spoint

movah,04chjmp$int21codeendsendstart132、PC機匯編語言的基本結(jié)構(gòu)一般匯編程序結(jié)構(gòu)關(guān)于程序結(jié)束的說明:

……MOVAH,4CH;DOS功能調(diào)用

INT21H;返回DOS操作系統(tǒng)在DOS操作系統(tǒng)下運行程序的過程:輸入運行程序名(.exe)文件,按返回鍵,開始運行。運行到程序結(jié)束時執(zhí)行上面指令后,DOS重新獲得控制權(quán)。實驗系統(tǒng)沒有DOS操作系統(tǒng),為了防止系統(tǒng)崩潰,程序的最后一條為:

JMP$;等待142、PC機匯編語言的基本結(jié)構(gòu)匯編語言的語句類型指令性語句指示性語句CPU執(zhí)行的語句,能夠生成目標(biāo)代碼CPU不執(zhí)行,而由匯編程序執(zhí)行的語句,不生成目標(biāo)代碼152、PC機匯編語言的基本結(jié)構(gòu)匯編語言的語句類型指令性語句:[標(biāo)號:][前綴]助記符[操作數(shù)],[操作數(shù)][;注釋]指令的符號地址,標(biāo)號后要有冒號操作碼注釋前加分號指示性語句格式:[名字]偽指令助記符操作數(shù)[,操作數(shù),…][;注釋]變量的符號地址,其后不加冒號指示性語句中至少有一個操作數(shù)162、PC機匯編語言的基本結(jié)構(gòu)匯編語言的語句類型標(biāo)號后有冒號,在指令性語句前;名字后不加冒號,在指示性語句前。英文字母、數(shù)字及專用字符組成,最大長度不能超過31個,且不能由數(shù)字打頭,不能用保留字(如寄存器名,指令助記符,偽指令)。 區(qū)分標(biāo)號和名字1718數(shù)據(jù)項和表達式寄存器存儲器單元常量變量或標(biāo)號表達式操作數(shù)2、PC機匯編語言的基本結(jié)構(gòu)匯編語言的語句類型19常量數(shù)字常量:沒有任何屬性的純數(shù)值。在匯編期間,它的值已能完全確定,且在程序運行中,它也不會發(fā)生變化。字符串常量:用引號引起的字符或字符串‘A’,’ABCD’匯編時被譯成對應(yīng)的ASCII碼41H,42H,43H,44H2、PC機匯編語言的基本結(jié)構(gòu)匯編語言的語句類型20常數(shù)的應(yīng)用

在程序中,常數(shù)主要出現(xiàn)在:

1)指令語句源操作數(shù)中做立即數(shù),它應(yīng)與目的操作數(shù)的位數(shù)相一致,可以是8位或16位的。

2)在指令語句中的基址加變址的尋址方式中作位移量。

3)在數(shù)據(jù)定義偽指令中。

例:

MOVAX,1234HMOVBX,[SI+32H]DB12H

;定義一個字節(jié)數(shù)據(jù)2、PC機匯編語言的基本結(jié)構(gòu)匯編語言的語句類型21變量

變量是代表存放在某些存儲單元的數(shù)據(jù),這些數(shù)據(jù)在程序運行期間隨時可以修改。為了便于對變量的訪問,它常常以變量名的形式出現(xiàn)程序中,它可以認為是存放在數(shù)據(jù)存儲單元的符號地址。(1)變量的定義與預(yù)置(2)數(shù)據(jù)定義偽指令2、PC機匯編語言的基本結(jié)構(gòu)匯編語言的語句類型2、PC機匯編語言的基本結(jié)構(gòu)匯編語言的語句類型操作碼指令碼命令CPU要完成的操作偽指令助記符指示匯編程序要完成的操作用來定義變量,分配存儲單元指示程序開始和結(jié)束等注釋用分號作為注釋的開始用于說明程序或語句的功能,以便于閱讀和理解223、

匯編語言的偽指令由匯編程序執(zhí)行的“指令系統(tǒng)”。偽指令沒有對應(yīng)的機器指令,它不是由8086/8088CPU來執(zhí)行,而是由MASM-86識別,并完成相應(yīng)的功能。用于定義變量、分配存儲區(qū)、定義邏輯段、指示程序開始和結(jié)束等偽指令23

標(biāo)號名偽指令操作數(shù)注釋這是一個任選字段。標(biāo)號名后面不能用冒號“:”,這是它與指令語句的突出區(qū)別。不同的偽指令,標(biāo)號名可以是常量名、變量名、過程名、結(jié)構(gòu)名、記錄名等。它們可以作為偽指令語句和指令語句的操作數(shù),這時,標(biāo)號名就表示一個常量或存儲器地址。

這是偽指令語句不可省略的主要成分。偽指令種類很多,如定義數(shù)據(jù)偽指令DB,DW,DD;段定義偽指令SEGMENT;定義過程偽指令PROC等。它們是偽指令語句要求匯編程序完成的具體操作命令。本字段是否需要,需要幾個,需要什么樣的操作數(shù)等都由偽指令字段中偽指令來確定。操作數(shù)可以是一個常數(shù)、字符串、常量名、變量名、標(biāo)號、一些專用的符號等。這是一個任選字段,它必須以分號為開始,它的作用與指令語句的注釋字段相同。3、

匯編語言的偽指令偽指令243、

匯編語言的偽指令偽指令MASM-86識別的偽指令可分成以下幾類:

(1)符號定義偽指令(8)定位偽指令

(2)內(nèi)存數(shù)據(jù)定義偽指令(9)列表偽指令

(3)段定義偽指令

(10)系統(tǒng)隱含進位制偽指令

(4)段寄存器說明偽指令(11)連接偽指令

(5)子程序定義偽指令(12)記錄偽指令(6)模塊開始偽指令(13)結(jié)構(gòu)偽指令(7)模塊結(jié)束偽指令(14)塊注釋偽指令

(15)宏命令偽指令253、

匯編語言的偽指令符號定義偽指令格式:

(1)符號名

EQU

表達式

(2)符號名

=

表達式

作用:把表達式的值賦給符號名。區(qū)別:在同一程序中,用EQU語句賦值的符號名不能被重新賦值,但用“=”號賦值的符號名可以被重新賦值。表達式可以是常數(shù)、數(shù)值表達式、地址表達式、變量、標(biāo)號名或助記符等。符號名以字母開頭,可以包括字母、數(shù)字、下劃線等。匯編語言中有一些保留的關(guān)鍵詞,不能用作符號名。等值語句最簡單的用法是定義常數(shù)。263、

匯編語言的偽指令符號定義偽指令datasegmenta1db12hb1equa1c1equ12h+34one=1close=0night=1d1=c1VAR1EQU[BP-10]dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovbp,14movax,var1nopcodeendsendstart273、

匯編語言的偽指令內(nèi)存數(shù)據(jù)定義偽指令用于定義數(shù)據(jù)區(qū)中變量的類型此指令主要有以下五大類:字節(jié)定義偽指令DB定義的變量為字節(jié)型字定義偽指令DW定義的變量為字類型四字節(jié)定義偽指令DD定義的變量為雙字型八字節(jié)定義偽指令DQ定義的變量為4字型十字節(jié)定義偽指令DT定義的變量為10字節(jié)型283、

匯編語言的偽指令內(nèi)存數(shù)據(jù)定義偽指令29字節(jié)定義偽指令格式:[名字]DB〈表達式或數(shù)據(jù)項表〉

表達式值或項表中的每一項是一個字節(jié)數(shù),它們從符號名地址開始按字節(jié)連續(xù)存放,直到表中數(shù)據(jù)項結(jié)束(地址遞增方向)。方括號[]表示該項可以缺省。字定義偽指令格式:[名字]DW〈表達式或數(shù)據(jù)項〉

除表達式值或項表中的每一項是兩個字節(jié)數(shù)之外,其它與DB偽指令相同。3、

匯編語言的偽指令30

格式:[名字]DD〈表達式或數(shù)據(jù)項〉

表達式值或項表的每一項是四個字節(jié)數(shù)。八字節(jié)定義偽指令格式:[名字]DQ〈表達式或數(shù)據(jù)項表〉

表達式值或數(shù)據(jù)項表的每一項是八字節(jié)數(shù),各項從小地址一端連續(xù)存放,允許浮點數(shù)形式,與DD偽指令相同。高四個字節(jié)填0。內(nèi)存數(shù)據(jù)定義偽指令四字節(jié)定義偽指令3、

匯編語言的偽指令31內(nèi)存數(shù)據(jù)定義偽指令格式:[名字]DT〈表達式或數(shù)據(jù)項表〉表達式值或數(shù)據(jù)項表的每一項是10個字節(jié)數(shù),允許浮點數(shù)形式,與DQ偽指令相同,若項表中的數(shù)據(jù)項是十進制整數(shù)書寫的,匯編程序按組合的BCD碼格式存放,最低字節(jié)在高地址一端存放,數(shù)據(jù)的最高字節(jié)的最高位是符號位,“0”表示正,“1”表示負。十字節(jié)定義偽指令3、

匯編語言的偽指令32內(nèi)存數(shù)據(jù)定義偽指令該偽指令主要為數(shù)據(jù)項分配存儲單元并預(yù)初值。該偽指令構(gòu)成的語句格式是:

DB

變量名+DW+表達式1,表達式2,…DD

其中表達式1,表達式2,…是給變量賦予的初值。表達式可以有如下幾種情況:

(1)數(shù)值表達式(2)?表達式(3)字符串表達式(4)帶DUP表達式3、

匯編語言的偽指令33內(nèi)存數(shù)據(jù)定義偽指令帶DUP表達式DUP是定義重復(fù)數(shù)據(jù)操作符。使用DUP操作符格式是:

DB

變量名+DW+表達式1DUP(表達式2)

DD

其中表達式1是重復(fù)的次數(shù),表達式2是重復(fù)的內(nèi)容

BB1DB12HDUP(’ABCD’)

BB2DW10HDUP(4)3、

匯編語言的偽指令34ARRAY1DB2DUP(0,1,2,?)ARRAY2DB100DUP(0,2DUP(1,2),0,3)內(nèi)存數(shù)據(jù)定義偽指令帶DUP表達式3、

匯編語言的偽指令35內(nèi)存數(shù)據(jù)定義偽指令datasegmentadb10h,2dup(0EEH),2dup(?)db2dup(30h,0afh)strdb'abcde','hello'wdw0abcdh,2345h,2dup(8765h)qqdq012345678httdt1000000000066778899aahdataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axnopnopcodeendsendstart3、

匯編語言的偽指令段定義偽指令36一個完整的匯編語言源程序,通常有三個部分組成,即代碼部分,數(shù)據(jù)部分和堆棧部分。8086/8088的數(shù)據(jù)部分還可進一步分為(基本)數(shù)據(jù)部分(DS)和擴展數(shù)據(jù)部分(ES)。段定義偽指令用于對它們進行定義。匯編時,按段生成浮動目標(biāo)代碼;連接時,將各模塊中同名段進行組合。

8088/8086中有四個段寄存器:CS,DS,ES,SS。3、

匯編語言的偽指令37段定義偽指令存儲器在邏輯上是分段的,各段的定義由偽指令實現(xiàn)格式:

〈段名〉SEGMENT[定位類型][組合類型][類別名]

…………

〈段名〉ENDS

段定義偽指令為程序的匯編和連接說明了段名、分段的各種屬性以及分段的開始和結(jié)束。段名是自定義符,開始的段名與結(jié)束的段名必須相同。段的長度不超過64KB(字節(jié))。SEGMENT后面的參數(shù)是可選項。383、

匯編語言的偽指令段定義偽指令段定位類型Byte:本段可以從任意一個字節(jié)邊界起始。Word:本段必須從字的邊界起始。Para:段基址的最低4位的二進制數(shù)值必須為全0。隱含為該類型。Page:段基址的最低8位的二進制數(shù)值必須為全0。393、

匯編語言的偽指令組合類型段定義偽指令public:與其它同名段連接在一起,形成一個新的邏輯段common:與其它的同名段具有相同的起始地址,重疊,按最大的分配空間。None:與其它段沒有關(guān)系atexpression:本段的起始地址為由atexpression計算出來的值。它不能用來指定代碼段的段基址。stack:產(chǎn)生堆棧段,并把所有同名段連成一個新的邏輯段。Memory:表示本段應(yīng)被放置在所有其它段的前面(最高地址處)。第一個段作為memory段,其他段都作為common段403、

匯編語言的偽指令段定義偽指令代碼段定義偽指令codesegmentpublic‘code’;定義一個代碼段

assumecs:code……Start:……codeendsendstart413、

匯編語言的偽指令段定義偽指令數(shù)據(jù)段定義偽指令DATASEGMENNTMDB2DUP(0,0);定義兩個兩字節(jié)的單元,并賦初值0,0XDB2DUP(30H,2DUP(4))

;定義兩個以字節(jié)為單元的空間,每個空間又定義為,1個字節(jié)單元,并賦初值3;和兩次重復(fù)的2個字節(jié)單元,賦初值4。因此共定義了6個字節(jié)的存儲空間。

YDW100DUP(?);定義100個字的單元。

DATAENDS423、

匯編語言的偽指令段定義偽指令堆棧段定義偽指令stacksegment‘stack’;定義一個堆棧段

dw100dup(?)stackends定義一個堆棧段,并賦100字(200個字節(jié))空間的。433、

匯編語言的偽指令段定義偽指令關(guān)于堆棧段堆棧也是一個存儲區(qū),但它不按存儲單元編號使用。堆棧組成:段地址:SS

堆棧指針:SP指向當(dāng)前棧頂。堆棧操作:減二,再壓棧。8088先壓棧頂,再壓下一個字節(jié)。443、

匯編語言的偽指令段寄存器說明偽指令assume段寄存器名:段名[,段寄存器名:段名……]8088/8086中,段寄存器名必須是CS,DS,ES或SS之一。段名必須是用segment/ends偽指令定義過的段名。本偽指令的功能是將定義的段與段寄存器關(guān)聯(lián)起來。在assume語句中,對于CS段寄存器,它不僅把相應(yīng)的段分配給CS寄存器,還由操作系統(tǒng)直接將段基址裝入到CS寄存器中。對于其它段寄存器(DS,ES,SS),則是指定把某個段分配給哪一個寄存器,而沒有將段基址裝入到相應(yīng)的段基址中,因此,要在程序中對DS,ES,SS賦值。程序中不必也不能對CS寄存器賦值

段定義偽指令453、

匯編語言的偽指令程序結(jié)束標(biāo)志偽指令:END段定義偽指令END[標(biāo)號]END表示程序結(jié)束。其中,標(biāo)號用來告訴操作系統(tǒng),本程序開始執(zhí)行的起始地址。若有多個程序模塊,連接時,只有主模塊的END要帶標(biāo)號。其它僅用END,不帶標(biāo)號。匯編程序應(yīng)盡量按照程序規(guī)定的格式編寫。

463、

匯編語言的偽指令段定義偽指令DATA1SEGMENT ;數(shù)據(jù)段

XDB05H YDB04H ZDB?DATA1ENDS

CODE1SEGMENT ;代碼段

ASSUMECS:CODE,DS:DATASTART:

MOVAX,DATA ;數(shù)據(jù)段基址→AXMOVDS,AX ;AX→DS MOVAL,X ;內(nèi)存單元X的數(shù)據(jù)→AL ADDAL,Y ;內(nèi)存單元Y的數(shù)據(jù)+AL→AL,即X+Y→AL MOVZ,AL;AL→內(nèi)存單元Z,即求和結(jié)果送回Z

MOVAH,4CH ;送功能號

INT21H ;系統(tǒng)功能調(diào)用,返回操作系統(tǒng)

CODE1ENDS

ENDSTART473、

匯編語言的偽指令子程序定義偽指令專門的程序塊稱為過程,也稱為子程序。在需要的時候通過調(diào)用指令(CALL)調(diào)用。在匯編語言中,過程用過程定義偽指令來定義和實現(xiàn)。定義格式:〈過程名〉PROC[NEAR](或[FAR])…………

RET

〈過程名〉ENDP

過程名是自定義符。定義過程是為實現(xiàn)子程序調(diào)用而設(shè)的。調(diào)用格式為:

CALL〈過程名〉

過程由RET指令返回,它可以不是最后一條指令,它在過程中可以設(shè)多點返回。并且過程起始名和終止名必須相同。483、

匯編語言的偽指令子程序定義偽指令CODE_SEG SEGMENT

BEGINPROC FAR…CALLNEAR

A…CALL

FARB…

BEGINENDPA PROCNEAR

RETA ENDPCODE_SEG ENDSCODE_SEG1SEGMENTB PROC FAR

…RETB ENDPCODE_SEG1ENDS

493、

匯編語言的偽指令定位偽指令格式:

ORG〈表達式〉

該偽指令把以下語句定義的內(nèi)存數(shù)據(jù)或程序,從表達式指定的起點(偏移地址)開始連續(xù)存放,直至遇到新的ORG指令。表達式的值是一個無符號數(shù)。DATASEGMENT

ORG0100HD1DB11H,22H,33HDATAENDS112233DS:0100計算值為非負常數(shù)503、

匯編語言的偽指令對準偽指令格式:

EVEN使下一個字節(jié)地址成為偶數(shù)DATASEGMENTD1DB56H(EVEN)D2DW7890HDATAENDS513、

匯編語言的偽指令取值運算符用于分析存儲器操作數(shù)的屬性O(shè)FFSET取得其后變量或標(biāo)號的偏移地址SEG取得其后變量或標(biāo)號的段地址TYPE取變量的類型LENGTH取所定義存儲區(qū)的長度SIZE取所定義存儲區(qū)的字節(jié)數(shù)523、

匯編語言的偽指令取值運算符取值運算符的格式:(1)SEG

求段基址格式:SEG〈符號名〉

(2)OFFSET

求偏移地址格式:OFFSET〈符號名〉

(3)TYPE

求符號名類型值格式:TYPE〈符號名〉類型1字節(jié)2字節(jié)4字節(jié)8字節(jié)10字節(jié)近程遠程類型值124810-1-2533、

匯編語言的偽指令取值運算符

(4)SIZE

求為符號名分配的字節(jié)數(shù)格式:SIZE〈符號名〉

(5)LENGTH

求為符號名分配的項數(shù)格式:LENGTH〈符號名〉

注意:SIZE和LENGTH要求為符號名定義的數(shù)據(jù)項必須是用重復(fù)格式DUP()定義的。54若BUFFER存儲區(qū)是用如下偽指令定義:

BUFFERDW200DUP(0)

則:

TYPE BUFFER

等于2

LENGTHBUFFER

等于200

SIZEBUFFER

等于400注意:SIZE=TYPE*LENGTH3、

匯編語言的偽指令取值運算符舉例553、

匯編語言的偽指令屬性運算符屬性運算符PTR

用于指定其后存儲器操作數(shù)的類型

格式:(類型)PTR(符號名)例1:MOVBYTEPTR[BX],12H

例2:已知內(nèi)存變量D1是字節(jié)屬性,要把它的兩個字節(jié)內(nèi)容送到AX中。

MOVAX,WORDPTRD156系統(tǒng)功能調(diào)用MS-DOS系統(tǒng)中提供了DOS和BIOS兩套系統(tǒng)服務(wù)軟件,它們可以完成鍵盤輸入、信息顯示、存儲管理和文件操作等多種服務(wù)。BIOS是一組低級軟件程序,駐留在系統(tǒng)的ROM內(nèi)存區(qū)。而DOS提供了更加容易使用和方便移植的功能服務(wù),是操作系統(tǒng)提供的。系統(tǒng)功能調(diào)用即為調(diào)用系統(tǒng)提供的中斷服務(wù)程序,完成相應(yīng)服務(wù)。57系統(tǒng)功能調(diào)用DOS中斷系統(tǒng)內(nèi)部中斷:如掉電、運算溢出、奇偶錯硬件中斷:由中斷控制器引入的外部硬件中斷軟件中斷ROM-BIOS中斷DOS中斷584、匯編語言程序設(shè)計基本技術(shù)

程序是為了完成特定任務(wù)的一系列指令的有序集合。一個好的程序,除能正常運行,實現(xiàn)要求的功能外,還應(yīng)具有結(jié)構(gòu)清晰、可讀性強、執(zhí)行速度快、占用內(nèi)存少等特點。

匯編語言程序中,最常見的程序形式有順序程序、分支程序、循環(huán)程序和子程序。這幾種程序的設(shè)計方法是匯編程序設(shè)計的基礎(chǔ)。此外宏匯編程序中還有“宏”定義。594、匯編語言程序設(shè)計基本技術(shù)匯編程序基本設(shè)計技術(shù)順序程序設(shè)計分支程序設(shè)計循環(huán)程序設(shè)計子程序設(shè)計宏命令程序設(shè)計60順序程序設(shè)計4、匯編語言程序設(shè)計基本技術(shù)

順序程序是最簡單的程序,它的執(zhí)行順序和程序中指令的排列順序完全一致。也就是從程序的第一條指令開始,依次執(zhí)行,直到程序的最后一條指令,執(zhí)行完成,退出。

Add:popaxpopbxaddax,bxpushax……jmp$例:求Y=3X4+5X3+6X2+4X+2的值計算過程:Y=3*X+5Y=Y*X+6Y=Y*X+4Y=Y*X+261順序程序設(shè)計4、匯編語言程序設(shè)計基本技術(shù)DSEGSEGMENT;數(shù)據(jù)段定義

XDB5H;假定X=5HYDW0DSEGENDSCODESEGMENTASSUMECS:CODE,DS:DSEGBEGIN:

MOVAX,DSEGMOVDS,AXMOVAX,0MOVAL,3MOVBH,0MOVBL,X;BL=X

MULBXADDAX,5;AX=3*X+5MULBXADDAX,6;AX=……MULBXADDAX,4MULBXADDAX,2MOVY,AX;保留結(jié)果

MOVAH,4CHINT21H;返回DOSjmp$CODEENDSENDBEGIN

源程序如下:62分支程序設(shè)計4、匯編語言程序設(shè)計基本技術(shù)根據(jù)程序運行的結(jié)果采取不同的處理,這時,就需要分支程序來實現(xiàn)。分支程序有兩個分支和多個分支兩種。兩分支結(jié)構(gòu)是根據(jù)二值判斷條件,轉(zhuǎn)入其中的一支執(zhí)行。

采用條件轉(zhuǎn)移指令實現(xiàn)分支程序。對分支程序,盡量在分支運行結(jié)束再匯合到一處,繼續(xù)執(zhí)行。也就是說,一個功能段只有一個入口與一個出口。popaxandax,0ffffhjs,negativepositive:……jmpfinishnegative:……finish:……634、匯編語言程序設(shè)計基本技術(shù)分支程序設(shè)計644、匯編語言程序設(shè)計基本技術(shù)分支程序設(shè)計

CODESEGMENTASSUMECS:CODEBEGIN:

MOVAH,01H

;讀鍵盤輸入

INT21HTESTAL,1JZEVN

jnzoddodd:MOVAL,31HJMPDISPEVN:

MOVAL,30HDISP:

PUSHAXMOVAH,01HMOVDL,0AH;換行

INT21HMOVDL,0DH;回車

INT21HPOPAXMOVDL,AL;顯示

INT21HMOVAH,4CHINT21HCODEENDSENDBEGIN

654、匯編語言程序設(shè)計基本技術(shù)循環(huán)程序設(shè)計重復(fù)執(zhí)行某一計算過程

循環(huán)程序由初始化部分、主循環(huán)體(工作部分)、循環(huán)修改部分、循環(huán)控制部分和結(jié)束處理部分組成。

循環(huán)控制的方法有計數(shù)控制法和條件控制法。LOOP指令,DEC+JZ(JNZ)DeccxinccxjnexxxJnzxxxcmpcx,xx循環(huán)程序設(shè)計要注意循環(huán)層次,循環(huán)寄存器的使用。CX為LOOP指令指定的寄存器,當(dāng)需要多重循環(huán)時,其它的循環(huán)次數(shù)不能用CX。如何解決多重循環(huán)?664、匯編語言程序設(shè)計基本技術(shù)循環(huán)程序設(shè)計674、匯編語言程序設(shè)計基本技術(shù)子程序設(shè)計子程序是一種相對獨立的程序段,它實現(xiàn)某一特定的功能,比如求sin(X)等。子程序是用過程定義偽指令PROC/ENDP定義的程序段。

主程序和子程序是相對的,子程序也可以通過CALL指令調(diào)用子程序,稱為子程序嵌套調(diào)用。子程序通過RET指令返回調(diào)用它的主程序。參數(shù)的傳遞一般有三種方式,寄存器傳遞參數(shù)、堆棧傳遞參數(shù)和存儲器傳遞參數(shù)。堆棧傳遞參數(shù)如何處理?子程序嵌套調(diào)用的層數(shù)只受堆棧深度的影響。684、匯編語言程序設(shè)計基本技術(shù)子程序定義子程序是用過程定義偽指令PROC/ENDP定義的程序段。定義時要注意類型屬性的選擇,一般原則為在偽指令中已介紹過:(1)主程序和子程序在同一代碼段,可定義為NEAR屬性或FAR屬性。(2)主程序和子程序在不同代碼段,定義為FAR屬性。(3)主程序一般定義為FAR屬性。PC機上的應(yīng)用程序(.exe文件)看作是DOS調(diào)用的一個子程序,而DOS對應(yīng)用程序的調(diào)用和返回都是FAR屬性的。694、匯編語言程序設(shè)計基本技術(shù)子程序調(diào)用和工作過程用CALL指令調(diào)用子程序,將IP(CS)內(nèi)容壓入堆棧,此時IP(CS)內(nèi)容是什么?將調(diào)用的子程序的第一條指令起始的地址送IP(CS)執(zhí)行子程序所有子程序最后一條執(zhí)行指令必須為RET當(dāng)執(zhí)行到RET指令時將保留的(CS)IP從堆棧中彈出,從緊隨調(diào)用指令的下一條指令繼續(xù)執(zhí)行。實驗:設(shè)計子程序,并分析執(zhí)行時序704、匯編語言程序設(shè)計基本技術(shù)子程序調(diào)用和工作過程子程序保護執(zhí)行時所使用的寄存器的內(nèi)容(作為主程序和子程序傳遞參數(shù)的寄存器除外)在返回主程序之前再恢復(fù)這些寄存器的內(nèi)容。一般,子程序用PUSH指令將寄存器的內(nèi)容保存在系統(tǒng)堆棧中,在返回前用指令POP指令將保護內(nèi)容彈出堆棧,恢復(fù)寄存器的內(nèi)容。注意堆棧的先進后出的特點,最先壓進堆棧的數(shù)據(jù)最后彈出。714、匯編語言程序設(shè)計基本技術(shù)子程序調(diào)用和工作過程子程序還可以調(diào)用其它子程序,稱為子程序的嵌套調(diào)用,有些子程序還能調(diào)用自身,這種調(diào)用稱為遞歸調(diào)用。子程序嵌套調(diào)用的的層數(shù)不受限制,只要堆??臻g允許。但遞歸調(diào)用要注意遞歸的出口條件,防止發(fā)生死循環(huán)和陷入無限嵌套。724、匯編語言程序設(shè)計基本技術(shù)子程序庫子程序是完成某個特定功能的程序。如三角函數(shù)計算,如浮點-定點轉(zhuǎn)換等可以事先設(shè)計和調(diào)試好,并將它們集中組織成為子程序庫,供應(yīng)用程序中調(diào)用。如C庫函數(shù)。734、匯編語言程序設(shè)計基本技術(shù)宏指令宏指令是另一種具有獨立功能的程序段。宏指令也稱宏命令(宏功能,簡稱“宏”)它與子程序的功能與組成十分相似,但是兩個完全不同的程序技術(shù),并且一般它們的應(yīng)用領(lǐng)域也不同。

宏基本上用于核心功能程序的開發(fā)。744、匯編語言程序設(shè)計基本技術(shù)宏指令的定義格式:

宏名MACRO[形式參數(shù)1,形式參數(shù)2,…]

ENDM功能:宏命令偽指令為指令序列定義一個宏名,稱為宏指令,宏名可以像指令一樣在程序中引用。

...…宏體(指令序列)754、匯編語言程序設(shè)計基本技術(shù)宏指令的定義當(dāng)代換指令中的符號時,在其前面需加一個宏代換符&

例如:AD1MACROY,XMOVCL,XRO&YAX,CLENDM宏調(diào)用:經(jīng)宏代換語句定義的宏名,在應(yīng)用時可直接引用,這個過程稱為宏調(diào)用。例如:AD1R,5

注意:宏調(diào)用時,形式參數(shù)要用實在的參數(shù)取代,順序也應(yīng)與形式參數(shù)順序相同。764、匯編語言程序設(shè)計基本技術(shù)宏指令的定義舉例CODESEGMENTSHIFTMACROA,B,C;宏定義

MOVCL,CS&AB,CL;形參為指令助記符的一部分,加前綴&ENDMMAIN:NOPMOVBX,0FFHSHIFTHL,BX,3;宏調(diào)用,實現(xiàn)左移功能

NOP;無作用,為兩次顯示宏擴展進行隔離

NOPMOVAX,055HSHIFTHR,AX,2;宏調(diào)用,實現(xiàn)右移功能NOPCODEENDSENDMAIN774、匯編語言程序設(shè)計基本技術(shù)宏指令的使用宏指令的使用步驟:

(1)宏定義:對各個宏指令進行定義,并分別起一個名字;

(2)宏調(diào)用:在需要使用的地方,通過宏指令名來調(diào)用它;

(3)宏擴展:由宏匯編程序用宏定義中的指令來代替宏調(diào)用中的宏指令名。784、匯編語言程序設(shè)計基本技術(shù)宏調(diào)用和宏擴展宏指令名在源程序中的出現(xiàn)稱為宏調(diào)用。宏調(diào)用的格式宏指令名[實參量,實參,……]宏指令名必須與宏定義中的宏指令名一致,其后的實參可以是數(shù)字、字符串、符號名或尖括號括起來的帶間隔符的字符串。實參在順序、屬性、類型上要同形參保持一致,個數(shù)與形參應(yīng)相等。用實參代

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論