太原理工大學微機原理試驗報告_第1頁
太原理工大學微機原理試驗報告_第2頁
太原理工大學微機原理試驗報告_第3頁
太原理工大學微機原理試驗報告_第4頁
太原理工大學微機原理試驗報告_第5頁
已閱讀5頁,還剩51頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、太原理工大學微機原理實驗報4也笊衣邃TAIYUAN UNIVERSITY Of TECHNOLOGY本科實驗報告課程名稱:微機原理及應用實驗項目:實驗地點:專業班級:機械 XXX班學號:XXXXXXXXXX學生姓名:XX指導教師:實驗一匯編語言程序開發環境與程序調試、實驗要求和目的1 熟悉在微機上編輯、匯編、連接、調試 和運行匯編語言程序的過程,掌握PC環境 下命令行方式的特點。2 熟悉匯編過程中一些常見出錯信息3 熟悉程序調試的方法,DOS命令窗口的 debug的常用命令。、實驗內容1、項目要求:在屏幕上顯示字符串 Hello , world!。2、程序設計思想:運用DOS系統功能調用(IN

2、T 21H )的9號 功能。DOS系統功能調用的9號功能是顯示字 符串,它調用的參數DS:DX=串地址,且字符串 以“ $”結束。程序流程圖如圖1-1:程序J段的初始設置顯示字圖1-1程序流程圖3、程序清單:完整指令代碼如下(簡化段定義格式):.model small ;定義程序的存儲模式.486;說明使用的80x86微處理器指令.stack;定義堆棧段.data;定義數據段Stri ng db Hello, world!,$.code;定義代碼段.startup;程序執行開始Mov ax, seg String;把 String 的段地址送 axMov ds,ax ;ax 送 ds, ds

3、取得 string 的 段地址mov dx,offset String ;String的偏移 地址送 dxmov ah,9;字符串顯示功能int 21h;DOS功能調用mov ax,4c00h;返回DOSint 21h .exit end三、結果與分析 C: TNDOVSsyste32nd. exE:MLtl5指導教師:年 月實驗二內存數據的移動1、實驗要求:編寫程序實現把數據段的字符串數據移動到附加段中2、實驗目的:通過項目學習匯編的數據傳 送指令和串處理類指令,鞏固尋址方式,學 習匯編程序設計。二、實驗內容:1、項目要求:把數據段中以dstring地址標 號為開始地址的hello worl

4、d !字符串移動到附 加段以sstring地址標號為開始地址中去。2、 設計思想:從源串中取一個字符到AL 中,然后把剛取到的字符放到目的串指定位置, 重復這樣的過程,把源串的字符取完為止。程序 流程如圖2-1所示。程斤瀘化初酪僦CX; SI和Dr爪席丸機移動一牛宇苻到肛|死瓦中的字護移制到目趣8!| 傕改計豔善程鬲吉呢圖2-1程序流程圖3、程序設計清單:實現這樣功能的程序方法、實驗要求與目的:很多,下面給出了實現這一功能的完整程序清單 (完整段定義格式)。方案一(無聊版):采用的是loop指令,CX為循環次數,當 CX為0時退出循環。加入了換行指令。用字符串常量改變字符串,提前終止字符 串的

5、輸出。程序如下:DSEG SEGMENTdstring DB HELLO,WORLD!,33,33, $;15 個字節 HELLO,WORLD!dstring_1 db 數據段的字符串:,$; 一定 要加$,表示一個字符串的結束dstring_2 db 附加段的字符串:,$;在屏 幕上顯示的字符串DSEG ENDSESEG SEGMENTsstring DB 15 DUP;附加段預留15個字節空間ESEG ENDSCODE SEGMENTASSUME CS:CODE, DS:DSEG , ES:ESEGMOV DS, AXMOV AX, ESEGMOV ES, AXLEA SI, dstri

6、ngLEA DI, sstri ngMOV CX, 15 次數start: MOV AX, DSEG ;程序開始執行的地方 ;將DSEG的段地址給ds;將SSEG的段地址給es;將dstring的首地址給 si;將sstring的首地址給di;CX存放loop指令的循環S:MOV AL, SIMOV ES:DI, ALINC DIINC SILOOP Smov dX,offset dstri ng_1MOV AH,09hINT 21H;輸出字符串數據段的字符串:MOV DL,0AH;輸出換行MOV AH,02HINT 21Hmov dX,offset dstri ngMOV AH,09hINT

7、 21H; 輸 出 字 符串:HELLO,WORLD!MOV DL,0AHMOV AH,02HINT 21H ;輸出換行mov dX,offset dstri ng_2MOV AH,09hINT 21H;輸出字符串 dstring_2MOV DL,0AHMOV AH,02HINT 21H;輸出換行mov al,$mov es:di-3,al ;將第二個!改成$以終止字符串的繼續輸出MOV AX,ESMOV DS,AX ;將附加段的段地址附給數據段mov dX,offset sstri ngMOV AH,09hINT 21H;顯示字符串 HELLO,WORLD!注意不是!MOV AX, 4C00

8、HINT 21H;返回 DOSCODE ENDS;代碼段結束END start;程序結束方案二:采用字符串操作指令movsb,執行di=si。Si與di自動地址改變方向,由 std,cld控 制。Cx作為計數器,前面應用rep指令重復。程序如下:DSEG SEGMENTdstring DB HELLO,WORLD!,$;13 個字節 HELLO,WORLD!DSEG ENDSESEG SEGMENTsstring DB 13 DUP(?);附加段留13個字節空 間ESEG ENDSCODE SEGMENTASSUME CS:CODE, DS:DSEG , ES:ESEG start: MOV

9、AX, DSEG ;程序開始執行的 地方MOV DS, AX ;將DSEG的段地址給dsMOV AX, ESEGMOV ES, AX ;將SSEG的段地址給es LEA SI, dstring ;將 dstring 的首地址給 si LEA DI, sstring ;將 sstring 的首地址給 diMOV CX, 13 ;CX存放rep指令的重復次 數cld ;將DF位清零,則di與si自增rep movsb ;執行di=siMOV AX,ESMOV DS,AX;將附加段的段地址附給數據段mov dX,offset sstri ngMOV AH,09hINT 21H; 顯 示 字 符 串H

10、ELLO,WORLD!MOV AX, 4C00HINT 21H;返回 DOSCODE ENDS;代碼段結束END start;程序結束方案三:采用是cmp與ja跳轉指令來實現數據 的移動。程序如下:DSEG SEGMENTdstring DB HELLO,WORLD!, $;13 個字節 HELLO,WORLD!DSEG ENDSESEG SEGMENTsstring DB 15 DUP(?);附加段留 13 個字節空間ESEG ENDSCODE SEGMENTASSUME CS:CODE, DS:DSEG , ES:ESEGstart:MOV AX, DSEG行的地方MOV DS, AX址給

11、dsMOV AX, ESEGMOV ES, AXesLEA SI, dstri ng址給siLEA DI, sstri ng址給diMOV CX, 13S:MOV AL, SIMOV ES:DI, ALINC DIINC SIDEC CXCMP CX,0JA SMOV AX,ES;程序開始執;將DSEG的段地;將SSEG的段地址給;將dstring的首地;將sstring的首地;CX存放循環次數;將附加段的段地址附MOV DS,AX給數據段mov dX,offset sstri ngMOV AH,09hINT 21H; 顯 示 字 符 串HELLO,WORLD!MOV AX, 4C00HINT

12、 21HCODE ENDSEND start;返回DOS;代碼段結束;程序結束附簡化段定義格式如下:.model small;定義程序的存儲模式.486;說明使用的80X86微處理指令.data;定義數據段開始dstri ng db hello,world!,$sstri ng db 13 dup(0);使用的同一個數據段.code;定義代碼段.startup;程序開始執行的地方mov ax,seg dstring ;=mov ax,datamov ds,ax;將dstring的段地址附給dsmov es,ax ;為了使用 movsb 指令,由于兩個 字符串都在數據段,所以令es=dslea

13、si,dstri nglea di,sstri ngmov cx,13;循環次數cldrep movsbmov dx,offset sstri ngmov ah,9int 21hmov ax,4c00hint 21h.exitEnd4、調試過程:(在win7x32下調試的方案二) 第 1 步:進入 debug :命令 debug+file.exe。c:HL615debug 02_2.exe第2步:用r命令查看cpu寄存器內容,這 一步基本沒用。看注意點即可C XML615debug 02_2.exeOX-0000 BX-0000 CK-6048 DM-0000 SP-0000 BP-0000

14、SI-0000 DI-0000 DS=0BB6 ES=0BB6 SS=6BC6 CS=OBC8 IP-0000 NV UP El PL NZ NA PO NC 0BC8;0O0O B8C60B MOV AM.0BC6注意:此時并未給 ds, es賦值,在ds, es賦值之前有 ds=es, cs=ds+10h。第3步:用U命令查看匯編指令。直接暴 力輸入g 001a也可,但只適用本程序。0000 B8C60BMOVflX.OBCG0003 8ED8MOVds , m0005 B8C70BMOVAX,0BC70008 8EC0MOVESHX000R 80360000LEASIJ00001000E

15、 8D3E0000LEfiDI,000010012 B90D00MOVex. &m0015 FCCLD0016 F3REPZ0017 A4HOVSB0018 8CC0MOVAX ,ES001A 8ED8MOVDS. HX001C BA0000MOVDX0000001F Bt09MOVAH, 0988888888888888 cccccccccccccc u B B DD B B B B DD B B B B B Bu第四步:用T命令執行一條機器指令。這里 了 執 行 四 次 。Hfi-0BC7BM-0060CX=0040刖四 000SP-0000BP-0000 SI-0006 DI-0000P

16、S-0BC6ES=0BC7SS-0BC6CS-OBCfiIP-0OOA NV JP El PL MZ ND PO NC0EC8!60AA 8n36CAA0 LEA SI J0fifi91D&朋朋-匸5觀此時可以看到ds和es已經賦值了,此時 來查看內存的內容。注意cs沒變。第五步:用d命令查看內存的內容。即查看DS:0 和 ES:0 輸入 d 0bc6:0 和 d 0bc7: 0。00-d 0bc6:B ORCG曲膽 0BC6:e0W OBC6:0020i5 tC iC iP 2C 莊 45 4G 41; 4F 2C BS C6 8E C8 BS57 tr 52 b? tF-52C7 OB 8

17、EiC4CCO448D2121364020UDUBHEHO.WORIDB .HELLO,WORLD!$G.d 0bc7:OC7;O0C0斶45 AC 吒占F 2C 5?4F-U2 W 442124 CO OOnniaqqno nc ne dq nrn qr4仁no nn on003EHELLO,WORLD!I.可以看出已經完成移動了三、結果與分析沒仔細去看為什么0bc6: 0010處也有hello, world。我調試過了發現還有,猜測可能與ss的棧有關。四、拓展用q命令退出debug。用p命令一次執行完循環。用g+偏移地址(ip),可以直接執行到上一條指 令,即此時IP=ip。教師點評:指導

18、教師:實驗三分支程序結構一、實驗要求與目的:1、實驗要求:掌握分支結構程序設計的基 本方法;掌握無條件轉移指令和條件轉移指令的 使用;掌握分支結構程序設計的兩種基本結構的 使用。2、實驗目的:通過分支程序的設計掌握結 構化程序設計方法和常用算法設計。二、實驗內容:1、項目要求:編寫程序實現:在數據段中, 有一個按從小到大順序排列的無符號數組,其首 地址存放在SI寄存器中,數組中的第一個單元 存放著數組長度。在 key單元中有一個無符號 數,要求在數組中查找是否存在key這個數,如 找到,則使CF=O,并在DI中給出該單元在數 組中的偏移地址;如未找到,則使 CF=1。2、設計思想:對于這個表格

19、查找,可以使 用順序查找和折半查找的算法思想。當然順序查 找程序簡單,效率不高。而折半查找程序復雜, 效率高,但對查找數據要求有序。本項目采用折半查找方式。在一個長度為N的有序數組r中,查找元素k 的折半查找算法可描述如下: 初始化被查找數組的尾下標,low 1,high n。 若lowhigh,則查找失敗,CF=1,退出 程序;否則,計算中點 mid (low+high ) /2。 k與中點元素rmid比較。若k= rmid, 則查找成功,結束程序;若 k rmid,則轉步驟。 低半部分查找(lower), high mid-1, 返回步驟(2),繼續執行。 高半部分查找(higher),

20、lowmid+1, 返回步驟 (2 ),繼續執行3、程序清單(簡化段定義格式):.model small.486.stack.data;定義數據段開始arraydb13,45,49,54,66,78,83,85,89,94,99,123,233,245key db 40cg1 db fin d,$error1 db failed,$sstring db 12 dup .code .startupstart:mov ax,data ;力口載數據mov ds,axmov al,key;查找關鍵詞送 ALlea si,array;把數組的首地址送SImov bl,array;把數組元素個數送 BLm

21、ov bh,0 ;把數組元素個數送BXinc simai n: cmp bx,0jl error;轉到查找失敗程序段shr bx,1;bx 除以 2cmp al,bx+si ;mid=bx+sija higher ;若大于,則轉到高半部分 jb lower;若小于,則轉到低半部分jmp eg;轉到查找成功,無條件轉移指令higher: add si,bx ;高半部分ine sijmp mai nlower:add si,0 ;低半部分dee bxjmp mai nerror:lea dx,error1 ;查找失敗,lea取有效地址mov ah,09h;字符串顯示int 21hjmp s;直接退

22、出eg:lea dx,cg1 ;查找成功mov ah,09h ;字符串顯示 int 21h ste ;cf 置 0 mov di,bx+si ;di 保存s:.exitEnd附完整段定義DSEG SEGMENTARRAYDB13,45,49,54,66,78,83,85,89,94,99,123,233,245 KEY DB45CG1 DBfin d,$ERROR1 DB failed,$DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGSTART: MOVAX,DSEGMOVDS,AXMOVAL,KE YLEAMOVMOVINCSI,ARRAY BL,AR

23、RAY BH,0 SIMAIN:CMPBX,0JLERRORSHRBX,1CMPAL,BX+SIJAHIGHERJBLOWERJMPCGHIGHER:ADDSI,BXINCSIJMPMAINLOWER:ADDSI,0DECBXJMPMAINERROR:LEADX,ERROR1MOVAH,09HINT21HCLCJMPEXITCG: LEADX,CG1MOVAH,09HINT21HSTCMOVDI,BX+SIJMPEXITEXIT:MOVAX,4C00HINT21HCSEG ENDSENDSTART4、調試過程:此程序在計算中值(mid J (low+high ) 12)采用了一些技巧。在程序思

24、想 的描述上,應該計算出高端地址(high)和低端 地址(low),再計算中間地址(mid )。實際上我 們需要的是中間地址(mid),沒有必要一定要計 算出高端地址和低端地址。bx+si表示的是中值 地址,cmp al,bx+si 這指令表示ax與中值 進行比較。本程序稍作修改,就可實現更廣應用。令key=45,輸出結果如下:完整段代碼輸出b:XMLG15B3 卩indLMLG15c:M1L61503_1V ind c:XttLtl5_指導教師:年 月 日實驗四循環程序結構一、實驗要求與目的1、實驗要求:掌握循環結構程序設計的基 本方法;了解循環控制的方法(計數、條件 和混合)。2、實驗目的

25、:通過循環程序的設計掌握結 構化程序設計方法和循環控制方法的設計。二、實驗內容1、項目要求:編寫程序實現1100的累加和 求算,結果送到SUM單元中。2、設計思想:如果循環次數是已知的,則采 用計數控制方法。這里計數法可以是正計數即從 1計數到n(圖4-1(a)所示);也可以是倒計數法即 從n計數到0(圖4-1(b)所示)。050/100二商 0 余數 50(a)(b)圖4-1累加和流程圖方案一:自減法,用的是LOOP循環中CX的自減 程序如下:.model small;注意點與m之間不能有空格.486.data ;定義數據段開始sum dw ?.code.startupmov ax,data

26、mov ds,ax ;初始化數據段mov ax,0 ;(ax) J 0mov cx,100 ;循環次數S:add ax,cx;求累加和LOOP Smov sum,ax;最終結果送到SUMmov ah,4chint 21h;返回 DOS.exitEnd方案二(直觀作死板)將結果顯示在屏幕上原理如下:50/10=商5余數00/仁商0余數0商加上30h即可得到相應數字的ASCII碼,然后在調用DOS 命令輸出字符即可,匯編所有的字符輸出都是ASCII碼。4,程序如下:DATA SEGMENTSTRING DB 1+2+3+4+5+99+100=$;輸 出字符串,$為結束符DATA ENDSSTACK

27、 SEGMENTDB 16 DUPSTACK ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATASTART:MOV AX,DATAMOV DS,AXmov dx,offset STRINGmov ah,9int 21h ;輸出字符串mov ax,0mov bx,0mov cx,100 ;循環次數S:inc bxADD ax,bxLOOP S ;實現從1加到100MOV DX,0 ;除數1000要用16位寄存器存儲 但5050用AX就可存儲MOV BX,1000;除 1000DIV BXPUSH DX;余數在DX中,所以要將DX入棧ADD

28、 AL,30H;商值加48轉換成ASCII碼MOV DL,AL;DOS系統功能調用,顯示mov ah,02HINT 21HPOP DX;要將余數DX賦值給AX,以作下次除法mov AX,DX ;除 100mov BL,100div BLPUSH AX;余數在AX中,所以要將AX入棧ADD AL,30H;求 ASCII 值mov dl,al;DOS系統功能調用,顯示mov ah,2int 21HPOP AXmov aL,AH ;除 10MOV AH,0 ;由于余數只存在AL寄存器中所 以要將AH寄存器清0mov bL,10div bLPUSH AX;求ASCII值;DOS系統功能調用,顯示add

29、 al,30Hmov dl,almov ah,2int 21HPOP AXmov aL,AH ;除 1MOV AH,0 ;要將AH寄存器清0mov bL,1div bLadd al,30H;求 ASCII 值mov dl,al;DOS系統功能調用,顯示mov ah,2int 21HMOV AX,4C00Hint 21hcode endsend start三、結果和分析方案二輸出結果:C:L61SB4212+3+4*5 + +99+109=5059 C;HL615fc方案二只適用于0-9999范圍內,即最高加到140,如果要實現更高位位的話 可以修改。指導教師:年 月 日實驗五子程序結構一、實驗

30、要求與目的1、實驗要求:掌握子程序指令,了解子程 序結構和子程序設計的基本方法。2、實驗目的:學習匯編的子程序結構和模 塊0。化程序設計方法。二、實驗內容1、項目要求:編寫程序實現對一個無序排列 的無符號數組排序。數組的首地址存放在 SI寄 存器中,數組中的第一個單元存排序前后都存放 著數組長度。2、設計思想:對于這個排序問題,我們可以 采用基本排序算法(如冒泡排序,簡單選擇排序, 插入排序等),也可以采用高級排序算法(如堆 排序,歸并排序,快速排序等)。為了使程序簡 單,本項目采用基本排序的冒泡排序。簡單選擇排序的基本思想:對文件進行n-1趟排序,第i趟(i=1,2,n-1)是在從i到n的n

31、-i+1 個記錄中選擇關鍵字最小(最大)的記錄,并將 它與第i個記錄進行交換。這里采用子程序結構,整個程序包括一個主程 序和兩個子程序,程序流程圖如圖 5-1示。子程序開始(a) 主程序子程序纟吉束寄存器入棧(保護現場)子程序初始化mov si,dx mov di,simov al,bx+si si+mov al,bx+si mov di,siinc simov si,dx xchg bx+si,alxchg bx+di,al inc dxdxvcx ?J N寄存器出棧(恢復現場)(c) DISPLAY子程序這三個子程序是:子程序結束(b) XZPX子程序XZPX :功能是對數組元素進行降序排

32、序。入口參數:米用寄存器SI傳遞參數。用了寄存器:AX,BX,CX,DX出口參數:無。DISPLAY :功能是將數組元素輸出在屏幕上顯 示。入口參數:米用寄存器SI傳遞參數。出口參數:無。DIGITAL_DISPLAY:將數組元素中的數字顯示 在屏幕上。你也可以定義顯示字符串然后調用 DOS命令,顯示字符。入口參數:米用寄存器SI傳遞參數。調用的寄存器:AX,BX,DX出口參數:無DATA SEGMENTARRAY DB13,65,12,97,68,69,70,71,72,73,98,75,76,77DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTAR

33、T:MOV AX, DATAMOV DS, AXLEA SI,ARRAYCALL DISPLAY;顯示原數字串CALL XZPX ;大小排序 CALL DISPLAY ;顯示排 序后的數字串JMP EXIT ;退出程序XZPX PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSHFMOV CL,SI;數組元素個數讀入CL中MOV CH,0 ;CX保存數組元素個數DEC CXMOV BX,SI ;BX指向數組的第一個元素,即數組的個數字節INCBX ;BX指向數組的第一個數字MOV DX,0 ;DX用于循環計數LOP1:MOVSI,DX ;DX 送SI,用于定位,SI是用來循環比較的MOVDI,DX ;用于交換MOVAL,BX+SI ;AL 用于存放最大數INCSI;用于SI的循環LOP2:CMPAL,BX+SI;比較JAEGO ;AL大于等于MOV AL,BX+SI;否跳轉至GO 則,bx+si送ALMOV DI,SI ;DI 記下大元素在數組中的位置GO: INC SI;繼續增加SI作比較CMP SI,CXJBLOP2;直到一位比較完MOVSI,DX;SI重新定位,回初位置XCHGBX+SI,ALXCHGBX+D

溫馨提示

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

評論

0/150

提交評論