匯編語言實驗指導(dǎo)書2016_第1頁
匯編語言實驗指導(dǎo)書2016_第2頁
匯編語言實驗指導(dǎo)書2016_第3頁
匯編語言實驗指導(dǎo)書2016_第4頁
匯編語言實驗指導(dǎo)書2016_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

匯編語言實驗指導(dǎo)書實驗環(huán)境:1.硬件:PC微機2.軟件:DOS系統(tǒng)、EDIT.EXE、MASM.EXE、LINK.EXE、DEBUG.EXE注:DOS系統(tǒng)(WINDOWS下的虛擬8086方式)上機注意事項●進入”命令提示符(DOS空間)”有多種方法:1.通過附件進入:命令提示符↓2.“開始”→“運行”→敲入命令“cmd”;3.鍵盤wir+r→敲入命令“cmd”●dos命令窗口大小調(diào)整辦法:在DOS窗口標(biāo)題欄上點擊右鍵,選擇“屬性”,在“布局”標(biāo)簽頁中修改“窗口大小”設(shè)置。●常用DOS命令:回根目錄命令:cd..↓cd\↓(一次退到根)轉(zhuǎn)到D盤命令:D:↓看D盤目錄命令:D:\>dir↓進入文件夾命令:cdxxx↓●用編輯軟件輸入完整的匯編語言源文件,在Windows系統(tǒng)下用記事本即可;在DOS系統(tǒng)下用EDIT軟件編輯。要求編輯完成的文件擴展名一定是.asm實驗一DEBUG命令實驗一.實驗?zāi)康模菏煜EBUG程序和命令,并用它運行基本指令和察看運行結(jié)果。eq\o\ac(○,1)怎樣調(diào)用Debug②如何顯示和修改內(nèi)存單元③如何顯示和修改CPU的寄存器④各標(biāo)志位的狀態(tài)是如何表示的,怎樣修改標(biāo)志寄存器⑤怎樣匯編與反匯編⑥怎樣執(zhí)行程序⑦怎樣跟蹤程序⑧怎樣退出Debug二.實驗內(nèi)容:DEBUG是專門為匯編語言設(shè)計的一種調(diào)試工具,它通過步進,設(shè)置斷點等方式為匯編語言程序員提供了非常有效的調(diào)試手段。1、DEBUG程序的啟動DEBUG的命令格式:[drive:][path]DEBUG[d:][p][filename][.ext][param...]其中:drive:

是指定DEBUG文件的磁盤驅(qū)動器標(biāo)識符,DEBUG是外部DOS命令,所以必須把它從磁盤讀入內(nèi)存。若未指定,DOS將使用當(dāng)前默認磁盤驅(qū)動器。path:

是DOS查找DEBUG文件的一個子目錄串表示的路徑。若未指定,DOS將使用當(dāng)前工作目錄。d:

是DEBUG將要調(diào)試的文件所在的磁盤驅(qū)動器。p:

是查找DEBUG將要調(diào)試的文件所需的子目錄路徑,若未指定,DOS使用當(dāng)前目錄。filename[.ext]是DEBUG將要調(diào)試的文件名。param

是將被調(diào)試的程序(或文件)的命令行參數(shù)。例如:debug.exe就在C盤根目錄下,在DOS提示符下,可鍵入命令:C:\>debug進入DEBUG控制狀態(tài),顯示提示符'-'DEBUG所完成的初始化動作:段寄存器CS、DS、ES和SS置為DEBUG程序后的第一個段。指令指針寄存器IP置為100H(程序段前綴PSP后的第一個語句)。(256字節(jié)為PSP數(shù)據(jù)區(qū),DOS利用SPS與被加載程序進行通信)堆棧指針SP置為段末或COMMAND.COM暫駐部分的結(jié)束地址(其中較小的那個地址)。其余通用寄存器均置為0,標(biāo)志寄存器置為下述狀態(tài)。NV

UP

EI

PL

NE

NA

PO

NC標(biāo)志名置位復(fù)位溢出Overflow(是/否)OVNV方向Direction(減量/增量)DNUP中斷Interrupt(允許/屏蔽)EIDI符號Sign(負/正)NGPL零Zero(是/否)ZRNZ輔助進位AuxiliaryCarry(是/否)ACNA奇偶Parity(偶/奇)PEPO進位Carry(是/否)CYNC注:nv(清除)ov(溢出)方向dn(減)up(增)中斷ei(啟用)di(禁用)正負ng(負)pl(正)零zr(0)nz(非0)輔助進位ac(進位)na(不進位)奇偶校驗pe(偶校驗)po(奇校驗)進位cy(進位)nc(不進位))2、DEBUG的主要命令(注意:地址和數(shù)據(jù)的默認單位“16進制”,不用寫“H”)匯編命令A(yù),格式為:-A[地址]該命令從指定地址開始允許輸入?yún)R編語句,把它們匯編成機器代碼相繼存放在從指定地址開始的存儲器中。如無“地址”選項,則從默認地址開始。例如:-a136B:0100movax,100136B:0103movbx,200136B:0106movcx,300

136B:0109movdx,400136B:010Caddax,bx136B:010Esubax,cx136B:0111-反匯編命令U,有兩種格式:1)-U[地址]該命令從指定地址開始,反匯編32個字節(jié),若地址省略,則從上一個U命令的最后一條指令的下一個單元開始顯示32個字節(jié)。例如:-u13C9:00001EPUSH DS13C9:00012BC0SUB AX,AX13C9:000350PUSH AX13C9:0004B8C313MOV AX,13C313C9:00078ED8MOV DS,AX13C9:0009B8C613MOV AX,13C613C9:000C8EC0MOV ES,AX13C9:000E8D360000LEA SI,[0000]13C9:00128D3E0000LEA DI,[0000]13C9:0016FCCLD 13C9:0017B92800MOV CX,002813C9:001AF3REPZ 13C9:001BA4MOVSB 13C9:001CCBRETF 13C9:001D0000ADD [BX+SI],AL13C9:001F0000ADD [BX+SI],AL2)-U范圍該命令對指定范圍的內(nèi)存單元進行反匯編,例如:-u13c9:000e001b13C9:000E8D360000LEA SI,[0000]13C9:00128D3E0000LEA DI,[0000]13C9:0016FCCLD 13C9:0017B92800MOV CX,002813C9:001AF3REPZ 13C9:001BA4MOVSB -運行命令G,格式為:-G[=地址1][地址2]其中地址1規(guī)定了運行起始地址,地址2為斷點地址。沒有“=地址1”則從默認地址0100H開始。即:-G[斷點地址]程序從當(dāng)前地址0100H開始連續(xù)運行到斷點地址。追蹤命令T,有兩種格式:1)逐條指令追蹤:-T[=地址]該命令從指定地址起執(zhí)行一條指令后停下來,顯示寄存器內(nèi)容和狀態(tài)值。無地址則從當(dāng)前默認地址開始。-tAX=0000BX=0000CX=007DDX=0000SP=FFFEBP=0000SI=0000DI=0000DS=13B3ES=13B3SS=13C3CS=13C9IP=0001NVUPEIPLNZNAPONC13C9:00012BC0SUB AX,AX-2)多條指令追蹤:-T[=地址][值]該命令從指定地址起執(zhí)行n條命令后停下來,n由[值]確定。-t3AX=0000BX=0000CX=007DDX=0000SP=FFFEBP=0000SI=0000DI=0000DS=13B3ES=13B3SS=13C3CS=13C9IP=0001NVUPEIPLNZNAPONC13C9:00012BC0SUB AX,AXAX=0000BX=0000CX=007DDX=0000SP=FFFEBP=0000SI=0000DI=0000DS=13B3ES=13B3SS=13C3CS=13C9IP=0003NVUPEIPLZRNAPENC13C9:000350PUSH AXAX=0000BX=0000CX=007DDX=0000SP=FFFCBP=0000SI=0000DI=0000DS=13B3ES=13B3SS=13C3CS=13C9IP=0004NVUPEIPLZRNAPENC13C9:0004B8C313MOV AX,13C3顯示內(nèi)存單元內(nèi)容的命令D,格式為:-D[地址]-d13c3:000013C3:00006161616161616161-6161616161616161aaaaaaaaaaaaaaaa13C3:00106161616161616161-6161616161616161aaaaaaaaaaaaaaaa13C3:00206161616161616161-0000000000000000aaaaaaaa13C3:00306161616161616161-6161616161616161aaaaaaaaaaaaaaaa13C3:00406161616161616161-6161616161616161aaaaaaaaaaaaaaaa13C3:00506161616161616161-0000000000000000aaaaaaaa13C3:00601E2BC050B8C3138E-D8B8C6138EC08D36.+.P613C3:007000008D3E0000FCB9-2800F3A4CB000000...>(-修改內(nèi)存單元內(nèi)容的命令E,它有兩種格式:1)用給定的內(nèi)容代替指定范圍的單元內(nèi)容: -E地址內(nèi)容表 例如:-E2000:0100F3“XYZ”8D其中F3,“X”“Y”“Z”和8D各占一個字節(jié),用這五個字節(jié)代替原內(nèi)存單元2000:0100到0104的內(nèi)容,“X”“Y”“Z”將分別按它們的ASCII碼值代入。2)逐個單元相繼地修改: -E地址 例如:-E100: 18E4:010089.78 此命令是將原100號單元的內(nèi)容89改為78。78是程序員鍵入的。檢查和修改寄存器內(nèi)容的命令R,它有三種方式:1)顯示CPU內(nèi)部所有寄存器內(nèi)容和標(biāo)志位狀態(tài);格式為:-R R命令顯示中標(biāo)志位狀態(tài)的含義如下表所示:標(biāo)志名置位復(fù)位溢出Overflow(是/否)OVNV方向Direction(減量/增量)DNUP中斷Interrupt(允許/屏蔽)EIDI符號Sign(負/正)NGPL零Zero(是/否)ZRNZ輔助進位AuxiliaryCarry(是/否)ACNA奇偶Parity(偶/奇)PEPO進位Carry(是/否)CYNC2)顯示和修改某個指定寄存器內(nèi)容,格式為: -R寄存器名 例如打入:-RAX 系統(tǒng)將響應(yīng)如下: AXFIF4 : 表示AX當(dāng)前內(nèi)容為F1F4,此時若不對其作修改,可按ENTER鍵,否則,打入修改后內(nèi)容,如: -RBX BX0369 :059F 則BX內(nèi)容由0369改為059F3)顯示和修改標(biāo)志位狀態(tài),命令格式為: -RF 系統(tǒng)將給出響應(yīng),如 OVDNEINGZRACPECY- 這時若不作修改可按ENTER鍵,否則在“-”號之后鍵入修改值,鍵入順序任意。如 OVDNEINGZRACPECY-PONZDINV(8)退出DEBUG命令Q,該命令格式為 -Q 它退出DEBUG程序,返回DOS。三.實驗要求:反復(fù)練習(xí)熟悉DEBUG各種命令:A命令、U命令、G命令、T命令、R命令、Q命令等等。四.實驗報告:寫出在DEBUG狀態(tài)下編寫、運行程序的過程以及調(diào)試所中遇到的問題是如何解決的,并對調(diào)試過程中的問題進行分析,對執(zhí)行結(jié)果進行分析。實驗二算術(shù)運算指令實驗一、實驗?zāi)康?、算術(shù)指令的格式、功能及用法。2、熟悉二進制數(shù)的四則運算指令,掌握各種運算指令的格式、用法、尋址方式和對標(biāo)志位的影響,特別是對溢出標(biāo)志位CF和OF的影響。二、實驗內(nèi)容1、用加減法指令計算下列各組十六進制數(shù)加減結(jié)果并和你的手算結(jié)果比較:(1)34H,22H (2)56H,78H (3)A5,79H (4)1284H,5678H (5)A758H,347FH用R命令檢查各寄存器內(nèi)容,特別注意AX,BX,CX,DX,IP及標(biāo)志位中ZF,CF和AF的內(nèi)容。用R命令將AX,BX內(nèi)容改寫為1050H及23A8H。 2、加減法指令: 1)用A命令在內(nèi)存100H(鍵入:A100,a與100之間有無空格都行)處鍵入下列內(nèi)容: MOV AH,34 MOV AL,22 ADD AL,AH SUB AL,78 MOV CX,1284 MOV DX,5678 ADD CX,DX SUB CX,AX SUB CX,CX 2)用U命令檢查鍵入的程序及對應(yīng)的機器碼。 3)用T命令逐條運行這些指令,檢查并記錄有關(guān)寄存器及ZF情況。3、帶進位加減法: 1)用A命令在內(nèi)存200H處鍵入下列內(nèi)容,并用U命令檢查: MOV AH,12 MOV AL,84 MOV CH,56 MOV CL,78 ADD AL,CL ADC AH,CH MOV DH,A7 MOV DL,58 SUB DL,7F SBB DH,342)用T命令逐條運行這些指令,檢查并記錄有寄存器及CF內(nèi)容。 3)上面這段程序若改用16位操作指令達到同樣結(jié)果,怎么改?試修改并運行之。4、BCD碼加減法 1)內(nèi)容: MOV AL,58 ADD AL,25 DAA 2)要求:用A命令鍵入,U命令檢查,T命令逐條運行并記錄有關(guān)寄存器及AF內(nèi)容。5、自編程序用16位減法指令編一個32位(4字節(jié))數(shù)減法程序,調(diào)試并做記錄。三、實驗報告要求:1、十六進制數(shù)加減法手算結(jié)果及實驗結(jié)果2、8086常用指令練習(xí)部分的逐條運行記錄,思考結(jié)果及自編程序運行記錄(列出自編程序)。3、各項實驗結(jié)果記錄。4、自編程序原稿及調(diào)試后修正稿,寫出原稿錯在那里。實驗三串處理指令實驗一、實驗?zāi)康氖煜ご幚碇噶疃?、實驗?nèi)容及步驟1、分析、理解、跟蹤執(zhí)行下列程序。 movsi,2000 movdi,3000 movcx,000a repmovsb hlt2、數(shù)據(jù)串搬家程序:1)用A命令鍵入下列程序:MOV SI,1000MOV DI,1500MOV CX,0FLOP:MOV AL,[SI]MOV [DI],ALINC SIINC DILOOP LOPINT 202)用A命令DB偽指令在1000H鍵入下列字符串:‘IBM_PCCOMPUTER'3)用G命令運行此程序,并用D命令檢查目的地址處的字符與源串是否一致。4)若此程序中的目的地址改為1002H,再運行此程序,看能不能把1000H開始的字符串搬到1002H開始的地方去?修改程序以做到這點。3、段寄存器概念及字符串傳送指令練習(xí)1)用A命令鍵入下列程序:MOV SI,0MOV DI,0MOV AX,1000MOV DS,AXMOV AX,1500MOV ES,AXMOV CX,0FCLDREP MOVSBINT 202)用A命令DB偽指令在1000:0000處鍵入字符串'IBM_PCCOMPUTER',并用D命令檢查之。3)用D命令檢查0F00:1000處內(nèi)容,看是否一樣,為什么?4)用G命令運行此程序,檢查目的地址1500:0000處內(nèi)容。并記下DS與ES值。5)修改此程序,使ES與DS為同一值,以減少一條指令,而源物理地址和目的物理地址(是多少?)仍和原來一樣。三、實驗報告要求1、各項實驗記錄和思考題。2、要求你修改的程序的清單(修改后)和調(diào)試記錄。實驗四匯編語言程序的上機前面三個實驗都是DEBUG命令實驗,即都是在DEBUG軟件支持下完成的匯編語言指令的調(diào)試。一個完整的匯編語言程序上機實驗應(yīng)該是:一、建立匯編語言的工作環(huán)境為運行匯編語言程序至少要在磁盤上建立以下文件:編輯程序,如EDIT.EXE匯編程序,如MASM.EXE連接程序,如LINK.EXE調(diào)試程序,如DEBUG.COM必要時,還可建立如CREF.EXE,EXE2BIN.EXE等文件。二、在計算機上運行匯編語言的步驟用編輯程序建立ASM源文件,以ASM作為擴展名用匯編程序把ASM文件轉(zhuǎn)換成OBJ文件用連接程序把OBJ文件轉(zhuǎn)換成可執(zhí)行文件在DOS提示符下直接鍵入可執(zhí)行文件名即可執(zhí)行該程序三、建立ASM文件 建立ASM文件的編輯程序可以是DOS自身帶的編輯程序EDIT.EXE,在DOS提示符下鍵入EDIT命令即可出現(xiàn)EDIT界面,其操作如下:D:\>edit源程序輸入完后,以ASM作為擴展名進行保存,假設(shè)所保存的文件名為:ex.asm。ASM源文件的格式1:;定義數(shù)據(jù)段,如果需要的話,其中segment和ends是一對偽操作,表示段的開始和結(jié)束datasegment ;數(shù)據(jù)段開始 ;定義數(shù)據(jù)段的主體,如定義變量dataends ;數(shù)據(jù)段結(jié)束;定義附加段,如果需要的話extrasegment ;附加段開始 ;定義附加段的主體,如定義變量extraends ;附加段結(jié)束;定義代碼段,必須的codesegment ;代碼段開始mainprocfar;程序的主體部分,proc和endp這一對偽操作表示一個程序模塊的開始和結(jié)束 assumeds:data,es:extra,cs:code ;assume偽操作指定某個段分配給哪個段寄存器start: ;程序的入口地址 pushds ;保存原數(shù)據(jù)段 subax,ax ;ax寄存器清零,作為數(shù)據(jù)段0偏移地址 pushax ;數(shù)據(jù)段0偏移地址壓入堆棧中 movax,data movds,ax ;把數(shù)據(jù)段地址裝入數(shù)據(jù)段寄存器ds movax,extra moves,ax ;把附加段地址裝入附加段寄存器es ;自己所要實現(xiàn)的功能源代碼在此添加 ret ;程序結(jié)束后返回DOSmainendp ;程序的主體部分結(jié)束codeends ;代碼段結(jié)束 endstart ;匯編程序的結(jié)束,程序在start處開始執(zhí)行ASM源文件的格式2:;定義數(shù)據(jù)段,如果需要的話,其中segment和ends是一對偽操作,表示段的開始和結(jié)束datasegment ;數(shù)據(jù)段開始 ;定義數(shù)據(jù)段的主體,如定義變量dataends ;數(shù)據(jù)段結(jié)束;定義附加段,如果需要的話extrasegment ;附加段開始 ;定義附加段的主體,如定義變量extraends ;附加段結(jié)束;定義代碼段,必須的codesegment ;代碼段開始mainprocfar;程序的主體部分,proc和endp這一對偽操作表示一個程序模塊的開始和結(jié)束 assumeds:data,es:extra,cs:code ;assume偽操作指定某個段分配給哪個段寄存器start: ;程序的入口地址 movax,data movds,ax ;把數(shù)據(jù)段地址裝入數(shù)據(jù)段寄存器ds movax,extra moves,ax ;把附加段地址裝入附加段寄存器es ;自己所要實現(xiàn)的功能源代碼在此添加 movax,4c00h ;程序結(jié)束后返回DOS int21hmainendp ;程序的主體部分結(jié)束codeends ;代碼段結(jié)束 endstart ;匯編程序的結(jié)束,程序在start處開始執(zhí)行四、用MASM程序產(chǎn)生OBJ文件 源文件建立后,就要用匯編程序?qū)υ次募R編,匯編后產(chǎn)生二進制目標(biāo)文件(以O(shè)BJ作為擴展名),其操作如下:D:\>masmex.asm 匯編程序輸入的是ASM文件,其輸出文件可以是3個,第一個是OBJ文件,這是我們匯編的主要目的。第二個是LIST文件,稱為列表文件,這個文件列出源程序和機器語言程序清單,并給出符號表,因而可使程序調(diào)試更加方便,這個文件可有可無,如果不需要,則可對[NUL.LST]直接按回車鍵。LST清單的最后部分為段名表和符號表,表中分別給出段名、段的大小及有關(guān)屬性,以及用戶定義的符號名、類型和屬性。第三個是CRF文件,這個文件用來產(chǎn)生交叉引用表REF,對于一般程序不需要建立此文件。為了建立交叉引用表,必須調(diào)用CREF程序。至此,匯編過程已經(jīng)完成了。但是,匯編程序還有另一個重要功能,可以給出源程序的出錯信息(見后面的附件2)。警告信息(warningerrors)指出匯編程序所認為的一般性錯誤,嚴(yán)重警告錯誤(severeerrors)則指出匯編程序認為已使匯編程序無法進行正確匯編的錯誤。除給出錯誤的個數(shù)外,匯編程序還給出出錯信息,包括出錯的行和錯誤類型。當(dāng)然匯編程序只能給出程序中的語法錯誤,至于程序的算法或編制程序中的其他錯誤則程序的調(diào)試時去解決。五、用LINK程序產(chǎn)生EXE文件 在DOS提示符下鍵入LINK命令即可,具體的操作如下:D:\>linkex.obj LINK程序有兩個輸入文件OBJ和LIB。OBJ是我們需要連接的目標(biāo)文件,LIB則是程序中需要用到的庫文件,如果程序中沒有用到庫文件,則直接按回車健。LINK程序有兩個輸出文件EXE和MAP文件,EXE文件就是可執(zhí)行文件,MAP文件是連接程序的列表文件,又稱為連接映像,它給出每個段在存儲器中的分配情況。六、程序的執(zhí)行 在DOS提示符下直接鍵入可執(zhí)行的文件名即可,具體的操作如下:D:\>ex七、舉例下面這個源代碼的功能是在屏幕上顯示一個字符串“ThisismyfirstASMprogram.”。datasegmentstringdb'ThisismyfirstASMprogram.',13,10,'$';字符串以’$’符號結(jié)尾,以單引號括起來dataendscodesegmentmainprocfar assumecs:code,ds:data ;assume偽操作指定某個段分配給哪個段寄存器,但它不能把;段地址裝入段寄存器中start: ;程序的入口地址 pushds ;saveolddatasegment subax,ax ;ax寄存器清零,作為數(shù)據(jù)段0偏移地址 pushax ;零偏移地址入棧 movax,data movds,ax ;把數(shù)據(jù)段地址裝入數(shù)據(jù)段寄存器ds leadx,string ;把字符串首地址裝入dx寄存器,或?qū)懗蒻ovdx,offsetstring movah,9 ;DOS功能調(diào)用,在屏幕上顯示字符串 int21h ;DOS中斷 ret ;returntoDOSmainendpcodeends endstart ;匯編的結(jié)束,程序在此執(zhí)行請利用DOS下自身帶的編輯程序EDIT.EX,或利用Windows下的記事本,將上面的源代碼編輯成ASM文件,存入相應(yīng)文件夾中,注意文件的擴展名一定是.ASM,如:ex.asm。在計算機上運行匯編語言的步驟:用編輯程序建立ASM源文件,以ASM作為擴展名用匯編程序把ASM文件轉(zhuǎn)換成OBJ文件用連接程序把OBJ文件轉(zhuǎn)換成可執(zhí)行文件在DOS提示符下直接鍵入可執(zhí)行文件名即可執(zhí)行該程序?qū)懗鰧嶒瀳蟾妗嶒炍宸种С绦蛟O(shè)計一、實驗?zāi)康?1、熟練掌握邏輯運算和轉(zhuǎn)移指令 1)

邏輯運算指令 2)

標(biāo)號和無條件轉(zhuǎn)移指令 3)

比較指令和條件轉(zhuǎn)移指令 2、掌握分支程序設(shè)計的原理和方法,重點掌握各種分支程序中形成和判斷條件而產(chǎn)生的程序段的設(shè)計方法和技巧.二、實驗內(nèi)容1、練習(xí)邏輯運算指令、比較指令和條件轉(zhuǎn)移指令的功能、用法以及與標(biāo)志位的關(guān)系和可用的尋址方式2、用地址表法,完成下面要求的多分支程序的設(shè)計。根據(jù)MODE單元中的模式字(0-7)分別轉(zhuǎn)向L0-L7標(biāo)號處執(zhí)行。L0-L7處分別完成顯示‘0’-‘7’字符。 當(dāng)MODE=0時,轉(zhuǎn)L0標(biāo)號,完成顯示‘0’ 當(dāng)MODE=1時,轉(zhuǎn)L1標(biāo)號,完成顯示‘1’ 當(dāng)MODE=2時,轉(zhuǎn)L2標(biāo)號,完成顯示‘2’ 當(dāng)MODE=3時,轉(zhuǎn)L3標(biāo)號,完成顯示‘3’ 當(dāng)MODE=4時,轉(zhuǎn)L4標(biāo)號,完成顯示‘4’ 當(dāng)MODE=5時,轉(zhuǎn)L5標(biāo)號,完成顯示‘5’ 當(dāng)MODE=6時,轉(zhuǎn)L6標(biāo)號,完成顯示‘6’ 當(dāng)MODE=7時,轉(zhuǎn)L7標(biāo)號,完成顯示‘7’3、編制程序?qū)崿F(xiàn)如下操作:設(shè)有10個學(xué)生成績,分別統(tǒng)計低于60分、60~69分、70~79分、80~89分、90~99分及100分的人數(shù),并存放于S5、S6、S7、S8、S9、S10單元中。程序清單: ; 統(tǒng)計學(xué)生成績 DATA SEGMENT GRADEDW95H,60H,75H,92H,71H,86H,54H,89H,83H,76H NEQU($—GRADE)/2 ORG30H S5 DW0 S6 DW0 S7 DW0 S8 DW0 S9 DW0 S10 DW0 DATA ENDS ; STACK SEGMENTSTACK STA DB20DUP(0)TOPEQU$—STA STACKENDS ; CODE SEGMENT MAIN PROCFAR ASSUMECS:CODE,DS:DATA,SS:STACK START:PUSHDS SUBAX,AXPUSHAX MOVAX,DATA MOVDS,AX MOVCX,N LEABX,GRADE;成績表首地址 COMPARE: MOVAX,[BX] CMPAX,60H;<60? JCFIVE CMPAX,70H ;<70? JCSIX CMPAX,80H ;<80? JCSEVEN CMPAX,90H ;<90? JCEIGHT CMPAX,100H ;=100 JNENINE INCS10 JMPCHA NINE:INCS9 JMPCHA EIGHT:INCS8 JMPCHA SEVEN: INCS7 JMPCHA SIX: INCS6 JMPCHA FIVE: INCS5 JMPCHA CHA:ADDBX,2 ;循環(huán)學(xué)生人數(shù) LOOPCOMPARE RET MAINENDP CODEENDS ENDSTART 執(zhí)行程序后,將結(jié)果分別填入下列表中N(總?cè)藬?shù))S5S6S7S8S9S10三、實驗要求:1、在BLOCK開始的內(nèi)存單元中有若干以字節(jié)為單位的正、負數(shù),自編程序,試統(tǒng)計其中正數(shù)的個數(shù)存放于M_DATA單元中,負數(shù)的個數(shù)存放于P_DATA單元中。2、在BLOCK開始的內(nèi)存單元中有若干以字節(jié)為單位的奇、偶數(shù),自編程序,試統(tǒng)計其中偶數(shù)的個數(shù)存放于M_DATA單元中,奇數(shù)的個數(shù)存放于P_DATA單元中。部分程序清單BLOCKDB37,—90,—32,60,—7,—120 COUNTEQU$—BLOCK P_DATADBCOUNTDCP(0) M_DATADBCOUNTDCP(0) ……………LEASI,BLOOKLEADI,P_DATALEABX,M_DATAMOVCX,COUNT RETRY:MOV AL,[SI]CMP AL,0JGE PPMOV [BX],ALINC BXJMP LOOP1 PP:MOV[DI],ALINC DI LOOP1:INC SI LOOPRETRY……………要求: 1.分析問題,畫出算法框圖。寫實驗預(yù)習(xí)報告。 2.用匯編語言格式編寫程序。 3.在DOS下編輯、匯編、連接程序。 4.用Debug調(diào)試程序。 5.在DOS下運行并分析結(jié)果。6.寫實驗報告,畫出算法框圖實驗六子程序結(jié)構(gòu)一、實驗?zāi)康?、掌握程序設(shè)計方法,合理劃分層次。2、掌握子程序的調(diào)用與返回的方法。3、了解子程序的嵌套與遞歸。二.實驗內(nèi)容與要求1、將主程序中BX寄存器內(nèi)的二進制數(shù)用十六進制數(shù)的形式在屏幕上顯示出來。實驗參考程序:code segmentmain procfar assumecs:codestart: pushds xorax,ax pushax movbx,1234hcallsub1 retmain endpsub1 procnear movch,4rotate: movcl,4 rolbx,cl moval,bl andal,0fh addal,30h cmpal,3ah jlprintit addal,7hprintit:movdl,al movah,2 int21h decch jnzrotate retsub1 endpcodeends end要求:分析問題,畫出算法框圖。寫實驗預(yù)習(xí)報告。用匯編語言格式編寫程序。在上題的基礎(chǔ),將MEM中的4個字節(jié)內(nèi)容輸出到屏幕顯示。在DOS下編輯、匯編、連接程序。在DOS下運行并分析結(jié)果。寫實驗報告,畫出算法框圖。2、編制一程序,要求鍵入一個班的學(xué)生成績,并存放于50字的ERADE數(shù)組中,然后根據(jù)ERADE中的成績,把學(xué)生名次填入50字的RANK數(shù)組中,再按學(xué)號順序把名次從終端上顯示出來。提示:程序MAIN功能:根據(jù)輸入的學(xué)生成績,計算并顯示出學(xué)生名次。程序INPUT功能:接收一個班級學(xué)生的成績,各成績之間用空格隔開。程序RANKP功能:計算一個班級學(xué)生的名次。(可參照循環(huán)程序(一)中的程序段)程序OUTPUT功能:輸出(顯示)一個班級的學(xué)生名次程序DECIBIN功能:十進制轉(zhuǎn)換二進制,存入BX程序BINDEC功能:十進制轉(zhuǎn)換二進制,并在屏幕上顯示。程序DEC_DIV功能:BX的內(nèi)容除以CX的內(nèi)容,并在屏幕上顯示一位商。部分程序清單:1)鍵入學(xué)生成績(成績之間用空格間隔,回車結(jié)束輸入) INPUT PROC MOV SI,0 MOV COUNT,0ENTER:CALL DECIBIN INC COUNTCMP DL,‘’JZ STORECMP DL,0DHJZ EXITJMP RET1STORE:MOV GRADE[SI],BX ADD SI,2 JMP ENTEREXIT:MOV GRADE[SI],BXRET1: RETINPUT ENDP2)十進制轉(zhuǎn)換成二進制DECIBIN PROCMOV BX,0NEM: MOV AH,1INT 21HMOVDL,ALCMPAL,30HJL EXIT1CMP AL,39HJG EXITSUB AL,30HCBWXCHGAX,BXMOVCX,10MUL CLXCHGAX,BXADD BX,AXJMP NEWEXIT1:RETDECIBIN ENDP3)二進制轉(zhuǎn)換成十進制BINIDECPROCPUSH BXPUSH CXPUSH SIPUSH DIMOV CX,100CALL DEC_DIVMOV CX,10CALL DEC_DIVMOV CX,1CALL DEC_DIVPOP DI POP SIPOP CXPOP BXRETBINIDEC ENDP4)十進制轉(zhuǎn)換成ASCII碼,并輸出DEC_DIV PROCMOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV DL,ALADD DL,30HMOV AH,02HINT 21HRETDEC_DIV ENDP要求:1)自編程序 主程序MAIN,子程序OUTPUT和子程序RANKP。2)將上述程序與自編程序統(tǒng)調(diào)。3)輸入本班級某門基礎(chǔ)課成績。思考題1)寫出4位BCD碼轉(zhuǎn)二進制數(shù)的算法。2)寫出AX中進二制數(shù)轉(zhuǎn)BCD碼的算法。3)將上述子程序結(jié)構(gòu)改為模塊化程序設(shè)計。實驗七DOS功能調(diào)用一、實驗?zāi)康模?、掌握DOS功能調(diào)用的使用方法。2、進一步熟悉子程序的應(yīng)用。二、實驗內(nèi)容:1、從鍵盤輸入數(shù)據(jù)并顯示1)從鍵盤輸入字符。2)刪除指定的字符。3)將剩余字符在屏幕上顯示。參考程序:datasegmentbufferdb80dup(?)flagdb?dataendscodesegmentmainprocfar assumecs:code,ds:datastart:pushds xorax,ax pushax movax,data movds,ax movbx,offsetbuffer movflag,0next:movah,01h int21h testflag,01h jnzfollow cmpal,20h jnzexit movflag,1 jmpnextfollow:cmpal,20h jzexit mov[bx],al incbx jmpnextexit:mov[bx],al movdi,offsetbuffer moval,'5' calldel movsi,offsetbuffer calldisp retmainendpdelprocnear cldloop1:movah,[di] cmpah,20h jzexit0 cmpal,[di] jzloop2 incdi jmploop1loop2:moval,[di+1] mov[di],al cmpal,20h jzexit0 incdi jmploop2exit0:retdelendpdispprocneardisp0:movdl,[si] movah,02h int21h incsi moval,[si] cmpal,20h jnzdisp0 retdispendpcodeendsendstart2、輸入以空格開始以空格結(jié)束的一串字符,并在另一行顯示。參考程序:datasegmentbufferdb80dup(?)flagdb?dataendscodesegmentmainprocfarassumecs:code,ds:datastart:pushdsxorax,axpushaxmovax,datamovds,axmovbx,offsetbuffermovflag,0next:movah,01hint21htestflag,01hjnzfollowcmpal,20hjnzexitmovflag,1jmpnextfollow:cmpal,20hjzexitmov[bx],alincbxjmpnextexit:retmainendpcodeendsendstart3、主程序調(diào)用三個子程序,子程序分別實現(xiàn)輸入一串字符,刪除特定字符,并顯示剩余字符。參考程序:datasegmentbufferdb80dup(?)flagdb?dataendscodesegmentmainprocfarassumecs:code,ds:datastart:pushdsxorax,axpushaxmovax,datamovds,axmovbx,offsetbuffermovflag,0next:movah,01hint21htestflag,01hjnzfollowcmpal,20hjnzexitmovflag,1jmpnextfollow:cmpal,20hjzexitmov[bx],alincbxjmpnextexit:mov[bx],almovdi,offsetbuffermoval,'5'calldelmovsi,offsetbuffercalldispretmainendpdelprocnearcldloop1:movah,[di]cmpah,20hjzexit0cmpal,[di]jzloop2incdijmploop1loop2:moval,[di+1]mov[di],alcmpal,20hjzexit0incdijmploop2exit0:retdelendpdispprocneardisp0:movdl,[si]movah,02hint21hincsimoval,[si]cmpal,20hjnzdisp0retdispendpcodeendsendstart三、實驗步驟和要求:1、分析問題,畫出算法框圖。2、在DOS下編輯、匯編、連接程序。3、用Debug調(diào)試程序。4、在DOS下運行并分析結(jié)果。實驗八分支程序設(shè)計一、實驗?zāi)康?1、熟練掌握邏輯運算和轉(zhuǎn)移指令 1)

邏輯運算指令 2)

標(biāo)號和無條件轉(zhuǎn)移指令 3)

比較指令和條件轉(zhuǎn)移指令 2、掌握分支程序設(shè)計的原理和方法,重點掌握各種分支程序中形成和判斷條件而產(chǎn)生的程序段的設(shè)計方法和技巧.二、實驗內(nèi)容1、練習(xí)邏輯運算指令、比較指令和條件轉(zhuǎn)移指令的功能、用法以及與標(biāo)志位的關(guān)系和可用的尋址方式2、用地址表法,完成下面要求的多分支程序的設(shè)計。根據(jù)MODE單元中的模式字(0-7)分別轉(zhuǎn)向L0-L7標(biāo)號處執(zhí)行。L0-L7處分別完成顯示‘0’-‘7’字符。 當(dāng)MODE=0時,轉(zhuǎn)L0標(biāo)號,完成顯示‘0’ 當(dāng)MODE=1時,轉(zhuǎn)L1標(biāo)號,完成顯示‘1’ 當(dāng)MODE=2時,轉(zhuǎn)L2標(biāo)號,完成顯示‘2’ 當(dāng)MODE=3時,轉(zhuǎn)L3標(biāo)號,完成顯示‘3’ 當(dāng)MODE=4時,轉(zhuǎn)L4標(biāo)號,完成顯示‘4’ 當(dāng)MODE=5時,轉(zhuǎn)L5標(biāo)號,完成顯示‘5’ 當(dāng)MODE=6時,轉(zhuǎn)L6標(biāo)號,完成顯示‘6’ 當(dāng)MODE=7時,轉(zhuǎn)L7標(biāo)號,完成顯示‘7’3、編制程序?qū)崿F(xiàn)如下操作:設(shè)有10個學(xué)生成績,分別統(tǒng)計低于60分、60~69分、70~79分、80~89分、90~99分及100分的人數(shù),并存放于S5、S6、S7、S8、S9、S10單元中。程序清單: ; 統(tǒng)計學(xué)生成績 DATA SEGMENT GRADEDW95H,60H,75H,92H,71H,86H,54H,89H,83H,76H NEQU($—GRADE)/2 ORG30H S5 DW0 S6 DW0 S7 DW0 S8 DW0 S9 DW0 S10 DW0 DATA ENDS ; STACK SEGMENTSTACK STA DB20DUP(0)TOPEQU$—STA STACKENDS ; CODE SEGMENT MAIN PROCFAR ASSUMECS:CODE,DS:DATA,SS:STACK START:PUSHDS SUBAX,AXPUSHAX MOVAX,DATA MOVDS,AX MOVCX,N LEABX,GRADE;成績表首地址 COMPARE: MOVAX,[BX] CMPAX,60H;<60? JLFIVE CMPAX,70H ;<70? JLSIX CMPAX,80H ;<80? JLSEVEN CMPAX,90H ;<90? JLEIGHT CMPAX,100H ;=100 JNENINE INCS10 JMPCHA NINE:INCS9 JMPCHA EIGHT:INCS8 JMPCHA SEVEN: INCS7 JMPCHA SIX: INCS6 JMPCHA FIVE: INCS5 JMPCHA CHA:ADDBX,2 ;循環(huán)學(xué)生人數(shù) LOOPCOMPARE RET MAINENDP CODEENDS ENDSTART 執(zhí)行程序后,將結(jié)果分別填入下列表中N(總?cè)藬?shù))S5S6S7S8S9S10三、實驗要求:1、在BLOCK開始的內(nèi)存單元中有若干以字節(jié)為單位的正、負數(shù),自編程序,試統(tǒng)計其中正數(shù)的個數(shù)存放于M_DATA單元中,負數(shù)的個數(shù)存放于P_DATA單元中。2、在BLOCK開始的內(nèi)存單元中有若干以字節(jié)為單位的奇、偶數(shù),自編程序,試統(tǒng)計其中偶數(shù)的個數(shù)存放于M_DATA單元中,奇數(shù)的個數(shù)存放于P_DATA單元中。部分程序清單BLOCKDB37,—90,—32,60,—7,—120 COUNTEQU$—BLOCK P_DATADBCOUNTDCP(0) M_DATADBCOUNTDCP(0) ……………LEASI,BLOOKLEADI,P_DATALEABX,M_DATAMOVCX,COUNT RETRY:MOV AL,[SI]CMP AL,0JGE PPMOV [BX],ALINC BXJMP LOOP1 PP:MOV[DI],ALINC DI LOOP1:INC SI LOOPRETRY……………要求: 1.分析問題,畫出算法框圖。寫實驗預(yù)習(xí)報告。 2.用匯編語言格式編寫程序。 3.在DOS下編輯、匯編、連接程序。 4.用Debug調(diào)試程序。 5.在DOS下運行并分析結(jié)果。 6.寫實驗報告,畫出算法框圖。附錄1ASCII碼表編碼字符編碼字符編碼字符編碼字符00NUL20SPACE40@60`01SOH21!41A61a02STX22“42B62b03ETX23#43C63c04EOT24$44D64d05ENQ25%45E65e06ACK26&46F66f07BEL27‘47G67g08BS28(48H68h09HT29)49I69i0ALF2A*4AJ6Aj0BVT2B+4BK6Bk0CFF2C,4CL6Cl0DCR2D-4DM6Dm0ESO2E.4EN6En0FSI2F/4FO6Fo10DEL30050P70p11DC131151Q71q12DC232252R72r13DC333353S73s14DC434454T74t15NAK35555U75u16SYN36656V76v17ETB37757W77w18CAN38858X78x19EM39959Y79y1ASUB3A:5AZ7Az1BESC3B;5B[7B{1CFS3C<5C\7C|1DGS3D=5D]7D}1ERS3E>5E^7E~1FUS3F?5F_7FDEL

附錄2匯編語言常用出錯信息匯編程序在對源程序的匯編過程中,若檢查出某語句有語法錯誤,隨時在屏幕上給出出錯信息。如操作人員指定的列表文件名(即.LST),匯編程序亦將在列表文件中出錯的下面給出出錯信息,以便操作人員即時查找錯誤,給予更正。MASM5.0出錯信息格式如下:源程序文件行:WARNING/ERROR錯誤信息碼:錯誤描述信息其中,錯誤描述信息碼由五個字符組成。第一個是字母A,表示匯編語言程序出錯;接著有一個數(shù)字指明出錯類別:‘2’為嚴(yán)重錯誤,‘4’為嚴(yán)肅警告,‘5’為建議性警告,最后三位為錯誤編號。錯誤編號錯誤描述0Blocknestingerror嵌套出錯。嵌套的過程、段、結(jié)構(gòu)、宏指令或重復(fù)塊等非正常結(jié)束。例如在嵌套語句中有外層的結(jié)束語句,而無內(nèi)層的結(jié)束語局1Extracharactersonline一語句行有多余字符,可能是語句中給出的參數(shù)太多2Internalerror-Registeralreadydefined這是一個內(nèi)部錯誤。如出現(xiàn)該錯誤,請記下發(fā)生錯誤的條件,并使用ProductAssistanceRequest表與Microsoft公司聯(lián)系3Unkowntypespecifer未知的類型說明符。例如類型字符拼錯,把BYTE寫成BIT,NEAR寫成NAER等4Redefinitionofsymbol符號重定義。同一標(biāo)識符在兩個位置上定義。在匯編第一遍掃描時,在這個標(biāo)識符的第二個定義位置上給出這個錯誤5Symbolismultidefined符號多重定義。同一標(biāo)識符在兩個位置上定義。在匯編第二遍掃描時,每當(dāng)遇到這個標(biāo)識符都給出這個錯誤6Phaseerrorbetweenpasses兩次掃描間的遍錯。一個標(biāo)號在二次掃描時得到不同的地址值,就會給出這種錯誤。若在啟動MASM時使用/D任選項,產(chǎn)生第一遍掃描的列表文件,它可幫助你查找這種錯誤7AlreadyhadELSEclause已有ELSE語句。在一個條件塊里使用多于一個的ELSE語句8Mustbeinconditionalblock沒有在條件塊里。通常是有ENDIF或ELSE語句,而無IF語句9Symbolnotdefined符號未定義,在程序中引用了未定義的標(biāo)識符10Syntaxerror語法錯誤。不是匯編程序所能識別的一個語句11Typeillegalincontext指定非法類型。例如對一個過程指定BYTE類型,而不是NEAR或FAR12Groupnamemustbeunique組名應(yīng)是唯一的。作為組名的符號作為其他符號使用13Mustbedeclaredduringpass1必須在第一遍掃描期間定義。在第一遍掃描期間,如一個符號在未定義前就引用,就會出現(xiàn)這種錯誤。14Illegalpublicdeclaration一個標(biāo)識符被非法的指定為PUBLIC類型15Symbolalreadydefferentkind重新定義一個符號為不同種類符號。例如一個段名重新被當(dāng)作變量名定義使用16Reservedwordusedassymbol把匯編語言規(guī)定的保留字作標(biāo)識符使用17Forwardreferenceillegal非法的向前引用。在第一遍掃描期間,引用一個未定義符號。18Operandmustberegister操作數(shù)位置上應(yīng)是寄存器,但出現(xiàn)了標(biāo)識符19Wrongtypeofregister使用寄存器出錯20Operandmustbesegmentorgroup應(yīng)該給出一個段名或組名。例如ASSUME語句中應(yīng)為某段寄存器和指定一個段名或組名,而不應(yīng)是別的標(biāo)號或變量名等21Symbolhasnosegment不知道標(biāo)識符的段屬性22Operandmustbetypespecifier操作數(shù)應(yīng)給出類型說明,如NEAR、FAR、BYTE等23Symbolalreaddefinedlocally以被指定為內(nèi)部的標(biāo)識符,企圖在EXTRN語句中又定義外部標(biāo)識24Segmentparanetersarechanged段參數(shù)被改變。如同一標(biāo)識符定義在不同段內(nèi)25Improperalign/combintype段定義時的定位類型/組合類型使用出錯26Referencetomultidefinedsymbol指令引用了多重定義的標(biāo)識符27Operandexpected需要一個操作數(shù),只有操作符28Operatorexpected需要一個操作符,但只有操作數(shù)29Divdsionby0oroverflow除以0或溢出30Negativeshiftcount\運算符SHL或SHR的移位表達式值為負數(shù)31Operandtypemustmatch操作數(shù)類型不匹配。雙操作數(shù)指令的兩個操作數(shù)長度不一致,一個是字節(jié),一個是字32Illegaluseofexternal外部符號使用出錯33Mustberecordfieldname應(yīng)為記錄字段名。在記錄字段名位置上出現(xiàn)另外的符號34Mustberecordnameorfieldname應(yīng)為記錄名或記錄字段名。在記錄名或記錄字段名位置上出現(xiàn)另外的符號35Operandmustbesize應(yīng)指明操作數(shù)的長度(如BYTE、WORD等)。通常使用PTR運算即可改正36Mustbevariable,label,orconstant應(yīng)該是變量名、標(biāo)號、或常數(shù)的位置上出現(xiàn)了其他信息37Mustbestucturefieldname應(yīng)該為結(jié)構(gòu)字段名。在結(jié)構(gòu)字段名位置上出現(xiàn)了另外的符號38Lefeoperandmustsegment操作數(shù)的左邊應(yīng)該是段的信息。如設(shè)DA1、DA2均是變量名,下列語句就是錯誤的:“MOVAX,DA1:DA2”。DA1位置上應(yīng)使用某段寄存器名39Oneoperandmustconstant操作數(shù)必須是常數(shù)。40Operandmustbeinsamesegmentor

溫馨提示

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

評論

0/150

提交評論