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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

1)檢查和編排源程序,

2)對(duì)源程序中的宏指令進(jìn)行展開,

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

4)把源程序翻譯成目標(biāo)程序.obj,并產(chǎn)生源程序列表文件。.lst122、PC機(jī)匯編語言的基本結(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機(jī)匯編語言的基本結(jié)構(gòu)一般匯編程序結(jié)構(gòu)關(guān)于程序結(jié)束的說明:

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

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

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

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

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

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

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

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

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

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

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

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

(3)段定義偽指令

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

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

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

(15)宏命令偽指令253、

匯編語言的偽指令符號(hào)定義偽指令格式:

(1)符號(hào)名

EQU

表達(dá)式

(2)符號(hào)名

=

表達(dá)式

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

匯編語言的偽指令符號(hào)定義偽指令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〈表達(dá)式或數(shù)據(jù)項(xiàng)表〉

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

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

匯編語言的偽指令30

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

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

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

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

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

DB

變量名+DW+表達(dá)式1,表達(dá)式2,…DD

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

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

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

DB

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

DD

其中表達(dá)式1是重復(fù)的次數(shù),表達(dá)式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表達(dá)式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一個(gè)完整的匯編語言源程序,通常有三個(gè)部分組成,即代碼部分,數(shù)據(jù)部分和堆棧部分。8086/8088的數(shù)據(jù)部分還可進(jìn)一步分為(基本)數(shù)據(jù)部分(DS)和擴(kuò)展數(shù)據(jù)部分(ES)。段定義偽指令用于對(duì)它們進(jìn)行定義。匯編時(shí),按段生成浮動(dòng)目標(biāo)代碼;連接時(shí),將各模塊中同名段進(jìn)行組合。

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

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

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

…………

〈段名〉ENDS

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

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

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

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

assumecs:code……Start:……codeendsendstart413、

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

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

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

DATAENDS423、

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

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

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

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

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

段定義偽指令453、

匯編語言的偽指令程序結(jié)束標(biāo)志偽指令:END段定義偽指令END[標(biāo)號(hào)]END表示程序結(jié)束。其中,標(biāo)號(hào)用來告訴操作系統(tǒng),本程序開始執(zhí)行的起始地址。若有多個(gè)程序模塊,連接時(shí),只有主模塊的END要帶標(biāo)號(hào)。其它僅用END,不帶標(biāo)號(hà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 ;送功能號(hào)

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

CODE1ENDS

ENDSTART473、

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

RET

〈過程名〉ENDP

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

CALL〈過程名〉

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

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

BEGINPROC FAR…CALLNEAR

A…CALL

FARB…

BEGINENDPA PROCNEAR

RETA ENDPCODE_SEG ENDSCODE_SEG1SEGMENTB PROC FAR

…RETB ENDPCODE_SEG1ENDS

493、

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

ORG〈表達(dá)式〉

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

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

匯編語言的偽指令對(duì)準(zhǔn)偽指令格式:

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

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

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

求段基址格式:SEG〈符號(hào)名〉

(2)OFFSET

求偏移地址格式:OFFSET〈符號(hào)名〉

(3)TYPE

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

匯編語言的偽指令取值運(yùn)算符

(4)SIZE

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

(5)LENGTH

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

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

BUFFERDW200DUP(0)

則:

TYPE BUFFER

等于2

LENGTHBUFFER

等于200

SIZEBUFFER

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

匯編語言的偽指令取值運(yùn)算符舉例553、

匯編語言的偽指令屬性運(yùn)算符屬性運(yùn)算符PTR

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

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

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

MOVAX,WORDPTRD156系統(tǒng)功能調(diào)用MS-DOS系統(tǒng)中提供了DOS和BIOS兩套系統(tǒng)服務(wù)軟件,它們可以完成鍵盤輸入、信息顯示、存儲(chǔ)管理和文件操作等多種服務(wù)。BIOS是一組低級(jí)軟件程序,駐留在系統(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)部中斷:如掉電、運(yùn)算溢出、奇偶錯(cuò)硬件中斷:由中斷控制器引入的外部硬件中斷軟件中斷ROM-BIOS中斷DOS中斷584、匯編語言程序設(shè)計(jì)基本技術(shù)

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

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

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

Add:popaxpopbxaddax,bxpushax……jmp$例:求Y=3X4+5X3+6X2+4X+2的值計(jì)算過程:Y=3*X+5Y=Y*X+6Y=Y*X+4Y=Y*X+261順序程序設(shè)計(jì)4、匯編語言程序設(shè)計(jì)基本技術(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è)計(jì)4、匯編語言程序設(shè)計(jì)基本技術(shù)根據(jù)程序運(yùn)行的結(jié)果采取不同的處理,這時(shí),就需要分支程序來實(shí)現(xiàn)。分支程序有兩個(gè)分支和多個(gè)分支兩種。兩分支結(jié)構(gòu)是根據(jù)二值判斷條件,轉(zhuǎn)入其中的一支執(zhí)行。

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

CODESEGMENTASSUMECS:CODEBEGIN:

MOVAH,01H

;讀鍵盤輸入

INT21HTESTAL,1JZEVN

jnzoddodd:MOVAL,31HJMPDISPEVN:

MOVAL,30HDISP:

PUSHAXMOVAH,01HMOVDL,0AH;換行

INT21HMOVDL,0DH;回車

INT21HPOPAXMOVDL,AL;顯示

INT21HMOVAH,4CHINT21HCODEENDSENDBEGIN

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

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

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

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

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

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

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

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

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

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

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

NOP;無作用,為兩次顯示宏擴(kuò)展進(jìn)行隔離

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

(1)宏定義:對(duì)各個(gè)宏指令進(jìn)行定義,并分別起一個(gè)名字;

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論