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

下載本文檔

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

文檔簡(jiǎn)介

第三章匯編語(yǔ)言程序設(shè)計(jì)

第一節(jié)匯編語(yǔ)言上機(jī)過(guò)程

第二節(jié)匯編語(yǔ)言程序結(jié)構(gòu)

第三節(jié)指示性語(yǔ)句

第四節(jié)匯編語(yǔ)言程序舉例

第五節(jié)BIOS和DOS功能調(diào)用

第六節(jié)匯編語(yǔ)言程序設(shè)計(jì)

1

作業(yè):3-2,3-6,3-7,3-9,3-12

復(fù)習(xí)內(nèi)容:P97-P114

預(yù)習(xí)內(nèi)容:P114-P140

P145-147(不作要求,自學(xué))

2

上環(huán)境

用戶(hù)開(kāi)發(fā)的程序:ABC.exe等

操作系統(tǒng):DOS系統(tǒng)

編輯器EDIT.exe

編程序.MASM.exe

連接程序:LINKexe

調(diào)試程序:DEBUG.exe

CPU、存儲(chǔ)器(ROM、RAM)、I/O接口、輸入、輸出設(shè)備

3

第一節(jié)匯編語(yǔ)言上機(jī)過(guò)程編輯源程序EDITABC.ASM

匯編源程序MASMABC.ASM

I-----------

D:>EDITABC.asm〈有匯編錯(cuò)誤信息?產(chǎn)-------------

D:>MASMABC;

形成目標(biāo)程序ABC.OBJ

有語(yǔ)法錯(cuò),回EDIT下改該程序

D:>LINKABC;連接目標(biāo)程序LINKABC.OBJ

有錯(cuò),回在EDIT下改程序的連接錯(cuò)凄信息?)丫----

IN____

D:>ABC形成可執(zhí)行程序ABC.EXE

運(yùn)行結(jié)果錯(cuò),回下改程序

EDIT裝入可執(zhí)行程序到內(nèi)存并執(zhí)行

或在DEBUG下調(diào)試,找原因。D:\>sub>ABC

D:>DEBUGABC.exe〈運(yùn)行好果正確下一程序]一

_________IN

1DEBUG調(diào)試程序查錯(cuò)?-------?

_______1丫

用DEBUG調(diào)試可執(zhí)行程序」戈到原因「

D:\>suM>EBUGABC.EXE^■

第二節(jié)匯編語(yǔ)言程序結(jié)構(gòu)

一,、程序結(jié)構(gòu)

二、語(yǔ)句結(jié)構(gòu)

5

匯編語(yǔ)言程序結(jié)構(gòu)例一

程序:movs.asm

功能:實(shí)現(xiàn)數(shù)據(jù)傳送功能

數(shù)據(jù)段1傳送至》數(shù)據(jù)段2

目的:學(xué)習(xí)程序結(jié)構(gòu)

6

一、程序結(jié)構(gòu);匯編語(yǔ)言程序結(jié)構(gòu)例一movs.asm

;實(shí)現(xiàn)數(shù)據(jù)傳送功能

aaSEGMENT;數(shù)據(jù)段1

?程序由數(shù)條語(yǔ)句構(gòu)成,每條語(yǔ)句占一行。strlDB'Hello!'

指令性語(yǔ)句(指令語(yǔ)句)aaENDS

bbSEGMENT;數(shù)據(jù)段2

指示性語(yǔ)句(偽指令語(yǔ)句)

str2DB6dup(?)

?分段結(jié)構(gòu)bbENDS

程序按段編寫(xiě),與8088內(nèi)存分段編址相對(duì)應(yīng)。ccSEGMENT;代碼段

ASSUMECS:cc,DS:aa,ES:bb

每段由偽操作SEGMENT開(kāi)始、由ENDS結(jié)束。start:CLD

MOVAX,aa

?程序最后為END結(jié)束語(yǔ)句,后跟一啟動(dòng)地址。

MOVDS,AX

啟動(dòng)地址指示程序開(kāi)始執(zhí)行的第一條語(yǔ)句。LEASI,strl

MOVAX,SEGstr2

?程序中設(shè)有返回DOS的功能。

MOVES,AX

使程序執(zhí)行完后返回DOS系統(tǒng)的命令接受狀態(tài)。MOVDI,OFFSETstr2

MOVCX,6

?程序中用到內(nèi)存操作數(shù)時(shí),REPMOVSB

應(yīng)按操作數(shù)的尋址方式,給相應(yīng)的段寄存器賦值MOVAH,4CH

INT21H;返回DOS

ccENDS

ENDstart;指示程序結(jié)束

匯編語(yǔ)言程序結(jié)構(gòu)例二

程序:scans.asm(子程結(jié)構(gòu))

子程內(nèi)容:用二進(jìn)制顯示BX內(nèi)容

功能:實(shí)現(xiàn)

用二進(jìn)制顯示

中斷向量表中(0:0?0:3FFH)

數(shù)據(jù)D0H的個(gè)數(shù)

目的:了解程序可由多個(gè)段構(gòu)成

8

程序可由多個(gè)段構(gòu)成,至少有一個(gè)代碼段

;匯編語(yǔ)言程序結(jié)構(gòu)例二(子程結(jié)構(gòu))scans.asm

;用二進(jìn)制顯示中斷向量表中(0:0?0:3FFH)數(shù)據(jù)D0H的個(gè)數(shù)

keyEQU0D0H;用符號(hào)表示常量(關(guān)鍵字)

codeSEGMENT;代碼段開(kāi)始;用二進(jìn)制顯示BX內(nèi)容子程

ASSUMECS:codedisplayPROC

begin:MOVAX,0000H

MOVCX,16

MOVDS,AX

rotate:ROLBX,1

MOVSI,0000H

MOVDL,BL

MOVCX,0400H

ANDDL,01H

MOVBX,0

ADDDL,30H

MOVAL,key

MOVAH,2H

next:CMP[SI],AL

INT21H

JNZpoint

LOOProtate

INCBX

RET;子程返回

point:INCSI

displayENDP

LOOPnext

CALLdisplay;調(diào)用顯示子程codeENDS;代碼段結(jié)束

MOVAH,4CH;返回DOSENDbegin;指示程序結(jié)束和

INT21H;程序入口

9

二、語(yǔ)句結(jié)構(gòu)

[名字H:1助記符[操作數(shù),,一[;注釋?zhuān)?/p>

丁1

名字項(xiàng)助記符項(xiàng)操作數(shù)項(xiàng)注釋項(xiàng)

例:

dataSEGMENT;數(shù)據(jù)段

varDB?

dataENDS

codeSEGMENT;代碼段

ASSUMECS:code,DS:data

start:MOVAX,data

MOVDS,AX

MOVvar,CL

MOVAH,4cH

INT21H;返回DOS

codeENDS

ENDstart10

【名字H:]助記符[操作數(shù),???][;注釋?zhuān)?/p>

名字項(xiàng)助記符項(xiàng)操作數(shù)項(xiàng)注釋項(xiàng)

dataSEGMENT;數(shù)據(jù)段

L名字項(xiàng)varDB?

dataENDS

?據(jù)語(yǔ)句功能的不同,

codeSEGMENT;代碼段

名字項(xiàng)可用來(lái)表示:ASSUMECS:code,DS:data

start:MOVAX,data

段名、變量名、MOVDS,AX

標(biāo)號(hào)、過(guò)程名以及常量名等。MOVvar,CL

MOVAH,4CH

INT21H;返回DOS

codeENDS

ENDstart

11

[名字H:]助記符[操作數(shù),???][;注釋?zhuān)?/p>

名字項(xiàng)助記符項(xiàng)操作數(shù)項(xiàng)注釋項(xiàng)

?名字項(xiàng)用一個(gè)符號(hào)表示。

對(duì)符號(hào)的規(guī)定:

①由字符A?Z,a?z,0?9及符號(hào)@、$、下劃線—等組成,

最長(zhǎng)31個(gè)字符,超出部分忽略。

②不能用數(shù)字打頭,以免與十六進(jìn)制數(shù)相混。

③不使用匯編程序中的保留字。(如指令的助記符等)

④對(duì)定義的符號(hào)不區(qū)分大小寫(xiě)。

12

[名字][:]助記符[操作數(shù),???][;注釋]

名字項(xiàng)助記符項(xiàng)操作數(shù)項(xiàng)注釋項(xiàng)

2.助記符項(xiàng)

助記符可以是指令、偽操作中的助記符。

對(duì)于指令,匯編程序?qū)⑵浞g成機(jī)器語(yǔ)言指令。

MOVAX,100—B80001

對(duì)于偽操作,匯編程序據(jù)其要求的功能進(jìn)行處理。

dataSEGMENT-data與一段值對(duì)應(yīng)

stringDB4Tsinghua5一string與一內(nèi)存地址對(duì)應(yīng)

13

[名字H:]助記符[操作數(shù),???][;注釋?zhuān)?/p>

名字項(xiàng)助記符項(xiàng)操作數(shù)項(xiàng)注釋項(xiàng)

3.操作數(shù)項(xiàng)

?操作數(shù)給出參與操作的數(shù)或數(shù)所在的地方。

?操作數(shù)多于一個(gè)時(shí),用逗號(hào)分開(kāi)。

?操作數(shù)可以是常數(shù)、寄存器、存儲(chǔ)器操作數(shù)、

標(biāo)號(hào)名、過(guò)程名或表達(dá)式等。

14

常數(shù)

給出具體的數(shù)據(jù)。可以是數(shù)字常量或字符常量。

,,數(shù)字默認(rèn)十進(jìn)制,也可加D表示十進(jìn)制數(shù)。如1234D,1234

/,數(shù)字后加B表示二進(jìn)制數(shù)。如1010B

//數(shù)字后加H表示十六進(jìn)制數(shù)。如1234H

字符常量,用單引號(hào)表示。如出下

匯編時(shí),用字符對(duì)應(yīng)的ASCH表示。如31H,32H,33H,34H

例datalDB12,34,56;十進(jìn)制

data!DB12H,34H,56H;十六進(jìn)制

MOVAL「G,;字符

stringDB612345;字符串

15

?A、B、C、D、E、F開(kāi)頭的十六進(jìn)制數(shù)前面加0,

與H結(jié)尾的標(biāo)識(shí)符區(qū)別。

如寄存器名AH、BH、CH、DH

變量名abcdH等

例movAL,0AH

movAL,AH

movBX,OabcdH

16

[名字][:]助記符[操作數(shù),???][;注釋]

名字項(xiàng)助記符項(xiàng)操作數(shù)項(xiàng)注釋項(xiàng)

4.注釋項(xiàng)

?由分號(hào)引出,用來(lái)說(shuō)明語(yǔ)句或程序的功能。

匯編程序?qū)Ψ痔?hào)后的內(nèi)容不做處理。

?作用:①注釋程序,增強(qiáng)程序可讀性。

②可放在語(yǔ)句最前,暫時(shí)注釋某語(yǔ)句,調(diào)試程序用。

例、、、

;MOVAH,2;顯示提示信息

;MOVDL,'A,

;INT21H

第三節(jié)指示性語(yǔ)句/第四節(jié)匯編語(yǔ)言程序舉例

一、程序開(kāi)始和結(jié)束

二、段定義

三、變量定義

四、ASSUME語(yǔ)句

購(gòu)匯編語(yǔ)言程序舉例一

了解DOS的返回,裝入功能

五、表達(dá)式及表達(dá)式中的操作符

匯編語(yǔ)言程序例二

六、過(guò)程定義(第五節(jié)程序設(shè)計(jì)介紹)

七、等值定義(第五節(jié)程序設(shè)計(jì)介紹)

副匯編語(yǔ)言程序例三(第五節(jié)程序設(shè)計(jì)介紹)18

指示性語(yǔ)句與指令性語(yǔ)句:

?指令性語(yǔ)句是用指令系統(tǒng)中的指令構(gòu)成的語(yǔ)句。

例MOVAX,BX

?指示性語(yǔ)句是指示匯編程序進(jìn)行匯編的操作。

例MOVAX,4+8中的+

codeSEGMENT中的SEGMENT

MOVBX,OFFSETstring中的OFFSET

19

?指示性語(yǔ)句與指令性語(yǔ)句區(qū)別

一個(gè)程序經(jīng)匯編,連接和裝入內(nèi)存后,在執(zhí)行程序之前:

,指示性語(yǔ)句的功能已經(jīng)完成,故又稱(chēng)偽操作。

,而指令性語(yǔ)句的功能尚未完成,需控制CPU去執(zhí)行,才能完成。

20

數(shù)據(jù)傳送源程序hello2.asm程序經(jīng)匯編、連接后,裝入內(nèi)存的情況如下:

aaSEGMENT;數(shù)據(jù)段1D:\masm>DEBUGhello2.exe

strlDB'Hello!'

-U:查看代碼段

aaENDS

12A0:0000FCCLD

bbSEGMENT;數(shù)據(jù)段2

12A0:0001B89E12MOVAX,129E

str2DB6dup(?)

bbENDS12A0:00048ED8MOVDS,AX

ccSEGMENT;代碼段12A0:00068D360000LEASI,[0000]

ASSUMECS:cc12A0:000AB89F12MOVAX,129F

12A0:000D8EC0MOVES,AX

ASSUMEDS:aa,ES:bb

12A0:000F8D3E0000LEADI,[0000]

start:CLD12A0:0013B90600MOVCX,0006

MOVAX,aa12A0:0016F3REPZ

MOVDS,AX12A0:0017A4MOVSB

LEASI,strl

12A0:0018B44CMOVAH,4C

MOVAX,bb

12A0:001ACD21INT21

MOVES,AX、、、

LEADI,str2

-D129E:0L10;查看數(shù)據(jù)段1的內(nèi)容

MOVCX,6

129E:000048656C6C6F210000-0000000000000000

REPMOVSB

MOVAH,4CHHello!.........

INT21H-D129F:0L10;查看數(shù)據(jù)段2的內(nèi)容

ccENDS129F:00000000000000000000-0000000000000000

ENDstart—

21

常用偽操作介紹

一、程序開(kāi)始和結(jié)束

二、段定義

三、變量定義

四、ASSUME語(yǔ)句

五、表達(dá)式中的操作符

六、過(guò)程定義

七、等值定義

22

、模塊定義和程序結(jié)束偽操作

1.NAME和TITLE偽操作

格式NAME模塊名

格式TITLE模塊名

▲在源程序開(kāi)始可用NAME或TITLE為模塊命名,

模塊名的作用是指示給連接程序進(jìn)行連接用。

▲源程序中可無(wú)模塊定義,此時(shí)源文件名作為模塊名。

23

2.END偽操作

格式END啟動(dòng)地址

▲作用是指示源程序到此結(jié)束。

匯編程序?qū)ND之后的語(yǔ)句不進(jìn)行處理。

程序中所有有效語(yǔ)句應(yīng)放在END語(yǔ)句之前。

▲源程序中必須有END結(jié)束語(yǔ)句。

匯編程序?qū)o(wú)END語(yǔ)句的源程序不進(jìn)行處理,

只給出無(wú)END語(yǔ)句錯(cuò)誤信息。

24

假設(shè)TEST.asm是一個(gè)無(wú)END語(yǔ)句的匯編語(yǔ)言源程序。

其匯編結(jié)果如下:

D:\MASMTEST;/

Microsoft(R)MacroAssemblerVersion5.10

Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.

Endoffileencounteredoninputfile

Endoffileencounteredoninputfile

49968+421181Bytessymbolspacefree

0WarningErrors

0SevereErrors

D:\

由于沒(méi)有END語(yǔ)句,匯編程序根本沒(méi)對(duì)源程序進(jìn)行匯編,

此時(shí)顯示警告性錯(cuò)誤總數(shù)為0,嚴(yán)重性錯(cuò)誤總數(shù)為0,

用戶(hù)不要被此值的誤導(dǎo)。

25

▲啟動(dòng)地址可是一個(gè)標(biāo)號(hào)或過(guò)程名,指示程序的入口O

程序裝入內(nèi)存后,系統(tǒng)跳轉(zhuǎn)到入口處,開(kāi)始執(zhí)行程序。

aaSEGMENT;數(shù)據(jù)段1D:\masm>DEBUGhello.exe

strlDB^Hello!^-u:查看代碼段

aaENDS129F:0000FCCLD

bbSEGMENT;數(shù)據(jù)段2129F:0001B89D12MOVAX,129D

str2DB6dup(?)129F:00048ED8MOVDS,AX

bbENDS129F:00068D360000LEASI,[0000]

ccSEGMENT;代碼段129F:000AB89E12MOVAX,129E

ASSUMECS:cc129F:000D8EC0MOVES,AX

ASSUMEDS:aa,ES:bb129F:000FBF0000MOVDI,0000

start:CLD129F:0012B90600MOVCX,0006

MOVAX,aa129F:0015F3REPZ

MOVDS,AX129F:0016A4MOVSB

LEASI,strl129F:0017B44CMOVAH,4C

MOVAX,SEGstr2129F:0019CD21INT21

MOVES,AX、、、

MOVDI,OFFSETstr2-D129d:0110;查看數(shù)據(jù)段1的內(nèi)容

MOVCX,6129D:000048656C6C6F210000-00000000000000

REPMOVSB00Hello!.........

MOVAH,4CH-D129e:0110;查看數(shù)據(jù)段2的內(nèi)容

INT21H129E:00000000000000000000-0000000000000000

ccENDS

ENDstart

26

二、段定義偽操作

格式段名SEGMENT

段名ENDS

▲段定義由偽操作SEGMENT開(kāi)始、ENDS結(jié)束。

其中:SEGMENT和ENDS必須成對(duì)出現(xiàn),

且語(yǔ)句前必須有段名,段名必須相同。

▲SEGMENT和ENDS語(yǔ)句之間可以有指令和其他偽操作,

表示存放在該段內(nèi)存的變量、指令或其他偽操作對(duì)該段內(nèi)存的處理

▲程序中可以定義多個(gè)段。

▲程序經(jīng)匯編、連接及裝入內(nèi)存后,段名為一具體的段值。

27

數(shù)據(jù)傳送源程序:程序經(jīng)匯編、連接后,裝入內(nèi)存的情況如下:

aaSEGMENT;數(shù)據(jù)段1D:\masm>DEBUGhello2.exe

strlDB'Hello!'

-U:查看代碼段

aaENDS

12A0:0000FCCLD

bbSEGMENT;數(shù)據(jù)段2

12A0:0001B89E12MOVAX,129E

str2DB6dup(?)

bbENDS12A0:00048ED8MOVDS,AX

ccSEGMENT;代碼段12A0:00068D360000LEASI,[0000]

ASSUMECS:cc12A0:000AB89F12MOVAX,129F

12A0:000D8EC0MOVES,AX

ASSUMEDS:aa,ES:bb

12A0:000F8D3E0000LEADI,[0000]

start:CLD12A0:0013B90600MOVCX,0006

MOVAX,aa12A0:0016F3REPZ

MOVDS,AX12A0:0017A4MOVSB

LEASI,strl

12A0:0018B44CMOVAH,4C

MOVAX,bb

12A0:001ACD21INT21

MOVES,AX、、、

LEADI,str2

-D129E:0L10;查看數(shù)據(jù)段1的內(nèi)容

MOVCX,6

129E:000048656C6C6F210000-0000000000000000

REPMOVSB

MOVAH,4CHHello!.........

INT21H-D129F:0L10;查看數(shù)據(jù)段2的內(nèi)容

ccENDS129F:00000000000000000000-0000000000000000

ENDstart—

28

三、變量定義偽操作

格式變量名類(lèi)型助記符操作數(shù)[,操作數(shù),…]

▲用來(lái)定義程序中所用的內(nèi)存操作數(shù)。

其中變量名指示內(nèi)存操作數(shù)的地址(符號(hào)地址)

類(lèi)型助記符指示內(nèi)存操作數(shù)的類(lèi)型(字節(jié)、字、雙字等)

操作數(shù)指示內(nèi)存操作數(shù)的內(nèi)容

▲匯編程序?qū)⒍x的操作數(shù),按其類(lèi)型分配內(nèi)存單元數(shù),

順序存入變量名指向的內(nèi)存單元中。

▲常用的類(lèi)型助記符有:

DB指示其后的操作數(shù)為字節(jié)類(lèi)型

DW指示其后的操作數(shù)為字類(lèi)型

DD指示其后的操作數(shù)為雙字類(lèi)型

29

例?1?定義賦初值的變量yy

dataSEGMENT

xxDB1,-1OfcH

9zz

yyDW1,-1,OfcH

zzDD1r1,OfcH

dataENDS

30

例2??定義字符串變量(只能用DB定義)

strl一546T,

73's'

dataSEGMENT69'i,

6e'n,

strlDB'TsingHua'67'g,

48

str2DB'INPUT:'OdH,OaH,$75'u'

61

str2f49T

dataENDS4e,N'

50P

55U

注意:3個(gè)及其以上的字符,546r

3a

只能用DB定義OdOdH

strlDW'abed'\/0aOaH

24$

str2DD6abcd5A

31

▲操作數(shù)可以是用常量、表達(dá)式和?表示。

*常量和表達(dá)式表示內(nèi)存操作數(shù)的初始值,

其值應(yīng)在其定義的類(lèi)型范圍內(nèi),否則匯編出錯(cuò)。

例aaDB270

bbDW80000人

親用?表示不置初始值的內(nèi)存操作數(shù)。

例ccDB?

*可用DUP復(fù)制操作符定義相同的操作數(shù),其格式為

重復(fù)次數(shù)DUP(操作數(shù))

例eeDB3DUP(4)

等價(jià)于eeDB4,4,4

32

例4:在DEBUG下查看變量存放情況。

dataSEGMENTD:\MASM>DEBUGvarible.exe

xxDB1,-1,OFCH

-U

yyDW1,-1,OFCH

12Al:0000B89E12MOVAX,U9E一段名data

zzDD1,-1,OFCH

12Al:00038ED8MOVDS,AX

strDB'TsingHua'12Al:00058D1E0000LEABX,[0000]—變量XX

bufDB4,?,4DUP(?)12Al:00098D360300LEASI,|0003]+變量yy

DB'dataend'12Al:000D8D3E0900LEADI,[0009]十變量zz

dataENDS12Al:00118D1E1500LEABX,[0015]十變量str

12Al:00158D361D00LEASI,|001D]變量buf

codeSEGMENT

12Al:0019B44CMOVAH,4C

ASSUMECS:code12Al:001BCD21INT21

ASSUMEDS:data

12Al:001DFF36243EPUSH|3E24]

start:MOVAX,data

-D129E:0L30

MOVDS,AX

LEABX,xx129E:000001FFFC0100FFFFFC-0001000000FFFFFF.

ttt

LEASI,yyxxyyZZ

LEADI,zz129E:0010FFFC000000547369-6E67487561040000TsingHua...

MOVAH,4CHbuf

INT21H129E:00200000006461746165-6E64000000000000...dataend

codeENDS'dataend'

ENDstart129E:0030B89E128ED88DIE00-008D3603008D3E09.........6...>.

四、ASSUME偽操作

格式ASSUME段寄存器:段名[,段寄存器:段名,…]

其中段寄存器為CS、DS、ES、SS中的一個(gè)

段名為用偽操作SEGMENT定義過(guò)的段名

例ASSUMECS:cc,DS:aa

▲ASSUME偽操作的作用

指示匯編程序指令中用到的標(biāo)號(hào)、過(guò)程及變量所在的段。

其中對(duì)標(biāo)號(hào)、過(guò)程必須用CS段寄存器指示

對(duì)變量可用CS、DS、ES、SS段寄存器指示

34

▲若未用ASSUME語(yǔ)句指示指令中用到的標(biāo)號(hào)、

過(guò)程和變量所在的段,匯編程序?qū)⒔o出錯(cuò)誤信息。

▲ASSUME語(yǔ)句只起指示作用,并無(wú)實(shí)際的操作。

在程序中引用定義的變量做內(nèi)存操作數(shù)時(shí),

需按尋址方式用傳送指令(如MOV)給相應(yīng)的段寄存器賦值。

35

value—?34

例用程序?qū)崿F(xiàn)1234H+5678Hpl

78

dataSEGMENT56

valueDW1234H,5678Hresult—?oo

00

resultDW?

dataENDS

codeSEGMENT

ASSUMECS:code,DS:data

start:MOVAX,data;給口5賦值

MOVDS,AX

MOVAX,value;取數(shù)

ADDAX,value+2;兩數(shù)相力口

MOVresult,AX;保存結(jié)果

MOVAH,4CH;返回DOS

INT21H

codeENDS

ENDstart

36

注釋掉ASSUME語(yǔ)句,其匯編結(jié)果:

dataSEGMENTD:\MASM>MASMassume;

valueDW1234H,5678HMicrosoft(R)MacroAssemblerVersion5.10

resultDW?Copyright(C)MicrosoftCorp1981,1988.Allrights

dataENDSreserved.

codeSEGMENTassume.ASM(8):MissingorunreachableCS

;ASSUMECS:code,DS:dataassume.ASM(10):Cannotaddresswithsegmentregister

start:MOVAX,dataassume.ASM(U):Cannotaddresswithsegmentregister

MOVDS,AXassume.ASM(12):Cannotaddresswithsegmentregister

MOVAX,value

ADDAX,value+249872+421341Bytessymbolspacefree

MOVresult,AX

MOVAH,4CH0WarningErrors

INT21H4SevereErrors

codeENDS

D:\MASM>

ENDstart

37

程序中有ASSUME語(yǔ)句,經(jīng)匯編,連接和裝入內(nèi)存后的情況:

dataSEGMENTD:\MASM>DEBUGassume.exe

valueDW1234H,5678HR;查看程序執(zhí)行前各寄存器

resultDW?AX=OOOOBX=OOOOCX=0023DX=OOOO

SP=OOOOBP=OOOOSI=OOOODI=OOOO

dataENDS

DS=1295ES=1295SS=12A5

codeSEGMENT

CS=12A6IP=OOOO

ASSUMECS:code,DS:dataNVUPEIPLNZNAPONC

start:MOVAX,data;給。3賦值12A6:0000B8A512MOVAX,12A5

MOVDS,AX-U;查看在內(nèi)存的程序

MOVAX,value;取數(shù)12A6:0000B8A512MOVAX,12A5

ADDAX,value+2;兩數(shù)相加12A6:00038ED8MOVDS,AX

MOVresult,AX;保存結(jié)果12A6:0005A10000MOVAX,[0000]

MOVAH,4CH;返回DOS12A6:000803060200ADDAX,[0002]

INT21H12A6:000CA30400MOV[0004J,AX

12A6:000FB44CMOVAH,4C

codeENDS

12A6:0011CD21INT21

注意:

程序裝入內(nèi)存后,執(zhí)行程序前,

當(dāng)前的DS值并非程序定義的data段值,1295不等于12A5

38

思考:如果上例中沒(méi)有MOVDS,AX程序執(zhí)行的結(jié)果會(huì)怎樣?

D:\MASM>DEBUGassume.exe

dataSEGMENT

R;查看程序執(zhí)行前各寄存器

valueDW1234H,5678H

AX=0000BX=0000CX=0023DX=0000

resultDW?

SP=0000BP=0000SI=0000DI=0000

dataENDS

DS=1295ES=1295SS=12A5CS=12A6IP=0000

codeSEGMENT

NVUPEIPLNZNAPONC

ASSUMECSicode,DS:data

12A6:0000B8A512MOVAX,12A5

start:MOVAX,data;給口5賦值

-U;查看在內(nèi)存的程序

;MOVDS,AX

12A6:0000B8A512MOVAX,12A5

MOVAX,value;取數(shù)

12A6:0003A10000MOVAX,|0000|

ADDAX,value+2;兩數(shù)相加

12A6:000603060200ADDAX,|0002]

MOVresult,AX;保存結(jié)果

12A6:000AA30400MOV[0004],AX

MOVAH,4CH;返回DOS

12A6:000DB44CMOVAH,4C

INT21H

12A6:000FCD21INT21

codeENDS

39

結(jié)論:

1.ASSUME語(yǔ)句只起指示作用,沒(méi)有賦值作用

2.程序中用到內(nèi)存操作數(shù)時(shí),

應(yīng)按操作數(shù)的尋址方式,給相應(yīng)的段寄存器賦值。

40

第三節(jié)指示性語(yǔ)句/第四節(jié)匯編語(yǔ)言程序舉例

一、程序開(kāi)始和結(jié)束

二、段定義

三、變量定義

四、ASSUME語(yǔ)句

購(gòu)匯編語(yǔ)言程序舉例一

了解DOS的返回,裝入功能

五、表達(dá)式及表達(dá)式中的操作符

匯編語(yǔ)言程序例二

六、過(guò)程定義(第五節(jié)程序設(shè)計(jì)介紹)

七、等值定義(第五節(jié)程序設(shè)計(jì)介紹)

副匯編語(yǔ)言程序例三(第五節(jié)程序設(shè)計(jì)介紹)41

匯編語(yǔ)言程序舉例一

42

例修BL寄存器的內(nèi)容按二進(jìn)制形式顯示出來(lái)

(BL)10100110

3130313030313130

MOVCX,8;顯示字符個(gè)數(shù)為8

next:SHLBL,1H尋顯示位移至CF中

JCone;CF=1?

MOVDL,30H;CF=0,將0的ASCII放在DL中

JMPexit

one:MOVDL,31H;CF=1,將1的ASCH放在DL中

exit:MOVAH,2

INT21H;調(diào)用DOS功能顯示

DECCX;循環(huán)次數(shù)減1

JNZnext;判斷是否結(jié)束

、、、

43

codeSEGMENT

ASSUMECS:code

start:

MOVCX,8;顯示字符個(gè)數(shù)為8

next:SHLBL,1;修顯示位移至CF中

JCone;CF=1?

MOVDL,30H;CF=0,將0的ASCII放在DL中

JMPexit

one:MOVDL,31H;CF=1,將1的ASCH放在DL中

exit:MOVAH,2

INT21H;調(diào)用DOS功能顯示

DECCX;循環(huán)次數(shù)減1

JNZnext;判斷是否結(jié)束

codeENDS

ENDstart

44

D:\>MASMSBL;2匯編成ShowBL.obj

Microsoft(R)MacroAssemblerVersion5.10

Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.

48912+447243Bytessymbolspacefree

0WarningErrors

0SevereErrors

D:\>LINKSBL;2連接成ShowBL.exe

Microsoft(R)OverlayLinkerVersion3.61

Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.

LINK:warningL4021:nostacksegment

D:\>SBL2裝載并執(zhí)行ShowBL.exe

請(qǐng)猜想執(zhí)行的結(jié)果?45

D:\>DEBUGSBL.exe2;用DEBUG裝入程序

-U2

0B5E:0000B90800MOVCX,0008、

0B5E:0003D0E3SHLBL,1

0B5E:00057205JB000C

0B5E:0007B230MOVDL,30

0B5E:0009EB03JMP000Ehello.exe

0B5E:000B90NOPr用戶(hù)程序

0B5E:000CB231MOVDL,31

0B5E:000EB402MOVAH,02

0B5E:0010CD21INT21

0B5E:001249DECCX

0B5E:001375EEJNZ0003)

0B5E:001509E8ORAX,BP'

0B5E:001796XCHGSI,AX與用戶(hù)程序相連的

0B5E:001800F8ADDAL,BH內(nèi)存內(nèi)容被看作

0B5E:001AB262MOVDL,62程序時(shí)

0B5E:001CFFFF???DJ一死機(jī)

0B5E:001DEBOAJMP0029

▲復(fù)習(xí)DOS系統(tǒng)的啟動(dòng)過(guò)程

磁盤(pán)

執(zhí)行用戶(hù)程序后,引導(dǎo)程序

IO.SYS

>DOS

若要返回DOS狀態(tài),內(nèi)存MSDOS.SYS

溫馨提示

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

評(píng)論

0/150

提交評(píng)論