微機原理與匯編語言實驗指導(dǎo)書(一)匯編部_第1頁
微機原理與匯編語言實驗指導(dǎo)書(一)匯編部_第2頁
微機原理與匯編語言實驗指導(dǎo)書(一)匯編部_第3頁
微機原理與匯編語言實驗指導(dǎo)書(一)匯編部_第4頁
微機原理與匯編語言實驗指導(dǎo)書(一)匯編部_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

微機原理與匯編語言實驗

指導(dǎo)書(一)匯編部分

紀平、陸勤、李金厚編寫

系______________

班級______________

學(xué)號______________

姓名______________

安徽工業(yè)大學(xué)計算機學(xué)院

二。一八年九月

目錄

實驗一匯編運行環(huán)境及方法.................................1

實驗二尋址方式及指令.....................................15

實驗三用查表的方法將一位十六進制數(shù)轉(zhuǎn)換成與它相應(yīng)的ASCII碼

.......................................................................................................17

實驗四將鍵盤輸入的小寫字母用大寫字母顯示出來............18

實驗五分支程序設(shè)計.......................................20

實驗六循環(huán)程序設(shè)計......................................21

實驗七按學(xué)號順序把學(xué)生名次從終端上顯示出來..............24

實驗八統(tǒng)計不同成績段學(xué)生的人數(shù)..........................32

附錄實驗報告.............................................35

實驗一匯編運行環(huán)境及方法

一、實驗?zāi)康?/p>

1.熟悉匯編語言運行環(huán)境和方法

2.了解如何使用匯編語言編制程序

3.熟悉DEBUG有關(guān)命令的使用方法

4.利用DEBUG掌握有關(guān)指令的功能

5.利用DEBUG運行簡單的程序段

二、實驗內(nèi)容

1.學(xué)會輸入、編輯匯編語言程序

2.學(xué)會對匯編語言程序進行匯編、連接和運行

3.進入和退出DEBUG程序

4.學(xué)會DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用,對

于U命令、N命令、W命令等,也應(yīng)試一下。

三、實驗準備

1.仔細閱讀有關(guān)匯編語言環(huán)境的內(nèi)容,事先準備好使用的例子。

2.準備好源程序清單、設(shè)計好調(diào)試步驟、測試方法、對運行結(jié)果的分析。

3.編寫一個程序:比較2個字符串所含的字符是否相同。若相同則顯示'Match,否則

顯示,N。match匕⑴仔細閱讀有關(guān)DEBUG命令的內(nèi)容,對有關(guān)命令,都要事先準

備好使用的例子,

四、實驗步驟

1.在DOS提示符下,進入MASM目錄。

2.在MASM目錄下啟動EDIT編輯程序,輸入源程序,并對其進行匯編、連接和運行。

1)調(diào)用edit輸入、編輯源程序并保存在指定的目錄中;例:

editabc.asm

2)用匯編程序masm對源程序匯編產(chǎn)生目標文件obj。例:

masmabc

不斷修改錯誤,直至匯編通過為止。

3)用連接程序link產(chǎn)生執(zhí)行文件exe.例:linkabc

4)執(zhí)行程序

可直接從DOS執(zhí)行程序,即在DOS環(huán)境中,輸入文件名即可。

3.詳細記錄每?步所用的命令,以及查看結(jié)果的方法和具體結(jié)果。

五、實驗方法

有關(guān)匯編語言程序的上機過程請讀者參閱清華大學(xué)出版社1991年出版的《IBMPC

匯編語言程序設(shè)計》的4.4節(jié)。在這里,我們舉例簡要說明該過程以及程序的調(diào)試方法。

例1.1比較字符串sample

試編寫一程序:比較兩個字符串sinngl和slnng2所含的字符是否相同。若相同則顯

示'Match',否則,顯示'Nomatch'。

我們可以用串比較指令來完成程序所要求的功能。上機過程如下:

1.調(diào)用字處理程序v/ordstar建立asm文件

當然也可以用其它編輯程序如peed或行編輯程序edlin來建立源文件。

c>ws

使用非文本文件方式(n命令)建立以sample.asm為文件名的源文件如圖1.1

所示。然后用CTRLKX命令將文件存入磁盤,并使系統(tǒng)返回DOS。

;PROGRAMTITLEGOESHERE—Comparestring

(*木木木***木*木*******分*木木木木**木木木*********木木**京*木木木****木****木木******木**

datarcasegmentzdcfincdatasegment

stringldb'Movethecursorbackward.'

string?db'Movethecursorbackward.,

messldb'Match.;13,10;$'

mess2db'Nomatch!,,13,10:$'

datareaends

,*******************************************************************

prognamsegment;definecodesegment

mainprocfar

assumecs:prognam,ds:datarca.es:datarca

start:;startingexecutionaddress

;setupstackforreturn

pushds;saveolddatasegment

subax,ax;putzeroinAX

pushax;saveitonstack

;setDSregistertocurrentdatasegment

movax.datarca;datarcasegmentaddr

movds.ax;intoDSregister

moves,ax;intoESregister

;MAINPARTOFPROGRAMGOESHERE

leasi,stringl

leadi,string2

cld

movex,25

repzempsb

jzmatch

leadx,mess2

jmpshortdisp

2

match:

leadx,messl

disp:

movah,09

int21h

ret;returntoDOS

mainendp;endofmainpartofprogram

prognamends:endofcodesegment

?*****************?**********************************************

9

endstart;endassembly

圖1.1例1的原文件sample.asm

2.用匯編程序masm(或asm)對源文件匯編產(chǎn)生目標文件obj

C:\>rnasmsample;

Microsoft(R)MacroAssemblerVersion5.00

Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.

51520+423584Bytessymbolspacefree

0WarningErrors

0SevereErrors

3.用連接程序link產(chǎn)生執(zhí)行文件exe

C:\>linksample;

Microsoft(R)OverlayLinkerVersion3.60

Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.

LINK:warningL4021:nostacksegment

4.執(zhí)行程序

C:\>sample

Match.

終端上已顯示出程序的運行結(jié)果。為了調(diào)試程序的另一部分,可重新進編輯程序修改兩

個字符串的內(nèi)容,使它們互不相同。如修改后的數(shù)據(jù)區(qū)為:

?******************************************************************

datareasegment;definedatasegment

string!db'Movethecursorbackward.1

string?db'Movethecursorbackward.,

3

messldb'Match.,,13,10:$'

mess2db'Nomatch!,,13,10,'$'

datareaends

?水**********************************************水*****水*****水********

然后,重新匯編、連接、執(zhí)行,結(jié)果為:

C>sample

Nomateh!

至此,程序已調(diào)試完畢,運行結(jié)果正確。

另一種調(diào)試程序的方法是使用debug程序??烧{(diào)用如下:

C>debugsample.exe

此時,debug已將執(zhí)行程序裝入內(nèi)存,可直接用g命令運吁程序。

-g

Match.

Programterminatednormaly

為調(diào)試程序的另一部分,叮在debug中修改字符串內(nèi)容??上扔胾命令顯示程,以便了

解指令地址。顯示結(jié)果如羽1.2所示。

0D36:0000IEPUSHDS

0D36:00012BC0SUBAX,AX

0D36:00035()PUSHAX

0D36:0004B83I0DMOVAX,0D31

0D36:00078ED8MOVDS.AX

0D36:00098EC0MOVES,AX

0D36:000B8D360000LEASI,[0000]

0D36:000F8D3E1900LEADIJ0019]

0D36:0013FCCLD

0D36:0014B9190()MOVCX,0()19

0D36:0017F3REPZ

0D36:0018A6CMPSB

0D36:00197406JZ0021

0D36:001B8D163B00LEADXJ003B1

0D36:001FEB04JMP0025

-u

0D36:00218D163200LEADXJOO321

0D36:0025B409MOVAH,09

0D36:0027CD21INT21

0D36:0029CBRETF

0D36:002A8A4608MOVALJBP+08]

4

0D36:002D98CBW

0D36:002E50PUSHAX

0D36:002F8B4604MOVAXJBP+04]

0D36:003203C6ADDAX,SI

0D36:003450PUSHAX

OD36:OO35E858FFCALLFF90

0D36:003883C406ADDSP.+06

0D36:003B8BF8MOVDI.AX

0D36:003D83FFFFCMPDI,-01

0D36:0040750CJNZ004E

圖1.2例1.1用debug調(diào)試時,u命令的顯示情況

將端點設(shè)置在程序的主要部分以前。

-gOb

AX=0D31BX=0000CX=007ADX=0000SP=FFFCBP=OOOOSI=0000DI=0000

DS=0D31ES=0D3lSS=0D31CS=0D36IP=OOOBNVUPElPLZRNAPENC

0D36:000B8D360000LEASI,|0()00|DS:00()0=6F4D

根據(jù)其中指示的ds寄存器內(nèi)容查看數(shù)據(jù)段的情況如下:

-dO

0D31:00004D6F766520746865-20637572736F7220Movethecursor

0D3i:()0l()6261636B77617264-2E4D6F7665207468backward.Movcih

0D31:00206520637572736F72-206261636B776172ecursorhackwar

0D31:0030642E4D617463682E-0D0A244E6F206D61d.Match...$Noma

0D31:0040746368210D0A2400-0000000000000000tch!..S.........

0D31:00501E2BCO50B8310D8E-D88ECO8D3600008D**1(i???

0D31:00603E1900FCB91900F3-A674068D163B00EB>.........t...;..

0D31:0070048D163200B409CD-21CB8A460898508B...2....LF..P.

可用c命令修改數(shù)據(jù)區(qū)的字符串,操作如下:

-e29

0D31:002962.6661.6f63.726B.7777.6161.7272.64

0D31:003064.2c2E.20

再次用d命令查看修改結(jié)果。

-d0

0D31:00004D6F766520746865-20637572736F7220Movethecursor

0D3i:0010626i636B77617264-2E4D6F7665207468backward.Moveth

0D3i:00206520637572736F72-20666F72776172Wecursorforward

0D31:00302E204D6i7463682E-0D0A244E6F206D6I.Match...$Noma

0D31:0040746368210D0A2400-0000000000000000tell??■■??(?????

0D31:00501E2BCO50B8310D8E-D88ECO8D36000()8D1.+.P.1......6...

5

0D31:00603E1900FCB91900F3-A674068D163B00EB>........t

0D31:0070048D163200B409CD-21CB8A460898508B...2…J..F..P.

用g命令運行程序,結(jié)果為:

-g

Nomatch!

Programterminatednormal.y

用q命令退出debugo

至此,程序已調(diào)試完畢。為了進一步數(shù)名debug命令的使用方法,我們再次重復(fù)上述程序

的調(diào)試過程,只是使月e、a和f命令來修改數(shù)據(jù)區(qū)的內(nèi)容而已。必須注意,由于在用debug

調(diào)試程序時,只能修改當時有關(guān)的內(nèi)存單元內(nèi)容,因此重新用debug裝入程序時,仍是原

來在磁盤中的內(nèi)容。操作如下:

C:\>dcbugsamplc.cxc

-gOb

AX=0D31BX=0000CX=007ADX=()000SP=FFFCBP=0000SI=0000DI=000()

DS=0D31ES=0D31SS=0D31CS=0D36IP=000BNVUPEIPLZRNAPENC

0D36:000B8D360000LEASI,[0300]

DS:0000=6F4D

-dO

0D31:00004D6F766520746865-20637572736F7220Movethecursor

0D3l:00106261636B77617264-2E4D6F7665207468backward.Moveth

0D31:00206520637572736F72-206261636B776112ecursorbackwar

0D31:0030642E4D617463682E-0D0A244E6F206D61d.Match...$Noma

0D31:0040746368210D0A2400-0000000000000000tch!..$.......

0D31:00501E2BCO50B83I0D8E-D88ECO8D3600008D.+.P.1……6...

0D31:00603E1900FCB91900F3-A674068D163B(X)EB

0D31:0070048D163200B409CD-21CB46FA8B5EFCC1...2…

-e29'fonvard/20

-dO

0D31:00004D6F766520746865-20637572736F7220Movethecursor

0D31:00106261636B77617264-2E4D6F7665207468backward.Moveth

0D31:00206520637572736F72-20666F7277617264ecursorforward

0D31:00302E204D617463682E-0D0A244E6F206D61.Match.SNoma

0D3i:0040746368210D0A2400-0000000000000000lch!..$......

0D31:00501E2BCO50B83I0D8E-D88ECO8D3600008D.+.P.I.

0D31:00603E1900FCB91900F3-A674068D163B00EB>........t.

0D31:0070048D163200B409CD-21CB46FA8B5EFCC1...2....!F.A.

6

-g

Nomatch!

Programterminatednormal.y

可見這種e命令的方式避免使用ASCH碼進入,對用戶是比較方便的。其中最后一人20

是空格鍵的ASCH碼,以補足原來的內(nèi)容恢復(fù)原狀,具體如下:

-a0d31:29

0D31:0029db'backward.,

0D31:0032

-dO

0D3i:00004D6F766520746865-20637572736F7220Movethecursor

0D31:00106261636B77617264-2E4D6F7665207468backward.Moveth

0D31:00206520637572736F72-206261636B776112ccursorbackwar

0D31:0030642E4D617463682E-0DOA244E6F206D61d.Match...$Noma

0D31:004074636821ODOA2400-0000000000000000tch!

0D31:00501E2BCO50B8310D8E-D88ECO8D3600008D.+.P.1……6...

0D31:00603E1900FCB91900F3-A674068D163B00EB

OD3i:OO7O048D163200B409CD-21CB56FA897EEE8B…2…

-g

Match.

由于-a命令是匯編命令,因此信息是用匯編格式進入的。如果修改的是程序中的語句,方

法也是相同的,下面我們還會看到這類的操作?,F(xiàn)在再看一下用「命令修改數(shù)據(jù)區(qū)的方法。

C:\>debugsample.exe

-gOb

AX=0D31BX=0000CX=007ADX=0000SP=FFFCBP=0000SI=0000DI=0000

DS=0D3iES=0D3iSS=0D31CS=0D361P=OOOBNVUPElPLZRNAPENC

0D36:0(X)B8D360000LEASI,[03001

DS:0000=6F4D

-dO

0D31:00004D6F766520746865-20637572736F7220Movethecursor

0D31:00106261636B77617264-2E4D6F7665207468backward.Moveth

0D31:00206520637572736F72-206261636B776172ecursorhackwar

0D31:0030642E4D617463682E-0DOA244E6F206D61d.Match...$Noma

0D31:004074636821ODOA2400-00000000()0000000tell???■??(?????

0D3i:00501E2BCO50B831OD8E-D88ECO8D3600008D.+.P.I……6...

0D31:00603E1900FCB91900F3-A674068D163B00EB

0D31:0070048D163200B409CD-21CB56FA897EEE8B…2…

-f2919'forward/20

7

-g

Nomatch!

Programterminatednormal.y

-q

f命令中的29為修改區(qū)隹首地址,19表示需要修改的長度為9個字節(jié)。

為進一步說明程序的調(diào)試過程,現(xiàn)假設(shè)程序編制錯誤:在源文件中把jzmatch改為

jnz馬提出。該程序匯編、連接后,進入得不夠調(diào)試如下:

C>debugsample.exe

-g

Nomatch!

Programterminatednormally

結(jié)果是錯誤的(因源文件中的兩個字符是相同的)。為檢查程序的錯誤,將斷點設(shè)在比

較串之后。

-g19

AX=0D31BX=0000CX=0000DX=0000SP=FFFCBP=0000SI=0019DI=0032

DS=0D31ES=0D3ISS=0D31CS=0D36IP=0019NVUPEIPLZRNAPENC

0D36:00197506JNZ0021

此時零標志為ZR,即ZF=1,即表示比較結(jié)果相等,說明比較結(jié)果實正確的?,F(xiàn)在可用p

命令再執(zhí)行一?條指令以觀察指令的轉(zhuǎn)向。

-P

AX=0D31BX=0000CX=0000DX=0000SP=FFFCBP=0000SI=OOI9DI=0032

DS=0D31ES=0D31SS=0D31CS=0D36IP=001BNVUPEIPLZRNAPENC

0D36:001B8D163BOOLEADXJ003B]

DS:003B=6F4E

為查到003B單元的內(nèi)容,可查數(shù)據(jù)區(qū)如為

-d0

0D31:00004D6F766520746865-20637572736F7220Movethecursor

0D3l:00106261636B77617264-2E4D6F7665207468backward.Moveth

0D31:00206520637572736F72-206261636B776112ccursorbackwar

0D31:0030642E4D617463682E-0D0A244E6F206D61d.Ma(ch...$Noma

0D31:0040746368210D0A2400-0000000000000000tch!..$........

0D31:00501E2BCO50B83I0D8E-D88ECO8D3600008D.+.P.1……6...

0D31:00603E1900FCB91900F3-A675068D163BOOEB>........u...;..

OD3i:OO7O048D163200B409CD-21CB46FA8B5EFCC1

可見003B單元的內(nèi)容為4E,即N的ASCII碼,后面跟的是N。match!,這說明jnz指令

使用錯誤,應(yīng)該改為jz??捎胊命令修改,應(yīng)用u命令檢查修改結(jié)果。運行結(jié)果說明程序

修改正確。

8

-a19

0D36:00I9jz0021

0D36:001B

-uO

0D36:0000IEPUSHDS

OD36:OOO12BC0SUBAX,AX

0D36:000350PUSHAX

0D36:0004B83I0DMOVAX,0D31

0D36:00078ED8MOVDS,AX

0D36:00098EC0MOVES.AX

0D36:000B8D360000LEASI,[0000]

0D36:000F8D3E1900LEADIJ0019]

0D36:0013FCCLD

(236:0()14B91900MOVCX,(X)19

OD36:OOI7F3REPZ

OD36:OOI8A6CMPSB

0D36:00197406JZ0021

0D36:001B8D163B00LEADXJ003B]

0D36:001FEB04JMP0025

-rip

IP(X)1B

-q

在這里應(yīng)該注意,在使用a命令修改數(shù)據(jù)區(qū)時,必須給出數(shù)據(jù)段的地址,而在修改程序區(qū)

時由于a命令的缺省段位代碼段,所以直接給出偏移地址就可以了。

在調(diào)試過程中,也可以用t命令逐條跟蹤程序的執(zhí)行。下面列出斷點停在0b后.用

f命令修改數(shù)據(jù)區(qū)中字符串的內(nèi)容,然后逐條執(zhí)行指令的情況。

-12919'forward.?。

-dO

0D31:00004D6F766520746865-20637572736F7220Movethecursor

0D3l:00106261636B77617264-2E4D6F7665207468backward.Moveth

0D31:00206520637572736F72-20666F7277617264ecursorforward

0D31:00302E204D617463682E-0D0A244E6F206D61.Match...$Noma

0D31:0040746368210D0A2400-0000000000000000tch!..$........

0D31:00501E2BCO50B8310D8E-D88ECO8D3600008D.+.P.1......6...

0D3i:00603E1900FCB91900F3-A674068D163BOOEB>........t...;..

0D31:0070048D163200B409CD-21CB8A460898508B

9

AX=OD3IBX=OOOOCX=007ADX=0000SP=FFFCBP=OOOOSI=OOOODI=OOOO

DS=0D31ES=0D31SS=0D31CS=0D361P=OOOFNVUPEIPLZRNAPENC

OD36:OOOF8D3E19OOLEADIJO319]

DS:0019=6F4D

AX=0D3lBX=0000CX=007ADX=()000SP=FFFCBP=0000SI=()000DI=0019

DS=0D31ES=0D31SS=0D31CS=0D36IP=0013NVUPEIPLZRNAPENC

OD36:OO13FCCLD

-(

AX=0D31BX=0000CX=007ADX=0000SP=FFFCBP=0000SI=0000DI=0019

DS=0D31ES=0D31SS=0D3lCS=0D36IP=0014NVUPEIPLZRNAPENC

0D36:0014B919(X)MOVCX,0019

-t

AX=0D31BX=0000CX=00I9DX=0000SP=FFFCBP=OOOOSI=0000DI=0019

DS=0D31ES=0D31SS=0D31CS=0D36IP=0017NVUPEIPLZRNAPENC

0D36:0017F3REPZ

0D36:0018A6CMPSB

-(

AX=0D31BX=0000CX=0018DX=0000SP=FFFCBP=OOOOSI=0001DI=001A

DS=0D31ES=0D31SS=OD3ICS=0D36IP=0017NVUPEIPLZRNAPENC

0D36:0017F3REPZ

0D36:0018A6CMPSB

-t

AX=0D31BX=0000CX=OO17DX=0000SP=FFFCBP=0000SI=0002DI=001B

DS=0D31ES=0D3lSS=OD3ICS=0D36IP=0017NVUPEIPLZRNAPENC

OD36:OOI7F3REPZ

0D36:0018A6CMPSB

-t

AX=0D31BX=000()CX=0016DX=0000SP=FFFCBP=OOOOSI=0003DI=001C

DS=0D31ES=0D31SS=0D31CS=0D36IP=OO17NVUPEIPLZRNAPENC

0D36:0017F3REPZ

0D36:0018A6CMPSB

-tt

10

Error

AX=0D3lBX=0000CX=0015DX=0000SP=FFFCBP=OOOOSI=0004DI=001D

DS=0D31ES=0D31SS=0D31CS=0D36IP=0017NVUPEIPLZRNAPENC

OD36:OO17F3REPZ

0D36:0018A6CMPSB

AX=0D31BX=0000CX=0014DX=0000SP=FFFCBP=0000SI=0005DI=001E

DS=0D31ES=0D31SS=0D31CS=0D36IP=0017NVUPEIPLZRNAPENC

0D36:0017F3REPZ

0D36:0018A6CMPSB

-t

AX=0D31BX=0000CX=0013DX=0000SP=FFFCBP=0000SI=0006DI=001F

DS=0D31ES=0D31SS=0D31CS=0D36IP=0017NVUPEIPLZRNAPENC

0D36:0017F3REPZ

0D36:0018A6CMPSB

-t

AX=0D31BX=0000CX=0012DX=0000SP=FFFCBP=0000SI=0007DI=0020

DS=0D31ES=0D31SS=0D31CS=0D36IP=0017NVUPEIPLZRNAPENC

0D36:0017F3REPZ

0D36:0018A6CMPSB

-t

AX=0D31BX=0000CX=0011DX=0000SP=FFFCBP=0000SI=0008DI=002l

DS=0D31ES=0D31SS=0D31CS=0D36IP=0017NVUPEIPLZRNAPENC

0D36:0017F3REPZ

0D36:0018A6CMPSB

4

AX=0D31BX=0000CX=OOIODX=0000SP=FFFCBP=0000SI=0009DI=0022

DS=0D3IES=0D31SS=0D31CS=0D36IP=0017NVUPEIPLZRNAPENC

0D36:0017F3REPZ

0D36:0018A6CMPSB

II

AX=OD3IBX=OOOOCX=000FDX=0000SP=FFFCBP=0000SI=000ADI=OO23

DS=0D31ES=0D31SS=0D31CS=0D361P=OO17NVUPEIPLZRNAPENC

0D36:00I7F3REPZ

0D36:0018A6CMPSB

-t

AX=0D3lBX=0000CX=000EDX=0000SP=FFFCBP=0000SI=000BDI=0024

DS=0D31ES=0D31SS=0D31CS=0D36IP=0017NVUPEIPLZRNAPENC

0D36:0017F3REPZ

0D36:0018A6CMPSB

-t

AX=0D31BX=0000CX=000DDX=0000SP=FFFCBP=0000SI=000CDI=0025

DS=0D31ES=0D31SS=0D3iCS=0D36IP=(X)17NVUPEIPLZRNAPENC

0D36:0017F3REPZ

0D36:0018A6CMPSB

-(

AX=0D3lBX=0000CX=000CDX=0000SP=FFFCBP=0000SI=000DDI=0026

DS=0D31ES=0D31SS=0D3lCS=0D36IP=OO17NVUPEIPLZRNAPENC

OD36:OOI7F3REPZ

0D36:0018A6CMPSB

-t

AX=0D3lBX=0000CX=000BDX=0000SP=FFFCBP=0000SI=000EDI=0027

DS=0D31ES=0D3lSS=0D31CS=0D36IP=0017NVUPEIPLZRNAPENC

0D36:0017F3REPZ

0D36:0018A6CMPSB

-t

AX=0D31BX=0000CX=000ADX=0000SP=FFFCBP=0000SI=000FDI=OO28

DS=0D31ES=0D31SS=0D31CS=0D36IP=0017NVUPEIPLZRNAPENC

0D36:0017F3REPZ

0D36:0018A6CMPSB

-t

AX=0D3lBX=0000CX=0009DX=0000SP=FFFCBP=0000SI=00l0DI=0029

DS=0D31ES=0D31SS=0D3lCS=0D36IP=0017NVUPEIPLZRNAPENC

0D36:0017F3REPZ

12

0D36:0018A6CMPSB

AX=0D3lBX=0000CX=0008DX=0000SP=FFFCBP=OOOOSI=0011DI=002A

DS=0D31ES=0D31SS=0D31CS=0D36IP=0019NVUPEINGNZACPECY

OD36:OO197406JZ0021

-t

AX=0D31BX=0000CX=0008DX=0000SP=FFFCBP=OOOOSI=00llDI=002A

DS=0D3IES=0D31SS=0D31CS=0D36IP=00IBNVUPEINGNZACPECY

0D36:001B8D163B00LEADX,[003B]

DS:003B=6F4E

AX=0D31BX=0000CX=0008DX=003BSP=FFFCBP=0000SI=0011DI=002A

DS=0D3lES=0D31SS=0D31CS=0D36IP=001FNVUPEINGNZACPECY

0D36:001FEB04JMP0025

-t

AX=0D31BX=0000CX=0008DX=003BSP=FFFCBP=0000SI=0011DI=002A

DS=0D31ES=0D31SS=0D31CS=0D36IP=(X)25NVUPEINGNZACPECY

0D36:0025B409MOVAH,09

-t

AX=0931BX=0000CX=0008DX=003BSP=FFFCBP=0000SI=001lDI=002A

DS=0D31ES=0D3lSS=0D31CS=0D36IP=0027NVUPEINGNZACPECY

0D36:0027CD21INT21

-g

Nomatch!

Programterminatednormal'y

從這一過程可清楚地看出每次比較的結(jié)果,一旦比較不等,則立即從串指令退出,執(zhí)行

下面的指令。應(yīng)該注意,如果遇到系統(tǒng)功能調(diào)用,則不能再使用t或p命令跟蹤,而應(yīng)該

用斷點停在功能調(diào)用完成之后,然后再接著跟蹤。木例中,由于不需要再跟蹤,所以直

接用g命令運行到程序結(jié)束。

前面已經(jīng)提到,debug調(diào)試期間所修改的數(shù)據(jù)段或代碼段的內(nèi)容只是修改了內(nèi)存中的

內(nèi)容,而磁盤文件中的內(nèi)容并未修改。如果你的執(zhí)行文件是.com,則可在debug中用n、

w命令直接把經(jīng)修改后的內(nèi)存單元中的內(nèi)容存入磁盤,但是.exe文件則不允許這樣做,因

此,應(yīng)該重新進入編輯程序,根據(jù)調(diào)試結(jié)果把源文件修改正確,經(jīng)匯編、連接、執(zhí)行檢

13

查正確后再保存下來,

六、實驗報告要求

1.程序流程圖和源程序清單。

2.如何啟動和退出EDIT程序。

3.如何對源程序進行匯編及編輯。

4.如何啟動和退出DEBUG程序。

5.整理每個DEBUG命令使用的方法,實際示例及執(zhí)行結(jié)果。

6.啟動DEBUG后:要裝入某一個.EXE文件,應(yīng)通過什么方法實現(xiàn)?

14

實驗二尋址方式及指令

一、實驗?zāi)康模?/p>

1、熟練掌握DEBUG的常用命令,學(xué)會用DEBUG調(diào)試程序。

2、掌握數(shù)據(jù)在內(nèi)存中的存放方式和內(nèi)存操作數(shù)的幾種尋址方式。

3、掌握簡單指令的執(zhí)行過程。

二、實驗內(nèi)容:

1、設(shè)堆棧指針SP=2000H,AX=3000H,BX=5000H;請編一程序段將AX和

BX的內(nèi)容進行交換。請用堆棧作為兩寄存器交換內(nèi)容的中間存儲單元,用DEBUG

調(diào)試程序進行匯編與調(diào)試。

2、設(shè)DS二當前段地址,BX=0300H,SI=0002H;請用DEBUG的命令將存儲

器偏移地址300H?304H連續(xù)單元順序裝入OAH,OBH,OCH,ODH,0EH。在

DEBUG狀態(tài)下送入下面程序,并用單步執(zhí)行的方法,分析每條指令源地址的形成

過程,當數(shù)據(jù)傳送完畢時,AX中的內(nèi)容是什么。

程序清單如下:

MOVAX,BX

MOVAX,0304H

MOVAX,[0304H]

MOVAX,[BX]

MOVAX,0001[BX]

MOVAX,[BX][SI]

MOVAX,0001[BX][SI]

HLT

三、實驗要求:

1、實驗前要做好充分準備,包括匯編程序清單、調(diào)試步驟、調(diào)試方法,以及

對程序結(jié)果的分析等。

15

2、本實驗只耍求在DEBUG調(diào)試程序狀態(tài)下講行,包括匯編程序、調(diào)試程序

和執(zhí)行程序。

四、實驗報告:

1、程序說明。說明程序的功能、結(jié)構(gòu)。

2、調(diào)試說明。包括上機調(diào)試的情況、上機調(diào)試步驟、調(diào)試所遇到的問題是如

何解決的,并對調(diào)試過程中的問題進行分析,對執(zhí)行結(jié)果進行分析。

3、寫出源程序清單和執(zhí)行結(jié)果。

16

實驗三用查表的方法將一位十六進制數(shù)轉(zhuǎn)換成

與它相應(yīng)的ASCII碼

一、實驗?zāi)康模?/p>

1、熟練掌握編寫匯編語言原程序的基本方法和基本框架。

2、掌握查表法和查表指令XLAT。

3、熟練使用DEBUG調(diào)試程序。

二、實驗內(nèi)容:

用查表的方法將一位十六進制數(shù)轉(zhuǎn)換成與它相應(yīng)的ASCII碼,并將結(jié)果存放

至ljASCI單元中。

三、編程提示:

既然指定用查表的方法,那么首先要建立一個表TABLE。我們在表中按照十

六進制數(shù)從小到大的順序放入他們對應(yīng)的ASCII碼值。

DATASEGMENT

TABLEDB30H,31H,32H,33H,34H,35H,36H,37H

DB38H,39H,41H,42H,43H,44H,45H,46H

HEXDBX;X為待轉(zhuǎn)換的十六進制數(shù)

ASCIDB?;存放轉(zhuǎn)換后的ASCH碼

DATAENDS

四、實驗要求:

實驗前要做好充分準備,包括匯編程序清單、調(diào)試步驟、調(diào)試方法,以及對

程序結(jié)果的分析等

五、實驗報告:

1、程序說明。說明程序的功能、結(jié)構(gòu)。

2、調(diào)試說明。包括上機調(diào)試的情況、上機調(diào)試步驟、調(diào)試所遇到的問題是如

何解決的,并對調(diào)試過程中的問題進行分析,對執(zhí)行結(jié)果進行分析。

3、寫出源程序清單和執(zhí)行結(jié)果。

17

實驗四將鍵盤輸入的小寫字母用大寫字母顯示出來

一、實驗?zāi)康模?/p>

1、掌握接受鍵盤數(shù)據(jù)的方法,并了解將鍵盤數(shù)據(jù)顯示時.,須轉(zhuǎn)為ASCII碼的

原理。

2、掌握DOS功能調(diào)用的編程方法。

二、實驗內(nèi)容:

試編寫一個匯編語言程序,要求對鍵盤輸入的小寫字母用大寫字母顯示出來。

三、編程提示:

利用DOS功能調(diào)用1NT21H的1號功能從鍵盤輸入字符和2號功能在顯示器

上顯示一個字符。

四、實驗要求:

實驗前要做好充分準備,包括匯編程序清單、調(diào)試步驟、調(diào)試方法,以及對

程序結(jié)果的分析等。

五、實驗報告:

1、程序說明。說明程序的功能、結(jié)構(gòu)。

2、調(diào)試說明。包括上機調(diào)試的情況、上機調(diào)試步驟、調(diào)試所遇到的問題是如

何解決的,并對調(diào)試過程中的問題進行分析,對執(zhí)行結(jié)果進行分析。

3、寫出源程序清單和執(zhí)行結(jié)果。

DATASEGMENT

STRINGDB100DUP(?)

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATA

START:MOVAX,DATA

MOVAH,1

INT2IH

CMPAL.,0,

JEEXIT

18

CALLSTOB

MOV[DI],AL

INCDI

JMPAGAIN

EXIT:MOVAH,4CH

INT21H

;子程序名:STOB

,功能:將小寫字母修改為大寫字母

;入口參數(shù):AL存放輸入的字符

;出口參數(shù):AL存放修改后的字符

STOBPROCNEAR

CMPAL,61H

JBNEXT

CMPAL,7AH

JANEXT

SUBAL,20H

SUBAL,20H

NEXT:RET

STOBENDP

CODEENDS

ENDSTART

19

實驗五分支程序設(shè)計

一、實驗?zāi)康模?/p>

1、掌握分支程序的結(jié)構(gòu)。

2、掌握分支程序的設(shè)計、調(diào)試方法。

二、實驗內(nèi)容:

假設(shè)有一組數(shù)據(jù):5,-4,0,3,100,-51,請編一程序,判斷:每個數(shù)大于0,

等于0,還是小于0;并輸出其判斷結(jié)果。

1當x>0

即:y=.()當x=0

-1當XV。

三、實驗要求:

實驗前要做好充分準備,包括匯編程序清單、調(diào)試步驟、調(diào)試方法,以及對

程序結(jié)果的分析等。

四、編程提示:

1、首先將原始數(shù)據(jù)裝入起始地址為XX的字節(jié)存儲單元中。

2、將判斷結(jié)果以字符串的形式存放在數(shù)據(jù)區(qū)中,以便在顯示輸出時調(diào)用。

3、其中判斷部分可采用CMP指令,得到一個分支結(jié)構(gòu),分別輸出“y=0”,“y二1”,

“尸1”。

4、程序中存在一個循環(huán)結(jié)構(gòu),循環(huán)6次,調(diào)用6次分支結(jié)構(gòu)后結(jié)束。

五、思考題:

程序中的原始數(shù)據(jù)是以怎樣的形式存放在數(shù)提區(qū)中的?請用DEBUG調(diào)試程

序觀察并分析。

六、實驗報告:

1、程序說明。說明程序的功能、結(jié)構(gòu)。

2、調(diào)試說明。包括上機調(diào)試的情況、上機調(diào)試步驟、調(diào)試所遇到的問題是如

何解決的,并對調(diào)試過程中的問題進行分析,對執(zhí)行結(jié)果進行分析。

3、畫出程序框圖。

4、寫出源程序清單.和執(zhí)行結(jié)果。

5、回答思考題。

20

DATASEGMENT

XDB7

Y1DB4Y=0,,0DH,0AH/$,

Y2DB4Y=+l\0DH,0AH;$,

Y3DB4Y=-l,,0DH,0AH,,$,

DATAENDS

CODESEGMENT

ASSUMECS:CODEDS,DATA

START:MOVAX,DATA

MOVDS,AX

MOVAL,X

CMPAL,0

JGEBIGR

MOVDX,OFFSETY3

JMPCRT

BIGR:JEEQUL

MOVDX,OFFSETY2

JMPCRT

EQUL:MOVDX,OFFSETY1

CRT:MOVAH,9H

INT21H

MOVAX,4COOH

INT21H

CODEENDS

ENDSTART

實驗六循環(huán)程序設(shè)計

一、實驗?zāi)康?/p>

21

1、加深對循環(huán)結(jié)構(gòu)的理解。

2、掌握循環(huán)程序的設(shè)計方法。

二、實驗內(nèi)容與要求

1、編制程序計算S=l+2?3+3?4+4?5+……+N(N+1)+……直到N(N+1

)大于200為止,并將結(jié)果由屏幕上顯示出來。其程序的流程圖如圖6.1所示。

2、將從3000H內(nèi)存單元開始的100個字節(jié)存儲單元全部清0。

本實驗要求在DEBUG調(diào)試狀態(tài)下進行,包括匯編程序、運行程序、檢查結(jié)

果。

三、程序框圖

圖6.1程序框圖

四、實驗步驟

實驗內(nèi)容一:

1)按程序流程圖編制實驗程序。

2)輸入源程序。

3)匯編、連接程序,執(zhí)行程序,檢查結(jié)果。

22

實驗內(nèi)容二:

1)輸入源程序并檢查無誤。

2)對內(nèi)存單元3000H開始的100個存儲單元用E命令輸入任意數(shù)。

3)程序的執(zhí)行可用DEBUG的G命令,也可用T命令單步跟蹤執(zhí)行。

4)用D命令檢查執(zhí)行結(jié)果。

五、實驗報告

1、列出源程序。

2、對程序中用到的寄存器說明其功能。

3、總結(jié)計數(shù)控制循環(huán)程序的設(shè)計方法。

4、說明怎樣使用DEBUG進行程序調(diào)試的。調(diào)試過程中所遇到的問題是如何

解決的。

23

實驗七按學(xué)號順序把學(xué)生名次從終端上顯示出來

一、實驗?zāi)康?/p>

1、掌握程序設(shè)計方法,合理劃分層次

2、掌握子程序的調(diào)用與返回的方法

3、了解子程序的嵌套與遞歸

二、實驗內(nèi)容與要求

編制一程序,要求鍵入一個班的學(xué)生成績,并存放于50字的ERADE數(shù)組中,

然后根據(jù)ERADE中的成績,把學(xué)生名次填入50字的RANK數(shù)組中,再按學(xué)號順

序把名次從終端上顯示出來。

提示:

①程序MAIN

功能:根據(jù)輸入的學(xué)生成績,計算并顯示出學(xué)生名次。

②子程序INPUT

功能:接收一個班級學(xué)生的成績,各成績之間用空格隔開。

③子程序RANKP

功能:計算一個班級學(xué)生的名次。

④子程序OUTPUT

功能:輸出(顯示)一個班級的學(xué)生名次

⑤子程序DECIBIN

功能:十進制轉(zhuǎn)換二進制,存入BX

⑥子程序BINDEC

功能:十進制轉(zhuǎn)換二進制,并在屏幕上顯示。

⑦子程序DEC_DIV

功能:BX的內(nèi)容除以CX的內(nèi)容,并在屏幕上顯示一位商。

24

三、程序框圖:

(返回)

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論