第5章匯編語言與程序設(shè)計_第1頁
第5章匯編語言與程序設(shè)計_第2頁
第5章匯編語言與程序設(shè)計_第3頁
第5章匯編語言與程序設(shè)計_第4頁
第5章匯編語言與程序設(shè)計_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章

匯編語言與程序設(shè)計5.1匯編語言基礎(chǔ)計算機語言包括:面向機器的語言機器語言匯編語言高級語言

匯編語言:用助記符表示指令匯編語言源程序:用匯編語言編寫的程序匯編程序:編譯匯編語言源程序的程序程序設(shè)計與執(zhí)行過程建立源程序(文件名.ASM)編譯成目標(biāo)文件(文件名.OBJ)生成可執(zhí)行文件(文件名.EXE)調(diào)試和運行程序用編輯軟件(如EDIT.EXE)用匯編程序(如TASM.EXE)用鏈接程序(如TLINK.EXE)用調(diào)試程序(如TD.EXE)也可直接運行可執(zhí)行文件

匯編語言包括的語句

指令性語句:

CPU執(zhí)行的指令,編譯后生成目標(biāo)代碼,要求的操作在執(zhí)行程序時完成。

指示性語句:

CPU不執(zhí)行的指令,編譯后生不生成目標(biāo)代碼,要求的操作由匯編程序完成。下面分別介紹指令性語句由CPU執(zhí)行的指令,編譯后生成目標(biāo)代碼語句格式:[標(biāo)號:][前綴]助記符[操作數(shù)],[操作數(shù)][;注釋]例MIUS:ADDAX,BX;加法指令I(lǐng)NCBX;BX加1指令的符號地址操作碼注釋前加分號指示性語句CPU不執(zhí)行的指令;由匯編程序執(zhí)行,編譯后不生成目標(biāo)代碼;用于分配內(nèi)存空間、定義變量、指示程序開始和結(jié)束等。指令格式:[名字]偽指令助記符操作數(shù)[,操作數(shù),…][;注釋]

例YEQU100;用符號(變量)Y代替數(shù)據(jù)100指示性語句中的操作數(shù)可以是:寄存器存儲器單元常量:數(shù)值或字符、字符串變量:代表內(nèi)存的數(shù)據(jù)區(qū),程序視為存儲器操作數(shù)表達式:可包括各種運算符5.2常用偽指令段定義偽指令指定段寄存器偽指令過程定義偽指令變量定義偽指令符號定義偽指令下面分別介紹段定義偽指令

說明邏輯段的起始和結(jié)束說明不同程序模塊中同類邏輯段之間的聯(lián)系形態(tài)段名SEGMENT[定位類型][組合類型][’類別’]

┇段名ENDS例定義數(shù)據(jù)段

DATASEGMENT

MEM1DB11H,22HMEM2DW1234H

DATAENDS說明邏輯段的起點段的類別與其他段的關(guān)系指定段寄存器偽指令功能:用于說明指向邏輯段的寄存器格式:ASSUME段寄存器名:段名[,段寄存器名:段名,…]例

DATASEGMENT;定義數(shù)據(jù)段

┇DATAENDSCODESEGMENT;定義代碼段ASSUMECS:CODE,DS:DATA;指定段寄存器

CODEENDS過程定義偽指令和返回指令過程定義偽指令用于定義過程體格式:過程名PROC[NEAR/FAR]┇RET過程名ENDP

過程的返回指令:RET該指令一般位于子程序的最后用于從堆棧中彈出斷點地址,返回原程序。

變量定義偽指令DB/DW/DD變量定義偽指令用于在數(shù)據(jù)段中定義變量,并按照變量類型分配存儲單元和賦初值。格式1:[變量名]{DB/DW/DD}表達式格式2:[變量名][重復(fù)次數(shù)]{DB/DW/DD}DUP表達式例如:ONEDB25H;定義1個字節(jié)變量ONE,存入初值25HTWODB5,7;定義2個連續(xù)的字節(jié)單元,分別存入初值5和7THREEDB?;定義1個字節(jié),數(shù)據(jù)任意DATA1DW1234H;定義1個字(2個字節(jié)),存入數(shù)據(jù)1234H

符號定義偽指令(EQU/=)

符號定義偽指令用于為常量、變量、表達式或其他符號定義一個名字,但不分配內(nèi)存單元。格式1:符號名EQU數(shù)值表達式格式2:符號名=數(shù)值表達式例如:CONSTANTEQU10;用符號CONSTANT表示常數(shù)10VAREQU30H+99H;用符號VAR表示表達式30H+99HPURGECONSTANT;解除符號CONSTANT,以便重新定義CONSTANTEQU20;用符號CONSTANT表示常數(shù)20DATA=3;用符號DATA表示3DATA=4;把符號DATA改為表示4匯編語言程序設(shè)計

簡單程序設(shè)計入門匯編語言程序在一些對內(nèi)存儲器容量和存取速度要求比較高的情況下,如I/O接口驅(qū)動程序、實時控制程序、系統(tǒng)軟件等設(shè)計中常被使用,而且比用高級語言仿佛還要便當(dāng)些。其實,用匯編語言編寫程序,首先確定算法,然后緊緊抓住每條指令的格式、功能以及數(shù)據(jù)的尋址方式,用戶也可以編寫出高質(zhì)量的匯編語言程序。1.寄存器的加法

下面給出了一個簡單的匯編語言程序段,是用寄存器EAX、EBX、ECX和EDX實現(xiàn)加法運算,依此來說明寄存器加法是如何用匯編語言實現(xiàn)的。形成的32位的累加和被存放在EAX寄存器。

;4個32位寄存器EAX,EBX,ECX與EDX內(nèi)容相加,累加和存放在EAX內(nèi)┋ADDEAX,EBX;EBX寄存器內(nèi)容與EAX寄存器內(nèi)容相加,結(jié)果存放在EAX上ADDEAX,ECX;ECX寄存器內(nèi)容與EAX寄存器內(nèi)容相加,結(jié)果存放在EAX上ADDEAX,EDX;EDX寄存器內(nèi)容與EAX寄存器內(nèi)容相加,結(jié)果存放在EAX上┋2.存儲器與寄存器加法

用存儲器中的數(shù)據(jù)與寄存器中的內(nèi)容進行操作運算,是用存放在存儲器的數(shù)據(jù)段內(nèi),其偏移地址為NUMB和NUMB+1的兩個連續(xù)單元的字節(jié)數(shù)據(jù),與AX寄存器的內(nèi)容進行累加,其累加和存放在AX寄存器上。

;用NUMB與NUMB+l存儲單元內(nèi)的數(shù)據(jù)與AL寄存器內(nèi)容進行求和,結(jié)果存放在AX中┋MOVDI,OFFSETNUMB;將偏移地址NUMB傳送到DI寄存器MOVAX,1234H;把常數(shù)1234H傳送到AX寄存器ADDAX,[DI];AX寄存器內(nèi)容與地址NUMB內(nèi)的數(shù)據(jù);進行加運算,結(jié)果存放在AX寄存器ADDAX,[DI+1];AX寄存器內(nèi)容與地址NUMB+1內(nèi)的;數(shù)據(jù)進行加運算,結(jié)果存放在AX寄存器3.?dāng)?shù)組元素加法操作

數(shù)組,是存儲器中順序排列的一個數(shù)據(jù)表。假定一個名為ARRAY的一維數(shù)組,共有10個數(shù)組元素,且數(shù)組元素是字節(jié)數(shù)據(jù),數(shù)組元素的下標(biāo)是0~9。試用匯編語言編寫一個程序,實現(xiàn)三個數(shù)組元素ARRAY(3)、ARRAY(5)、ARRAY(7)的累加。

;三個數(shù)組元素數(shù)據(jù)進行累加運算,累加結(jié)果存放在AX中;注意該過程破壞了SI的內(nèi)容┋MOVAX,0;由于累加和要存放在AX內(nèi),首先將其清0MOVSI,3;將常數(shù)3傳送到源變址寄存器SIADDAX,ARRAY[SI];AX寄存器數(shù)據(jù)與數(shù)組元素ARRAY(3)相加;結(jié)果存放在AX寄存器ADDAX,ARRAY[SI+2];AX寄存器數(shù)據(jù)與數(shù)組元素ARRAY(5);相加結(jié)果存放在AX寄存器

ADDAX,ARRAY[SI+4];AX寄存器數(shù)據(jù)與數(shù)組元素ARRAY(7)相加;結(jié)果存放在AX寄存器4.?dāng)?shù)組元素加法

下面程序段是32位的程序,采用的是比例變址尋址方式,求數(shù)組ARRAY中三個數(shù)組元素ARRAY(3)、ARRAY(5)、ARRAY(7)的累加和。且數(shù)組元素是16位的操作數(shù),并把數(shù)組元素的和存放在寄存器EAX中。

;程序段是采用比例變址進行尋址的32位操作數(shù)的程序┋MOVEBX,OFFSETARRAY;將數(shù)組地址ARRAY傳送到寄存器EBXMOVECX,3;將常數(shù)3傳送到ECX,ECX保存著數(shù)組元素的序號MOVEAX,[EBX+2*ECX];將數(shù)組元素ARRAY(3)的值傳送到寄存器EAXMOVECX,5;將常數(shù)5傳送到ECX,ECX保存著數(shù)組元素的序號ADDEAX,[EBX+2*ECX];數(shù)組元素ARRAY(3)與數(shù)組元素ARRAY(5)相加;結(jié)果存放在寄存器EAXMOVECX,7;將常數(shù)7傳送到ECX,ECX保存著數(shù)組元素的序號ADDEAX,[EBX+2*ECX];數(shù)組元素ARRAY(3)+ARRAY(5)+ARRAY(7);相加,結(jié)果存放在寄存器EAX5.乘法程序設(shè)計

下面這個程序段是實現(xiàn)寄存器BX上的數(shù)據(jù)與寄存器CX上的數(shù)據(jù)相乘的程序段。假設(shè)BX中存放的是數(shù)據(jù)55,在CX中存放的是數(shù)據(jù)110,兩數(shù)進行乘法操作,產(chǎn)生的32位乘積存放在寄存器對DX-AX中。;寄存器BX上的數(shù)據(jù)與寄存器CX上的數(shù)據(jù)相乘,;乘積存放在寄存器對DX-AX中

┋MOVBX,55;將字?jǐn)?shù)據(jù)55裝到寄存器BX上MOVCX,110;將字?jǐn)?shù)據(jù)110裝到寄存器CX上MOVAX,CX;將寄存器CX上的數(shù)據(jù)110,傳送到寄存器AX上MULBX;寄存器AX上的數(shù)據(jù)與寄存器BX上的數(shù)據(jù)相乘;結(jié)果存放在寄存器對DX-AX中6.除法程序設(shè)計

下面的程序段是兩個16位有符號數(shù)的除法,即AX中的-100除以CX中的+9。執(zhí)行除法之前,要用指令CWD將AX中的-100轉(zhuǎn)換成寄存器對DX-AX中的-100,除法操作執(zhí)行后,結(jié)果存放在寄存器對DX-AX對中,其中商-11存放在AX中,而余數(shù)-l則是被存放在DX中。;寄存器AX中的-100除以寄存器CX中的+9,商存放在AX中,余數(shù)存放在DX中┋MOVAX,-100;將有符號數(shù)-l00傳送到寄存器AXMOVCX,9;將有符號數(shù)+9傳送到寄存器CXCWD;將AX中的-100轉(zhuǎn)換成寄存器對DX-AX中的-100IDIVCX;用寄存器對DX-AX中的-100,除以寄存器CX上的+9;在AX中存放商-11,在DX中存放余數(shù)-l完整的匯編源程序結(jié)構(gòu)DATASEGMENT;定義數(shù)據(jù)段MEM1DB11H,22H

┇DATAENDSCODESEGMENT;定義代碼段ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA

┇CODEENDSENDSTART;程序結(jié)束順序結(jié)構(gòu)程序設(shè)計

順序結(jié)構(gòu)的程序是完全按指令書寫的先后順序逐條執(zhí)行的。這種結(jié)構(gòu)的匯編程序既無分支、又無循環(huán),只會自上而下地線性地順序地運行,這種結(jié)構(gòu)的匯編程序通常是比較簡單的程序。下面所展示出的程序就是一個順序結(jié)構(gòu)匯編程序的框架。

Program5.1順序結(jié)構(gòu)匯編程序的框架.DOSSEG ;連接時按DOS方式排列段 .MODELSMALL;程序存儲模式:小模式 .486;80486偽指令 .STACK300H;建立程序堆棧段:768字節(jié) .DATA;建立程序數(shù)據(jù)段 DB16DUP(?);WINDOWS保留數(shù)據(jù)區(qū):16字節(jié) ;其它程序數(shù)據(jù) .CODE;建立程序代碼段START:;程序開始執(zhí)行地址 MOVAX,@DATA MOVDS,AX;設(shè)置數(shù)據(jù)段地址;插入實際程序代碼 MOVAH,4CH INT21H;返回DOS ENDSTART;程序結(jié)束

分支程序設(shè)計分支程序結(jié)構(gòu)可以用如圖所示的兩種形式表示。他們的結(jié)構(gòu)分別相當(dāng)于高級語言中的IF-THEN-ELSE語句和CASE語句,這種結(jié)構(gòu)常用于根據(jù)不同的條件作出不同處理的情況。IF-THEN-ELSE語句可以有兩個分支,CASE語句則可以有多個分支。但不論是哪一種形式,他們的共同特點是:其運行方向是向前的,在確定的條件下,只能執(zhí)行多個分支中的一個分支。判定條件判定條件

Program5.3分支結(jié)構(gòu)的程序示例程序;顯示兩個數(shù)x1,x2的比較結(jié)果.DOSSEG.MODELSMALL;程序存儲模式:小模式.486;80486偽指令.STACK300H.DATADB16DUP(?)X1DD1000;兩個數(shù)X1,X2X2DD2000;數(shù)值可任意指定MSG1DB"X1>X2",13,10,"$";比較結(jié)果分為大于、小于、等于三種情況MSG2DB"X1<X2",13,10,"$";MSGEDB"X1=X2",13,10,"$";.CODESTART: MOVAX,@DATA MOVDS,AX MOVEAX,X1;取X1數(shù)值 CMPEAX,X2;與X2比較 JEEQUAL;相等? JGGREAT;X1大于X2? MOVDX,OFFSETMSG2;比較結(jié)果:X1<X2 JMPOKGREAT:MOVDX,OFFSETMSG1;比較結(jié)果:X1>X2JMPOKEQUAL:MOVDX,OFFSETMSGE;比較結(jié)果:X1=X2OK:MOVAH,09H;顯示比較結(jié)果INT21HMOVAH,4CHINT21HENDSTART循環(huán)程序設(shè)計

在程序中,如果需要多次重復(fù)執(zhí)行相同或相似的功能,就可以使用循環(huán)結(jié)構(gòu)。循環(huán)結(jié)構(gòu)總是包含了三個部分:1)初始化,設(shè)置循環(huán)執(zhí)行的初始狀態(tài)。2)循環(huán)體,需要多次重復(fù)執(zhí)行的部分。3)循環(huán)條件,用于控制循環(huán)體的執(zhí)行。循環(huán)體每次執(zhí)行后,應(yīng)該修改循環(huán)條件,使得循環(huán)能夠在適當(dāng)?shù)臅r候終止執(zhí)行。循環(huán)控制條件循環(huán)初始狀態(tài)循環(huán)體循環(huán)初始狀態(tài)循環(huán)控制條件循環(huán)體(1)DO-WHILE結(jié)構(gòu)形式(2)DO-UNTIL結(jié)構(gòu)形式下面是循環(huán)程序設(shè)計一范例。其功能是選出一組數(shù)據(jù)中的最大者放到big單元;而將最小者放到little單元。DATASEGMENTADW88,89,92,78,76,69,63,96,60,100;一組數(shù)據(jù)BIGDW?LITTLEDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETAMOVAX,[BX]MOVDX,AXINCBXINCBXMOVCX,9;循環(huán)次數(shù)放在CX之內(nèi)AGAIN:CMPAX,[BX]JGENEXT1MOVAX,[BX];將大的數(shù);放在AX之內(nèi)NEXT1:CMPDX,[BX]JLENEXT2MOVDX,[BX];將較小的;數(shù)放DX之內(nèi)NEXT2:INCBXINCBXLOOPAGAIN;實現(xiàn)循環(huán)MOVBIG,AX;存放最大數(shù)MOVLITLE,DX;存放最小數(shù)MOVAH,4CH;返回DOSINT21HCODEENDS

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論