第一篇:電子科大計算機學院 語言程序設計 實驗報告 99分精品版
電子科技大學 計算機科學與工程
學院
標 準 實 驗 報 告
(實驗)課程名稱
匯編語言與微機接口技術綜合實驗
電子科技大學教務處制表
電 子 科 技 大 學
實
驗
報
告
(一)學生姓名:郫縣英格拉姆
學 號:2014123456789
指導教師:皮皮怪
實驗地點:主樓A2_412
實驗時間:2017年4月25日星期二
一、實驗室名稱:
主樓A2_412機房
二、實驗項目名稱:匯編語言編程訓練
三、實驗學時:3學時
四、實驗原理:(包括知識點,電路圖,流程圖)
知識點
(一)課后自學——使用DOSBox在win7 x64位下搭建匯編環境 1.軟件安裝
a.安裝3DOSBox b.準備debug.exe,masm.exe,link.exe,edit.exe文件。2.使用
a.DOSBox安裝完成后,打開,可發下它的提示符是:“Z:>”,這是DOSBox里的虛擬盤。我們需要更改到我們自己的盤符,如果直接更改的話,會提示你錯誤。首先需要mount到自己的目錄。
b.比如我們準備將D:DEBUG作為我們自己的匯編測試目錄,則執行“mount C D:DEBUG”命令,這樣C盤符也就虛擬成了自己本地電腦的D:DEBUG目錄。我們在DOSBox中切換到C盤符時,也就實際上切換到了D:DEBUG目錄。c.將debug.exe,masm.exe,link.exe,edit.com放置于D:DEBUG目錄下,我們就能在DOSBox下直接使用它們了。3.配置
上面我們為使用DOSBox,要mount到我們本地目錄,但是我們每一次打開DOSBox都要進行這兩步,有點麻煩,可以通過下面的操作來保存配置。a.開始->所有程序->DOSBox-0.74->Options->DOSBox 0.74 Options,在文本的最后位置找到“[autoexec]”:
[autoexec] # Lines in this section will be run at startup.# You can put your MOUNT lines here.b.然后將下面的2條命令寫在此處:第一條命令的作用是mount目錄,第二條命令的作用是mount之后切換到D盤符:
mount C D:DEBUG C: 知識點
(二)課堂講述——相關知識介紹
1.生成可執行程序的過程
·建立匯編源程序(*.asm)
·匯編源程序文件,生成目標文件(*.obj)、·連接目標文件,生成可執行文件(*.exe)·運行調試程序 2.匯編
假設masm.exe在D盤根目錄下,編輯了一個名為demo.asm的源文件,則通過命令
D:>masm demo.asm;擴展名可以忽略,默認為asm類型 得到匯編結果,如下圖所示:
·擴展名為*.lst的文件稱為列表文件,該文件對于后續的調試十分有用。
關于列表文件(*.lst)
列表文件同時列出源程序和機器語言程序清單,并給出段表、段的大小及屬性,以及用戶定義的符號表、符號類型及屬性,對于調試程序十分有用。3.連接
在生成了目標文件demo.obj以后,通過輸入命令 D:>link demo.obj;LINK.EXE是連接程序,同樣的,擴展名可以忽略,默認為obj類型
得到連接結果,如下圖所示:
4.調試
a.關于DEBUG.EXE b.DEBUG.EXE的用法
在DOS的提示符下,如下鍵入:c.DEBUG.EXE的注意事項 d.本實驗課需要的DEBUG指令
運行命令G、追蹤命令T、繼續命令P、顯示內存單元內容命令D、退出命令Q
修改內存單元內容命令E、檢查和修改寄存器內容的命令R
流程圖
五、實驗電路(本次實驗無電路圖)
六、實驗內容:(介紹自己所選的實驗內容)
實驗內容一:
學習“第4章 順序、分支、循環程序例子.ppt”,按照要求完成下列題目并給出實驗結果(至少選擇兩個):我選擇1、2
1、利用學號查學生的數學成績表
在數據段中建立一個成績表TABLE,表中的成績按照學生學號從小到大的順序存放。要查的學號存放在變量NUM中,查表的結果放在變量MATH中。(用XLAT指令進行查表)
2、無符號數排序
數據段的ARY數組中存放有10個無符號數,試找出其中最大者送入MAX單元。(用LOOP指令做循環)
實驗內容二:
學習“第4 子程序設計例子(1).ppt”,用“堆棧傳遞參數”的方式編程并運行給出結果.將兩個給定的二進制數(8位和16位)轉換為ASCII碼字符串。用堆棧傳遞參數,要求:分步驟給出堆棧狀態和運行結果。
七、實驗步驟:(編輯調試的過程)實驗一:
題目1.利用學號查學生的數學成績表
1、根據題目要求,建立匯編源程序,用Windows系統自帶的記事本進行編輯,另存為projec1.asm,并保存至masm.exe所在目錄中。
2、匯編源程序文件,生成目標文件project1.obj;
3、通過link命令連接目標文件,生成可執行文件project1.exe;
4、運行調試程序,鍵入debug project1.asm,參考LST文件,通過G命令、D命令進行調試,分析結果。(分析過程見報告第九部分)。題目2.無符號數排序
1、根據題目要求,建立匯編源程序,用Windows系統自帶的記事本進行編輯,另存為projec2.asm,并保存至masm.exe所在目錄中。
2、匯編源程序文件,生成目標文件project2.obj
3、通過link命令連接目標文件,生成可執行文件project2.exe
4、運行調試程序,參考LST文件,通過G命令、D命令進行調試,分析結果,(分析過程見報告第九部分)。
實驗二:
題目:用“堆棧傳遞參數” 的方式編程,將兩個給定的二進制數(8位和16位)轉換為ASCII碼字符串。
1.根據題目要求,建立匯編源程序,用Windows系統自帶的記事本進行編輯,另存為projec4.asm,并保存至masm.exe所在目錄中。
2.匯編源程序文件,生成目標文件project4.obj 3.通過link命令連接目標文件,生成可執行文件project4.exe 4.運行調試程序,通過G命令、D命令進行調試,分析結果(分析過程見報告第九部分)。
八、實驗結果:(源程序代碼,必要的中文注釋,以及運行結果,包括截圖或者拍照)實驗一 第一題
源代碼及其注釋如下:
TITLE TABLE LOOKUP DATA SEGMENT;數據段
TABLE DB 01, 02, 03, 04, 05, 06, 07, 82, 09, 10
DB 11, 12, 13, 14, 15, 16, 17, 18, 19, 20;為了便于調試,把82之外的數據進行特殊處理,使其數值等于所在的位置 NUM DB 8;學號為8 MATH DB ? DATA ENDS STACK1 SEGMENT PARA STACK;堆棧段
DW 20H DUP(0)STACK1 ENDS
COSEG SEGMENT
ASSUME CS:COSEG,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX;裝入DS
MOV BX,OFFSET TABLE;BX指向表首地質
XOR AH,AH;AH清零
MOV AL,NUM;NUM值賦給AL
DEC AL;因為實際學號從1開始 XLAT;查表
MOV MATH,AL;存結果
MOV AH,4CH
INT 21H COSEG ENDS
END START
運行結果介紹及截圖、分析:
運行調試程序,通過G命令、D命令進行調試,分析結果。
查看PROJECT1.LST文件,可以分析出調試的方法,分析過程見圖標記:
根據上述分析輸入指令g 0013、d0015 l1進行調試,結果見下圖:
結果分析:MATH中成績為52h,對應十進制82,而在程序源代碼中對成績的定義情況如下,其中的學號為8對應的成績確實為82:
符合要求,實驗成功。
實驗一:第二題
源代碼及其注釋如下:
DATA SEGMENT
ARY DB 01,16,02,03,04,05,06,07,08,09 MAX DB ? DATA ENDS
STACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1 BEGIN:
MOV AX,DATA MOV DS,AX;裝入DS
MOV SI,OFFSET ARY;SI指向ARY第一個元素
MOV CX,9;CX做計數器
MOV AL,[SI];取第一個元素到AL LOP: INC SI;SI指向后一個元素
CMP AL,[SI];比較兩個數
JAE BIGER;前元素>=后元素,則跳到BIGER進行處理
MOV AL,[SI];取較大數到AL BIGER: LOOP LOP;循環執行LOOP
MOV MAX, AL;存最大數
MOV AH,4CH
INT 21H CODE ENDS END BEGIN
運行結果介紹及截圖、分析:
運行調試程序,通過G命令、D命令進行調試,分析結果。
查看PROJECT2.LST文件,可以分析出調試的方法,分析過程見圖標記:
根據上述分析輸入指令g 0019、d000a l1進行調試,結果見下圖:
MATH中成績為10h,對應十進制數16,確實是我編寫的十個數中的最大數:
符合要求,實驗成功。
實驗二:堆棧傳遞參數,轉化ASCII碼
代碼及注釋如下:
DATA SEGMENT BIN1 DB 35H BIN2 DW 0AB48H ASCBUF DB 20H DUP(?)DATA ENDS
STACK1 SEGMENT PARA STACK DW 20H DUP(65535);對應OFFFFH 便于查看內存單元時確定堆棧位置 STACK1 ENDS
COSEG SEGMENT
ASSUME CS:COSEG,DS:DATA,SS:STACK1
BEGIN: MOV AX,DATA MOV DS,AX
XOR AX,AX;清零AX
MOV AH,BIN1;第一個數據送AH
PUSH AX;待轉換數據壓棧
MOV AX,8
PUSH AX;待轉換位數壓棧
LEA DI,ASCBUF PUSH DI;存放ASCII碼首址壓棧
CALL BINASC;調用轉換子程序
MOV AX,BIN2;第二個數據送AX
PUSH AX;待轉換數據壓棧
MOV AX,10H
PUSH AX;待轉換位數壓棧
ADD DI,8
PUSH DI;DI+8壓棧
CALL BINASC;調用轉換子程序
MOV AH,4CH INT 21H BINASC PROC
PUSH AX
PUSH CX
PUSH DX
PUSH DI
MOV BP,SP
MOV DI,[BP+10];從堆棧取入口參數
MOV CX,[BP+12]
MOV DX,[BP+14]
LOP: ROL DX,1;LOP為將所給轉化為ASCII的算法
MOV AL,DL
AND AL,1ADD AL,30H MOV [DI],AL
INC DI
LOOP LOP POP DI
POP DX
POP CX
POP AX
RET 6;返回并從堆棧中彈出6個字節 BINASC ENDP COSEG ENDS END BEGIN
分析:
首先單步運行幾條指令,通過d 00 查看內存單元狀態,檢測堆棧段等的設置是否成功:
空間看起來有問題:上面顯示00的部分是設置的ASCBUF應該有用32個字節,截圖顯示是45個;下面的STACK1應該有64個字節,截圖顯示是54個,但后面全部執行完畢后結果是正確的。在網絡上查詢過后得知應該是軟件的原因。
繼續執行至將第一個待轉換數據0035H壓棧,查看內存單元,截圖如下:
同樣的,執行至待轉換位數、存放ASCII碼首址成功入棧,與上圖相似,省去截圖,直至調用轉化子程序,執行完一系列入棧操作和取入口參數、數據位數、待轉換數據操作:
進入標號為LOP的程序段,循環執行求ASCII碼的算法,將數據一位一位地轉化為ASCII碼,循環過程中可以看到CX依次減1,減小至0時不再執行LOP循環:
繼續執行至第一個數據轉化結束,查看內存單元情況,與預期結果進行比較,第一個待轉換數據35H=0011 0101B,其對應ASCII碼確實與內存單元中顯示相同,詳見圖片:
第二個待轉換數據分析過程與第一個數據相同,轉化結束后同樣與預期結果進行比較:
第二個待轉換數據AB48H=1010 1011 0100 1000B, 其對應ASCII碼確實與內存單元中顯示相同,詳見圖片:
九、結果分析和改進意見(完成每次留的問答題,以及實驗過程中遇到的問題)
匯編語言編程作為低級語言,與高級語言相比,可讀性不如高級語言,更易出錯,調試更麻煩,但是邏輯性很強,更接近機器,分析起來很有意思,每一步都是很小的操作,最后能達到目的。
在堆棧傳遞參數的實驗中,內存中顯示00的部分是設置的ASCBUF,應該有用32個字節,截圖顯示是45個;下面的STACK1應該有64個字節,截圖顯示是54個,但后面全部執行完畢后結果是正確的。在網絡上查詢過后發現有很多相似的情況,應該是軟件的原因。后期可以研究一下產生這種現象的具體原因和解決方案。
十、心得體會:
做實驗很有趣,寫報告很煩。在大三下學期,保研考研找實習最忙的時候,要寫這么多報告,很難受。但是萬幸王老師很漂亮,講話又好聽,我超喜歡她的。如果她直接教匯編理論課我一定好好聽~~~
報告評分:
指導教師簽字:
電 子 科 技 大 學
實
驗
報
告
(二)學生姓名:郫縣英格拉姆
學 號:2014123456789
指導教師:皮皮怪
實驗地點:主樓A2_412
實驗時間:2017年5月9日星期二
一、實驗室名稱:
主樓A2_411機房
二、實驗項目名稱:8259A中斷控制器實驗
三、實驗學時:3學時
四、實驗原理:(包括知識點,流程圖)
(一)知識點:
(老師上課提的問題寫在報告第九部分)
1.8259A的工作過程
(1)中斷源在中斷請求輸入端IR0-IR7上產生中斷請求 涉及問題:中斷請求的觸發方式有哪些?
·電平觸發方式:用IR引腳上的有效高電平信號觸發中斷。常被用于需要重復執行當前中斷服務程序的情況,直到IR信號變為無效。
·邊沿觸發方式:采用IR輸入信號的上升沿觸發中斷,常被用于不希望產生重復響應及中斷請求信號是一個短暫脈沖的情況。
(2)中斷請求被鎖存在IRR中,并經IMR屏蔽,結果送優先權電路判優 涉及問題:IRR/IMR的數據是自動寫入還是通過軟件編程設定?
·IRR的數據是根據中斷請求信號自動寫入的(有中斷請求的對應位為1,允許多個位為1,如果被響應對應位清零);
·IMR的數據是通過軟件編程設定的(通過對某位或某幾位置1屏蔽該位,使其不能進入優先級判別器)
(3)優先權電路檢出優先權最高的中斷請求位,設置ISR的對應位(置1)涉及問題:中斷判優的依據是什么?ISR是自動寫入還是通過軟件編程設定?
·IRR的數據是根據中斷請求信號自動寫入的(有中斷請求的對應位為1,允許多個位為1,如果被響應對應位清零);
·IMR的數據是通過軟件編程設定的(通過對某位或某幾位置1屏蔽該位,使其不能進入優先級判別器)
(4)8259A控制邏輯接受中斷請求,向CPU輸出INT信號
(5)CPU接受INT信號,進入兩個INTA中斷響應周期,第一個周期通知8259A做好響應準備,第二個周期8259A將響應的中斷類型號輸出到DB上 涉及問題:CPU中斷響應過程中的“配套操作”有哪些?
·8259A接到來自CPU的第一個脈沖時,設置ISR并把IRR中的相應位復位。同時,8259A準備向數據總線發送中斷向量。
·在8259A發送中斷向量的最后一個脈沖期間,如果是在自動結束中斷方式下,在這個脈沖結束時復位ISR的相應位。在其他方式下,ISR相應位要由中斷服務程序結束時發出的EOI命令來復位。
(6)CPU讀取該中斷類型號,轉移到相應的中斷處理程序 涉及問題:如何通過中斷類型號找到中斷處理程序? 2.8259A的命令字
(1)ICW1/OCW2/OCW3復用同一個地址(A0=0);剩下的命令字復用另一個地址(A0=1),在本系統中,復用地址分別是0FFE0H和0FFE1H,預置數類別順序為先初始化命令字,再操作命令字,預置數設定順序為下標順序(見“第六章輸入輸出與中斷-2-8259” P32)
(2)0FFE0H用于ICW1,OCW2和OCW3,0FFE1H用于ICW2,ICW3,ICW4和OCW1。本次實驗中,ICW3、OCW3不需要進行設定。
(3)本實驗只需要用一片8259A進行中斷控制,中斷源采用單脈沖信號,中斷觸發方式屬于邊沿觸發,且8086/8088系統必須設定ICW4,因此ICW1=00010011B=13H(4)本系統中,設定使用中斷類型8來服務IR7邊沿觸發產生的中斷,所以ICW2=00001000B=08H(5)對于單片8259A,不需要設定ICW3,而8086/8088系統需要確定ICW4。因此跳過ICW3的設定直接設定ICW4。在該實驗中,我們使用全嵌套方式(最常用的也是默認的工作方式,只開放比當前中斷優先級高的中斷,且中斷優先權的級別固定,按照IR0-IR7逐級次之。)和普通EOI方式(一般的中斷結束方式,在中斷程序返回前,輸出中斷結束命令把ISR當前優先級最高的對應位清零)操作,因此ICW4=00001001B=09H(6)對于OCW,假設使用OCW1來屏蔽除IR7外其它所有中斷,這樣OCW1=01111111B=7FH;選用普通EOI,則OCW2=00100000=20H 3.有關中斷向量存儲地址的形成說明
(1)ICW2是設置中斷類型碼的初始化命令字。其中,D7~D3是8086/8088系統中8259A的中斷指針地址的高5位,D2~D0的值恒為0。
(2)本系統的中斷序號和中斷地址對應表如下:
4.有關ICW4的設置說明
ICW4的位定義如下:
·其中,D7-D5位總是為0 ·在IBM PC/XT系統中,BUF位設定為1,M/S設定為0 ·普通中斷結束方式用于完全嵌套情況下,8259每得到一次EOI命令,將把ISR中已經置位的各位中優先級最高的位復位,以此類推。·因此,在本例中,ICW4=00001001B=09H 5.有關OCW2的設置說明
OCW2用于控制中斷結束,其格式如下:
·其中,R為優先權控制位,R=1為循環優先權,R=0為固定優先權 ·SL位決定了OCW2中L2,L1,L0是否有效,SL=1則有效,否則無效 ·EOI為中斷結束命令位,在非自動中斷結束命令下,EOI=1使得中斷服務寄存器ISR中具有最高優先權的IS復位,EOI=0則該位無效。·在本實驗中,OCW2=0010000=20H 6.七段數碼管顯示相關知識
數碼管字形口地址:0FFDCH,字形代碼如下表所示:
上述不同的代碼實際上就是使得每只數碼管中八只發光二極管的不同“點亮”組合,從而形成所謂不同的“字形”。
數碼管字位口地址:0FFDDH,字位代碼如下表所示:
上述不同的代碼實際上就是“選通”某一片數碼管工作的片選信號,顯然,對應選通信號高電平有效。
字位1對應邏輯箱最左邊那只數碼管,字位6對應最右邊那只數碼管。7.七段數碼管顯示電路圖(ppt)8.Dais微機接口實驗箱操作說明(ppt)9.Windows平臺操作方法(ppt)10.LED平臺操作方法說明(ppt)
(二)流程圖:(用visio畫的)
五、實驗電路:
1、實驗參考電路及接線說明(8259部分)(紅色連線為補充連線)
·SP插孔和8259A的IR7插孔相連,同時將SP插孔和8259A的IR6插孔也連接起來,提供兩個中斷源
·連接138譯碼輸入端A.B.C,其中A連A2,B連A3,C連A4,138使能控制輸入端G與位于地址線A0引出孔所在位置下方的使能控制輸出端G作對應連接。8259的CS端連138譯碼器的Y0孔。
·將8259的單元總線接口D0-D7,用8芯排線或8芯扁平線與數據總線單元D0-D7任一接口相連。
2、電路圖拍照:
六、實驗內容:(介紹自己所選的實驗內容)
編制程序,利用8259芯片的IRi作為中斷源,產生多級中斷,系統顯示中斷號,比如:IR7作為中斷源則顯示7。
七、實驗步驟:
1.點擊桌面上“Intel8088 微機實驗系統”圖標; 2.選擇通信串口和速率;
3.檢查有無錯誤對話框,是否正確連接儀器; 4.進入dais集成開發環境; 5.選擇本次實驗對應的實驗指導;
6.調出連線指導,按照實驗原理電路圖,在實驗箱上進行連線;
7.調出參考代碼,進行修改,編寫本次實驗的源程序,源代碼及注釋按ppt要求,放在實驗結果部分;
8.將源程序編譯、連接、裝載入儀器,若出錯則進行修改,直到裝載成功; 9.將LED平臺復位,然后點擊綠色按鈕運行;
八、實驗結果:(源程序代碼,必要的中文注釋,以及運行結果,包括截圖或者拍照)
(一)源程序代碼及中文注釋:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3400H H8: JMP P8259 ZXK EQU 0FFDCH;數字管字形碼端口地址
ZWK EQU 0FFDDH;數字管字位碼端口地址
LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;LED
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H
BUF DB ?,?,?,?,?,?;預留6個字節空間存放的是需要顯示的字符,如123456 PORT0 EQU 0FFE0H;偶地址 PORT1 EQU 0FFE1H;奇地址 P8259: CLI;關中斷
CALL WP;初始化顯示“P.”
MOV AX,OFFSET INT8359 MOV BX,0038H;6號中斷向量表
MOV [BX],AX MOV BX,003AH
MOV AX,0000H
MOV [BX],AX
MOV AX,OFFSET INT8259 MOV BX,003CH;7號中斷向量表
MOV [BX],AX
MOV BX,003EH
MOV AX,0000H
MOV [BX],AX
CALL FOR8259;命令字的設置
MOV SI,0000H
STI;開中斷
CALL WP CON8: CALL DIS JMP CON8;-----INT8259:CLI;初始化8259 IR7
MOV BX,OFFSET BUF MOV BYTE PTR [BX+SI],07H
;INC SI
CMP SI,0007H
JZ X59 XX59: MOV AL,20H;OCW2 MOV DX,PORT0 OUT DX,AL
MOV CX,0050H XXX59: PUSH CX
CALL DIS POP CX
LOOP XXX59 POP CX
MOV CX,3438H
PUSH CX
STI
IRET
X59: MOV SI,0000H
CALL WP JMP XX59;-----INT8359:CLI;初始化8259 IR6
MOV BX,OFFSET BUF MOV BYTE PTR [BX+SI],06H
;INC SI
CMP SI,0007H
JZ Y59 YY59: MOV AL,20H;OCW2=0010000=20H 一般EOI命令,全嵌套方式
MOV DX,PORT0 OUT DX,AL
MOV CX,0050H YYY59: PUSH CX CALL DIS POP CX
LOOP YYY59 POP CX
MOV CX,3438H
PUSH CX
STI
IRET
Y59: MOV SI,0000H
CALL WP JMP YY59;==============================
FOR8259:MOV AL,13H;ICW1=00010011B=13H 單脈沖 邊沿觸發
MOV DX,PORT0 OUT DX,AL
MOV AL,08H;ICW2=00001000B=08H 中斷類型8
MOV DX,PORT1 OUT DX,AL
MOV AL,09H;ICW4=400001001B=09H 全嵌套方式,普通EOI方式
OUT DX,AL
MOV AL,00H;OCW1=00000000B=00H 不屏蔽中斷
OUT DX,AL
RET
;---------------------------
WP: MOV BUF,11H;初始化顯示“P.”
MOV BUF+1,10H
MOV BUF+2,10H
MOV BUF+3,10H
MOV BUF+4,10H
MOV BUF+5,10H
RET
;-
DIS: MOV CL,20H;字位碼指向左側第一個數碼管
MOV BX,OFFSET BUF DIS1: MOV AL,[BX];取第一個需要顯示的字符
PUSH BX
MOV BX,OFFSET LED;BX指向字形碼表的表頭地址
XLAT;查表得到需要顯示的字符對應的字形碼,并裝入AL
POP BX
MOV DX,ZXK OUT DX,AL;將要顯示的字形碼輸出到字形碼端口
MOV AL,CL
MOV DX,ZWK OUT DX,AL;將要顯示的字位碼輸出到字位碼端口
PUSH CX
MOV CX,0100H DELAY: LOOP $;延時程序
POP CX
CMP CL,01H;檢測是否顯示到最右側的數碼管
JZ EXIT;如果是,退出
INC BX
SHR CL,1
JMP DIS1;否則繼續顯示下一個 EXIT: MOV AL,00H
MOV DX,ZWK OUT DX,AL;一個都不顯示
RET;返回主程序;--------------------------CODE ENDS
END H8
(二)運行結果及分析
1、運行結果介紹: 不按彈片時,初始化顯示“P.”;
短按彈片時,顯示“6”;
長按彈片時,先顯示“6”,再顯示“7”。
2、照片:將關鍵部分合并到一張圖片,便于觀察,如下圖:
3、結果分析:
不按彈片時,初始化顯示“P.”;
短按彈片時,有IR6和IR7兩個中斷源,由于OCW2設置為固定優先級,IR0優先級最高,依次遞減,IR6優先被處理,因此顯示“6”,由于短按,處理完IR6之后IR7中斷信號源已經消失;
長按彈片時,有IR6和IR7兩個中斷源,IR6優先被處理,因此顯示“6”,后處理IR7,因此之后顯示變為“7”。
九、結果分析和改進意見(完成每次留的問答題,以及實驗過程中遇到的問題)
(一)上課留的問答題
1、pc機有幾塊8259,端口地址是多少
(1)早期的微型計算機使用單片的8259A,如早期IBM PC/XT只有一個8259A,端口地址分別是20H、21H。(2)后期,設計師們意識到這是不夠的,到了IBM PC/AT,有2個8259A,一個稱作Master,另一個稱作Slave,Slave以基連的方式連接在Master上,如今大多數PC都有兩個8259A。課件相關知識:
2、ret和iret的區別
(1)ret是過程調用的返回指令,一般位于子程序的最后,如果是段內返回,則從堆棧中彈出一個字送IP,如果是段間返回,則從堆棧中彈出兩個字送IP和CS,不需要恢復標志寄存器;
(2)iret是中斷返回指令,是中斷服務程序的最后一條指令,負責恢復斷點并恢復標志寄存器的內容。
3、中斷和過程調用的區別
(1)中斷是隨機事件或異常事件引起,調用則是事先已在程序中安排好 ;
(2)響應中斷請求不僅要保護斷點地址,還要保護FLAGS標志寄存器的內容;
(3)調用指令在指令中直接給出子程序入口地址,而中斷指令只給出中斷向量碼,入口地址則在向量碼指向的內存單元中。
4、短按和長按的區別
(1)短按,則中斷時間短,處理完IR6中斷后,IR7的中斷信號源已經不存在了;
(2)長按,則中斷時間長,處理完IR6中斷后,IR7源仍然存在,繼續處理IR7中斷。
(二)實驗過程中遇到的問題
一定要正確運用開關中斷的指令,為了避免其他中斷服務影響當前中斷服務程序的運行,可以在當前程序開始運行的時候加上CLI指令。在當前程序運行結束的時候,為了不影響其他中斷服務程序的正常請求和響應,應該加上STI指令開放中斷。做實驗很有趣,寫報告很煩。
在大三下學期,保研考研找實習最忙的時候,要寫這么多報告,很難受。但是萬幸王老師很漂亮,講話又好聽,我超喜歡她的。如果她直接教匯編理論課我一定好好聽~~~ 可以把中斷源增加至3個、4個等,讓數碼管的顯示變化更復雜有趣。
十一、心得體會:
做實驗很有趣,寫報告很煩。
在大三下學期,保研考研找實習最忙的時候,要寫這么多報告,很難受。但是萬幸王老師很漂亮,講話又好聽,我超喜歡她的。如果她直接教匯編理論課我一定好好聽~~~
報告評分:
指導教師簽字:
電 子 科 技 大 學
實
驗
報
告
(三)學生姓名:郫縣英格拉姆
學 號:2014123456789
指導教師:皮皮怪
實驗地點:主樓A2_412
實驗時間:2017年5月16日星期二
一、實驗室名稱:
主樓A2_411機房
二、實驗項目名稱:8253時鐘中斷計時實驗
三、實驗學時:3學時
四、實驗原理:(包括知識點,流程圖)
(一)知識點:
(老師上課提的問題寫在報告第九部分)
(一)有關8253芯片
8253基本工作方式就是對CLK時鐘脈沖進行計數。CLK脈沖可以是均勻的、連續的、周期精確的,也可以是不均勻的、斷續的、周期不定的。
無論8253工作于何種方式,當計數器減1到0時,在OUT引腳上必定有電平或脈沖輸出,OUT引腳輸出的信號可以是方波、電平或脈沖等,由工作方式決定。
8253每個計數器都可以選擇6種工作方式之一進行工作。在控制字中進行設定。
二進制方式計數的最小值是0001H,最大值為0000H,即216=65536 二-十進制(BCD碼)計數的最小值是0001H,最大值為0000H,即10^4=10000
(二)計數器和定時器的異同點
相同之處:都需要設定計數初值,在每個輸入脈沖的作用下進行減1計數,減到0后產生一個OUT輸出。
不同之處: 1.定時器方式下減到0后會自動恢復初始值進行下一輪減1計數;計數器方式下減到0后必須有新的外界因素的重觸發才開始新一輪減1計數。
2.定時器方式下的輸入時鐘CLK必須是等周期的;計數器方式下的輸入時鐘CLK不一定是等周期的。
(三)關于選擇分頻信號源的說明
【目標】產生一個1s周期的方波信號(方式3)和1s延時的信號(方式0)1s周期對應的頻率是1HZ,當計數初值=信號頻率時得到1s周期的信號輸出 T0-T7中,最小的非小數頻率(HZ為單位)計數初值為76.8K 【結論】任意一個通道的計數器最大值<76.8K,無法一次設定好需要的初值 解決方案(該系統CPU8088/8086采用主頻為14.3818MHz)1.用多個定時/計數通道進行分頻
2.對單個定時/計數通道進行設置,設定一定倍數的周期信號引發顯示刷新(不是引發顯示中斷)
(二)流程圖:(用visio畫的)
五、實驗電路:
1、實驗參考電路及接線說明(紅色連線為補充連線)
·8253的GATE接+5V(方式3)或者開關(方式0)。
·8253的CLK插孔接分頻器74LS393的T0-T7插孔(建議選擇76.8KHZ)·8253的OUT輸出端與8259的IR7輸入端相連。
·連接138譯碼輸入端A.B.C,其中A連A2,B連A3,C連A4,138使能控制輸入端G與位于地址線A0引出孔所在位置下方的使能控制輸出端G作對應連接,該端的尋址范圍為0FFE0H~0FFFFH。8253、8259的CS孔與138譯碼器的Y0孔相連。
·將8259、8253的單元總線接口D0~D7用8芯排線或8芯扁平線與數據總線單元D0~D7任一接口相連(要接兩根數據線)。
2、電路圖拍照:
六、實驗內容:(介紹自己所選的實驗內容)利用8253的多個通道產生周期方波信號(方式3),該信號作為8259芯片的中斷源,用邊沿觸發方式產生中斷(單級中斷),從而在七段數碼管上構成一個“秒表”(顯示范圍為0-9或者00-59)。要求正確設置參數和采用適當的編程技巧,使得七段數碼管的顯示間隔為1s。
七、實驗步驟:
1.點擊桌面上“Intel8088 微機實驗系統”圖標; 2.選擇通信串口和速率;
3.檢查有無錯誤對話框,是否正確連接儀器; 4.進入dais集成開發環境; 5.選擇本次實驗對應的實驗指導;
6.調出連線指導,按照實驗原理電路圖,在實驗箱上進行連線;
7.調出參考代碼,進行修改,編寫本次實驗的源程序,源代碼及注釋按ppt要求,放在實驗結果部分;
8.將源程序編譯、連接、裝載入儀器,若出錯則進行修改,直到裝載成功; 9.將LED平臺復位,然后點擊綠色按鈕運行;
八、實驗結果:(源程序代碼,必要的中文注釋,以及運行結果,包括截圖或者拍照)
(一)源程序代碼及中文注釋:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3400H H8: JMP P8259 ZXK EQU 0FFDCH;數字管字形碼端口地址
ZWK EQU 0FFDDH;數字管字位碼端口地址
LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;LED
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H
BUF DB ?,?,?,?,?,?;預留6個字節空間存放的是需要顯示的字符,如123456 IR_COUNT DB 0 SC_0 EQU BUF+5
PORT0 EQU 0FFE0H;8253計數器0 & 8259偶地址 PORT1 EQU 0FFE1H;8253計數器1 & 8259奇地址 PORT2 EQU 0FFE2H;8253計數器2 PC EQU 0FFE3H;8253控制寄存器地址 P8259: CLI
CALL WP;初始化顯示“P.”
MOV AX,OFFSET IR7_BEGIN;取IR7中斷服務程序偏移地址
MOV BX,003CH
MOV [BX],AX;寫中斷向量表IP
MOV BX,003EH
MOV AX,0000H
MOV [BX],AX;寫中斷向量表CS
CALL FOR8253;8253初始化
CALL FOR8259;8259初始化
MOV SI,0000H
STI CON8: CALL DIS JMP CON8;-----IR7_BEGIN:
CLI
INC BYTE PTR[IR_COUNT]
CMP BYTE PTR[IR_COUNT],4JB IR7_E MOV BYTE PTR[IR_COUNT],0
CALL INCS0 IR7_E:
MOV AL,20H;OCW2,EOI命令
MOV DX,PORT0 OUT DX,AL
MOV BX, OFFSET BUF POP CX
MOV CX,OFFSET CON8;也顯示當前BUF中的數據
PUSH CX
STI
IRET INCS0:
INC BYTE PTR[SC_0]
CMP BYTE PTR[SC_0],10
JB INCS0_CARRY MOV BYTE PTR [SC_0], 0 INCS0_CARRY:
RET
;==============================
FOR8259:MOV AL,13H;ICW1單級中斷,需要ICW4,不需要ICW
3MOV DX,PORT0 OUT DX,AL
MOV AL,08H;ICW2 MOV DX,PORT1 OUT DX,AL
MOV AL,09H;ICW4,特殊全嵌套,緩沖方式,8086
OUT DX,AL
MOV AL,7FH;OCW1,中斷屏蔽操作字,屏蔽除IR7之外的所有中斷
OUT DX,AL
RET
;============================== FOR8253:MOV DX,PC MOV AL,36H;00110110 計數器0,先低后高,方式3,二進制
OUT DX,AL
MOV DX,PORT0 MOV AL,00H;低8位
OUT DX,AL
MOV AL,4BH;高8位
OUT DX,AL
;---------------------------
WP: MOV BUF,11H;初始化顯示“P.”
MOV BUF+1,10H MOV BUF+2,10H
MOV BUF+3,10H
MOV BUF+4,10H
MOV BUF+5,10H
RET
;-DIS: MOV CL,20H
MOV BX,OFFSET BUF DIS1: MOV AL,[BX];取第一個需要顯示的字符
PUSH BX
MOV BX,OFFSET LED;BX指向字形碼表的表頭地址
XLAT;查表得到需要顯示的字符對應的字形碼,并裝入AL
POP BX
MOV DX,ZXK OUT DX,AL;將要顯示的字形碼輸出到字形碼端口
MOV AL,CL
MOV DX,ZWK OUT DX,AL;將要顯示的字位碼輸出到字位碼端口
PUSH CX
MOV CX,0100H DELAY: LOOP $;延時程序
POP CX
CMP CL,01H;檢測是否顯示到最右側的數碼管
JZ EXIT;如果是,退出 INC BX
SHR CL,1
JMP DIS1;否則繼續顯示下一個 EXIT: MOV AL,00H
MOV DX,ZWK OUT DX,AL;一個都不顯示
RET;返回主程序
;--------------------------CODE ENDS END H8
(二)運行結果
1、運行結果介紹:
運行程序,數碼管左側顯示“P.”不變,右側按照1s的時間間隔變化,依次顯示數字“0”~“9”,實現秒表,很好的完成了實驗要求。
2、照片:將關鍵部分合并到一張圖片,便于觀察,如下圖:
九、結果分析和改進意見(完成每次留的問答題,以及實驗過程中遇到的問題)
(一)上課留的問答題
1、在實驗中,先初始化8253還是8259?為什么?
先初始化8253。因為8253和8259存在地址復用,8259的初始化程序中存在指令會干擾8253的初始化。2.PC機上有無8253,地址分配如何?
有8253。PC/XT微機系統中使用一片8253,T0、T1、T2、控制口地址依次是:40H、41H、42H、43H。三個定時/計數器各自的用途是:
定時/計數器T0:用于日歷時鐘計時; 定時/計數器T1:用于DRAM內存定時刷新; 定時/計數器T2:用于揚聲器發聲。
十一、心得體會:
做實驗很有趣,寫報告很煩。
在大三下學期,保研考研找實習最忙的時候,要寫這么多報告,很難受。但是萬幸王老師很漂亮,講話又好聽,我超喜歡她的。如果她直接教匯編理論課我一定好好聽~~~
報告評分:
指導教師簽字:
電 子 科 技 大 學
實
驗
報
告
(四)學生姓名:郫縣英格拉姆
學 號:2014123456789
指導教師:皮皮怪
實驗地點:主樓A2_412
實驗時間:2017年5月23日 周二
一、實驗室名稱:
主樓A2_411機房
二、實驗項目名稱:8255A并行可編程接口芯片實驗
三、實驗學時:3學時
四、實驗原理:(包括知識點,流程圖)
(一)知識點:
(老師上課提的問題寫在報告第九部分)
1.有關8255的工作方式
方式0——基本輸入/輸出方式,不用聯絡信號,不用中斷。A組和B組都可以作為輸入/輸出,而且輸出是鎖存的。
方式1——選通輸入輸出方式,與方式0相比,它的主要特點是當A口、B口工作于方式1時,C口的某些I/O線被定義為A口和B口在方式1下工作時所需的聯絡信號線,這些線已經定義,不能由用戶改變。A口工作于方式1輸出時,用PC3,PC6和PC7作聯絡線。C口剩余的兩個I/O線PC4和PC5工作于方式0。該方式下輸入輸出均帶鎖存器。
2、實驗題目2注意事項
【分析】PA口驅動LED,因此作為輸出,工作在方式1,需要正確連接和設置PC3/PC6/PC7三個聯絡信號,如下圖所示:
由于8255采用中斷方式傳送數據,故INTEA=1(PC6=1),需要通過C口置位/復位控制字來設定;INTRA由PC3連接8259A的IR,引發中斷;PC7未用。3、8255A的方式選擇控制字格式 4、8255A通道C置位/復位控制字格式
(二)流程圖:(用visio畫的)
五、實驗電路:
1、實驗參考電路及接線說明(紅色連線為補充連線)
·用PC6連接單脈沖發生器模擬外設應答信號,PC3連接8259的IR端(單級中斷)
2、電路圖拍照:
六、實驗內容:(介紹自己所選的實驗內容)設置8255的A組工作在方式1,用中斷的方式驅動PA口8只發光二極管,用PC6連接單脈沖發生器模擬外設應答信號,PC3連接8259的IR端(單級中斷),每按一次單脈沖就點亮一個LED(從左往右或者從右往左依次點亮)。
七、實驗步驟:
1.點擊桌面上“Intel8088 微機實驗系統”圖標; 2.選擇通信串口和速率;
3.檢查有無錯誤對話框,是否正確連接儀器; 4.進入dais集成開發環境; 5.選擇本次實驗對應的實驗指導;
6.調出連線指導,按照實驗原理電路圖,在實驗箱上進行連線;
7.調出參考代碼,進行修改,編寫本次實驗的源程序,源代碼及注釋按ppt要求,放在實驗結果部分;
8.將源程序編譯、連接、裝載入儀器,若出錯則進行修改,直到裝載成功; 9.將LED平臺復位,然后點擊綠色按鈕運行;
八、實驗結果:(源程序代碼,必要的中文注釋,以及運行結果,包括截圖或者拍照)
(一)源程序代碼及中文注釋:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3400H H8: JMP P8259 PORT0 EQU 0FFE0H;偶地址 PORT1 EQU 0FFE1H;奇地址 PA EQU 0FFD8H;A口 PB EQU 0FFD9H;B口 PC EQU 0FFDAH;C口 PCTL EQU 0FFDBH;控制口 P8259: CLI
MOV AX,OFFSET INT8259;7號中斷向量表
MOV BX,003CH
MOV [BX],AX
MOV BX,003EH
MOV AX,0000H
MOV [BX],AX CALL FOR8259;設置命令字
MOV SI,0000H STARTP1: MOV DX,PCTL MOV AL,0A8H;SET 1010 1000
OUT DX,AL
MOV AL,0DH;SET 0000 110
1OUT DX,AL
MOV BX,0H
STI CON8: CALL DIS JMP CON8;-----INT8259:CLI
SHL BX,1;
INC BX;
MOV AL,20H
MOV DX,PORT0 OUT DX,AL;OCW2,EOI命令
STI
IRET
;-----FOR8259:MOV AL,13H;ICW1
MOV DX,PORT0 OUT DX,AL
MOV AL,08H;ICW
2MOV DX,PORT1 OUT DX,AL
MOV AL,09H;ICW4,特殊全嵌套,緩沖方式,8086
OUT DX,AL
MOV AL,00H;OCW1 不屏蔽
OUT DX,AL
RET
;-DIS:
MOV AX, 0FFFFH
XOR AX, 0FFFFH MOV DX, PA;A口
OUT DX, AL
JMP DIS;--------------------------CODE ENDS
END H8
(二)運行結果及拍照
1、運行結果介紹:
開始運行后,發光二極管不會亮,每按一次彈片,產生一個單脈沖,就點亮一只發光二極管,從左向右依次點亮。
2、照片:將關鍵部分合并到一張圖片,便于觀察,如下圖:
九、結果分析和改進意見(完成每次留的問答題,以及實驗過程中遇到的問題)
(一)上課留的問答題
1、PC上有幾片8255,是如何與揚聲器和打印機連接的? 有一片8255。
與打印機連接情況如下:
8255A工作在方式1,作為打印機的接口,其電路連接如圖所示,采用中斷方式傳送數據。地址為0C0H、0C2H、0C4H、0C6H。
與揚聲器連接情況如下: PB0輸出揚聲器發聲控制信號到8253的GATE2端,PB0=1,允許8253計數器2產生音調信號;
PB1輸出揚聲器發聲信號。PB1=1允許8253輸出的音調信號加到揚聲器驅動電路。
(二)實驗過程中遇到的問題
一開始怎么調試是卡死狀態,很絕望,后來發現居然是電腦前的板子連接的是其他的電腦。
十一、心得體會:
做實驗很有趣,寫報告很煩。
在大三下學期,保研考研找實習最忙的時候,要寫這么多報告,很難受。但是萬幸王老師很漂亮,講話又好聽,我超喜歡她的。如果她直接教匯編理論課我一定好好聽~~~
報告評分:
指導教師簽字:
電 子 科 技 大 學
實
驗
報
告
(五)學生姓名:郫縣英格拉姆
學 號:2014123456789
指導教師:皮皮怪
實驗地點:主樓A2_412
實驗時間:2017年6月7日 周三
一、實驗室名稱:
主樓A2_411機房
二、實驗項目名稱:交通燈綜合實驗
三、實驗學時:3學時
四、實驗原理:(包括知識點,流程圖)
(一)知識點:
(老師上課提的問題寫在報告第九部分)
(一)實驗涉及的子程序
1.顯示子程序 2.控制子程序
3.黃燈閃爍5次子程序
(二)中斷服務程序的功能
調用顯示子程序并更新顯示緩沖區數據(實現倒數計數,時間間隔1s)
(三)主程序功能
1.初始化8255,8253,8259,顯示緩沖區以及寫中斷向量
2.往8255的端口送數,驅動發光二極管模擬十字路口交通燈工作狀態 3.調用控制子程序以及黃燈閃爍5次子程序 4.循環操作第2、3步
(四)編程提示 8255部分
1.該實驗中,8255選擇工作方式0; 2.由于十字路口的交通燈在東西方向或南北方向的6只發光二極管的工作狀態完全一致,因此,12只燈可分為兩組,用PA或PB一個端口即可進行模擬; 3.用PC口一個位連接8253的GATE,作為中斷顯示數據的控制開關; 4.該實驗只需要正確設置方式選擇控制字寄存器;
5.黃燈閃爍的處理,實際上就是往對應的黃燈位置0后再置1,循環5次; 8253部分
1.該實驗中,8253選擇工作方式3,產生周期性的方波信號;
2.正確選擇CLK信號源,正確計算初始值,使得方波信號周期為1s或者接近1s;
3.由于GATE信號為高電平時才會產生方波信號,因此用PC口某位連接GATE,通過不同的輸出進行8253工作方式3的開關信號; 8259部分
1.只需要編寫單級中斷,中斷服務程序主要完成倒計時的功能; 2.正確設置命令字寄存器和正確填寫中斷向量; 3.中斷信號源為8253輸出的方波信號
(二)流程圖:(老師ppt自帶流程圖)
五、實驗電路:
1、實驗參考電路及接線說明(紅色連線為補充連線)
·138譯碼器的Y0對應的地址范圍為0FFE0H--0FFE3H,覆蓋了8253和8259的寄存器地址,因此,8253和8259的CS端均連Y0。
·138譯碼輸入端ABC分別連A2、A3、A4,使能控制輸入端G與位于地址線A0引出孔所在位置下方的使能控制輸出端G作對應連接。
·將8253和8259的單元總線接口D0--D7,與數據總線單元D0--D7任一接口相連。
·將8255的PA或PB口連接12只發光二極管(只用端口的6位)·將8255的PC口某位連接8253的某GATE ·將8253的某OUT連接8259的某IR ·將8253的某CLK連接393分頻器某輸出(T0--T7中任意一個,自選)
2、電路圖拍照:
六、實驗內容:(介紹自己所選的實驗內容)
用8255A驅動12只發光二極管,模擬十字路口交通燈工作狀態。用8253的方式3產生連續的方波信號,利用該信號的上升沿觸發中斷,作為8259的中斷請求信號,在七段數碼管上顯示紅綠燈余下時間(間隔一秒顯示刷新,倒數計數,當計數值為0時紅綠燈進行切換,綠燈轉換為紅燈之前,黃燈閃爍5次)
七、實驗步驟:
1.點擊桌面上“Intel8088 微機實驗系統”圖標; 2.選擇通信串口和速率;
3.檢查有無錯誤對話框,是否正確連接儀器; 4.進入dais集成開發環境; 5.選擇本次實驗對應的實驗指導;
6.調出連線指導,按照實驗原理電路圖,在實驗箱上進行連線;
7.調出參考代碼,進行修改,編寫本次實驗的源程序,源代碼及注釋按ppt要求,放在實驗結果部分;
8.將源程序編譯、連接、裝載入儀器,若出錯則進行修改,直到裝載成功; 9.將LED平臺復位,然后點擊綠色按鈕運行;
八、實驗結果:(源程序代碼,必要的中文注釋,以及運行結果,包括截圖或者拍照)
(一)源程序代碼及中文注釋:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3400H H8: JMP START P0 EQU 0FFE0H;(1)8253 計數器0(2)用于ICW1,OCW2和OCW3 P1 EQU 0FFE1H;(1)8253 計數器1(2)用于ICW2,ICW3,ICW4和OCW1 P2 EQU 0FFE2H;8253 計數器2 P3 EQU 0FFE3H;8253 寫方式字的端口
PA EQU 0FFD8H;8255 A口 PB EQU 0FFD9H;8255 B口 PC EQU 0FFDAH;8255 C口
PCTL EQU 0FFDBH;8255 控制口地址
ZXK EQU 0FFDCH;數碼管字形口地址
ZWK EQU 0FFDDH;字位口地址
LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H BUF DB ?,?,?,?,?,?
YELLOW EQU 11111110B GREEN EQU 11111101B RED EQU 11111011B NULL EQU 11111111B
PATH DW 0;道路通行方向, 0東西方向, 1南北方向 TIME DB 0;通行剩余時間 START: CLI
MOV AX,OFFSET INT8259;設置中斷
MOV BX,003CH
MOV [BX],AX;放入服務程序偏移量
MOV BX,003EH
MOV AX,0000H;放入系統中斷向量區段基地址0000
MOV [BX],AX
CALL WP;顯示9
CALL INIT8253;初始化8253
CALL INIT8255;初始化8255 CALL INIT8259;初始化8259
STI CON8: CALL DIS JMP CON8;-------8259中斷服務子程序-------INT8259:
CLI;關中斷
MOV CL,TIME;顯示10
DEC CL
MOV BUF,CL
JNZ L1 MOV DX,PC MOV AL,00H
OUT DX,AL;PC停止計時
MOV DX,PA ADD DX,PATH CALL FLASH;閃爍
MOV AL,RED OUT DX,AL;變為紅燈
XOR PATH,1;另一方向通行
XOR DX,1
MOV AL,GREEN OUT DX,AL;變為綠燈
MOV CL,10;定時器初始化
MOV DX,PC MOV AL,01H
OUT DX,AL;PC開始計時 L1: MOV TIME,CL;倒計時
CALL DIS;顯示
MOV AL,20H;中斷退出
MOV DX,P0 OUT DX,AL;OCW2 OEI
POP BX
MOV BX, OFFSET CON8 PUSH BX
STI
IRET
;-------閃爍子程序(DX)-------FLASH:
PUSH CX MOV CL, 5
FLASH1: MOV AL,YELLOW;初始AL黃
OUT DX,AL;黃燈亮
CALL DELAY1;長延時 MOV AL,NULL;清空AL
OUT DX,AL;(黃)燈滅
CALL DELAY1;長延時
LOOP FLASH1 POP CX
RET
;-------8253初始化---------INIT8253:
MOV AL,00110110B;選計數器0,從而后面是P0,先低后高字節,選方式3
MOV DX,P3 OUT DX,AL;寫控制字
MOV AL,00H;低8位為0
MOV DX,P0;計數器0
OUT DX,AL
MOV AL,4BH;高8位為4B,這樣393連接T5或T6,應該會每秒一個脈沖
OUT DX,AL
MOV AL,10010110B;選計數器2,直接傳低8位,方式3,添加有效果
MOV DX,P3 OUT DX,AL;寫控制字
MOV AL,04H
MOV DX,P2;計數器2
OUT DX,AL
RET
;-------8255初始化-------INIT8255:
MOV AL,10000000B;控制字 A口,方式0,輸出;B口方式0,輸出;C口,輸出
MOV DX,PCTL OUT DX,AL
MOV DX,PA;A口
MOV AL,GREEN;初始狀態,綠燈
OUT DX,AL
MOV DX,PB;B口
MOV AL,RED;初始狀態,紅燈
OUT DX,AL;初始狀態,LV燈
MOV TIME,10;初始化計時時間
MOV DX,PC;C口
MOV AL,01H;PC輸出始終是1,連到8253GATE
OUT DX,AL;輸出到C口,開始計時
RET
;----------8259初始化-------INIT8259:
MOV AL,13H;ICW1
MOV DX,P0 OUT DX,AL;ICW1單級中斷,需要ICW4,不需要ICW3
第二篇:《計算機程序設計》實驗報告
《計算機 程序設計》 實驗報告
姓名:
學號 :
實驗日期:
****年**月**日
實驗名稱
控制結構與基本算法 一、實驗目的要求 1.熟練掌握 if 語句和 switch 語句 2.循環控制結構的使用 二、實驗內容 1.實驗教材 P86 第四題。
2.實驗教材 P87 第八題。
3.實驗教材 P108 第一題。
4.實驗教材 108 頁的第四題。
5.選做題:參考實驗教材 P104 第六題,做課件上題目:
科大有 4 位同學中的一位做了好事不留名,表揚信來了之后,校長問這四位是誰做的好事.A 說:不是我.B 說:是 C.C 說:是 D.D 說:他(C)胡說
? 文件名格式:學號-姓名-實驗 5.doc
? 序號 1-23:tmf77@mail.ustc.edu.cn ? 序號 24-45:yunmeng@mail.ustc.edu.cn ? 序號 46-67:cys1024@mail.ustc.edu.cn
三、上機程序(算法設計思想)
四、運行結果
五、調試中的問題及解決方法
第三篇:《C語言程序設計》實驗報告
指導教師學院專業班級學號姓名實驗室
實驗題目:
實驗要求:
實驗內容及步驟:
運行結果
心得體會:
第四篇:Java語言程序設計實驗報告1
《Java語言程序設計》實驗報告一
學生姓名: 孫文琳
班級: 信息111
學號:201152275119 實驗地點: 經管中心證券實驗室
指導教師:趙利平實驗日期:
2012.3.6
實驗環境:Windows 2000+JDK1.6
1.實驗目的(1)養成良好的編程風格;(2)掌握字符數據類型及其運算;
(3)熟悉從輸入對話框獲取輸入和從控制臺獲取輸入兩種方法;(4)掌握布爾運算符;(5)掌握分支語句if和switch。
2.實驗內容(1)在控制臺下求兩個實數的最大值:完成實驗教材P22程序清單2-2;(2)
3.實驗過程
報告撰寫具體要求:上述實驗內容要求寫出源代碼及運行結果。實驗內容(1)://CompareTwoNumbersl.java
import java.util.Scanner;
public class CompareTwoNumbers1{
double number1,number2;
Scanner scanner;
public CompareTwoNumbers1(){
System.out.println(“請輸入兩個數字:”);
scanner=new Scanner(System.in);
number1=scanner.nextDouble();
number2=scanner.nextDouble();
System.out.println(“較大的數是:”+(number1>number2?number1:number2));
}
public static void main(String args[]){ CompareTwoNumbers1 ct=new CompareTwoNumbers1();System.exit(0);}
}
實驗內容(2):
//DollarConvertor.java import java.util.Scanner;public class DollarConvertor{ public static void main(String args[]){ System.out.println(“請輸入美元數:”);Scanner scanner=new Scanner(System.in);double i=scanner.nextDouble();double result=i*6.2875;System.out.println(“對應的人民幣數:”+result);} }
實驗內容(3): public class MultiplyList1{ public static void main(String args[]){ String output=“";for(int row=1;row<=9;row++){ for(int col=1;col<=row;col++)output+=col+”*“+row+”=“+(row*col)+” “;output+=”n";} System.out.println(output);System.exit(0);}}
4.實驗總結
心得體會:做實驗要小心翼翼,注意Java大小區分
第五篇:C語言程序設計 實驗報告2.3
C語言程序設計
實驗報告
專業
班級
日期
11月26日
成績
實驗組別
第 2(2.3)次實驗
指導教師
李開
學生姓名
學號
同組人姓名
實驗名稱 流程控制實驗
一、實驗目的
(1)掌握復合語句、if語句、switch語句的使用,熟練掌握for、while、do-while三種基本的循環控制語句的使用,掌握重復循環技術,了解轉移語句與標號語句。
(2)熟練運用for、while、do-while語句來編寫程序。(3)練習轉移語句和標號語句的使用。
(4)使用集成開發環境中的調試功能:單步執行、設置斷點、觀察變量值。
二、實驗任務
3.2 實驗內容及要求 1.源程序改錯
下面是計算s=n!的源程序,在這個源程序中存在若干語法和邏輯錯誤。要求在計算機上對這個例子程序進行調試修改,使之能夠正確完成指定任務。例如,8!=40320。#include
2.源程序修改替換
(1)修改第1題,分別用while和do-while語句替換for語句。
(2)修改第1題,輸入改為“整數S”,輸出改為“滿足n!≥S的最小整數n”。例如輸入整數40310,輸出結果為n=8。
3.程序設計
(1)假設工資稅金按以下方法計算:x < 1000元,不收取稅金;1000 ≤ x < 2000,收取5%的稅金;2000 ≤ x < 3000,收取10%的稅金;3000 ≤ x < 4000,收取15%的稅金;4000 ≤ x < 5000,收取20%的稅金;x>5000,收取25%的稅金。輸入工資金額,輸出應收取稅金額度,要求分別用if語句和switch語句來實現。
(2)將輸入的一行字符復制到輸出,復制過程中將一個以上的空格字符用一個空格代替。
(3)打印如下楊輝三角形。
/*第0行 */ 1 1 /*第1行 */ 1 2 1 /*第2行 */ 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1
jjCCii每個數據值可以由組合計算(表示第i行第j列位置的值),而的計算如下:
Ci0?(i=0,1,2,?)Cij?Cij?1*(i-j?1)/ j(j=0,1,2,3,?,i)本程序中為了打印出金字塔效果,要注意空格的數目。一位數之間是3個空格,兩位數之間有2個空格,3位數之間只有一個空格,程序編制過程中要注意區分。
(4)編寫一個程序,將用戶輸入的任意正整數逆轉,例如,輸入1234,輸出4321。
4.選做題
32f(x)?3x?4x?5x?13?0滿足精度e=10-6 編寫一個程序,用牛頓迭代法求方程的一個近似根,并在屏幕上輸出所求近似根。
?x0?a?x?xk?f(xk)/f'(xk),其中f'(x)是牛頓迭代法:求方程近似根的迭代公式為?k?1函數f(x)的導函數。牛頓迭代法首先任意設定的一個實數a來作為近似根的迭代初值x0,然后用迭代公式計算下一個近似根x1。如此繼續迭代計算x2, x3, ?, xn, 直到xn?xn?1?精度e
,此時值xn即為所求的近似根。
2.3:
1.源程序改錯:(源程序)
#include
(修改后程序)#include
int i,n,s=1;
printf(“Please enter n:”);
scanf(“%d”,&n);
for(i=1;i<=n;i++)
s=s*i;
printf(“%d!= %d”,n,s);
return 0;}
2.源程序修改替換
(1)修改第1題,分別用while和do-while語句替換for語句。(while)
#include
(do-while)#include
(2)修改第1題,輸入改為“整數S”,輸出改為“滿足n!≥S的最小整數n”。例如輸入整數40310,輸出結果為n=8。
#include = %d”,i-1,s);return 0;}
3.程序設計
(1)假設工資稅金按以下方法計算:x < 1000元,不收取稅金;1000 ≤ x < 2000,收取5%的稅金;2000 ≤ x < 3000,收取10%的稅金;3000 ≤ x < 4000,收取15%的稅金;4000 ≤ x < 5000,收取20%的稅金;x>5000,收取25%的稅金。輸入工資金額,輸出應收取稅金額度,要求分別用if語句和switch語句來實現。
(switch語句)#include
printf(“輸入你的工資 ”);
int t;
float x;
scanf(“%f”,&x);
t =(int)(x/1000.0);
switch(t){
case 0:
printf(“no tax!n”);
break;
case 1:
printf(“%fn”,0.05*x);
break;
case 2:
printf(“%fn”,0.10*x);
break;
case 3:
printf(“%fn”,0.15*x);
break;
case 4:
printf(“%fn”,0.20*x);
break;
case 5:
printf(“%fn”,0.25*x);
break;
default:
printf(“%fn”,0.25*x);
break;
}
return 0;}
(if語句)
#include “stdio.h” int main(int argc, char *argv[]){
float x, tax;
scanf(“%f”, &x);
if(x<0)
{
printf(“Wrong input.n”);
return 1;
}
if(x<1000)
{
tax = 0.00;
}
else if(x>=1000&&x<2000)
{
tax = 0.05 * x;
}
else if(x>=2000&&x<3000)
{
tax = 0.10 * x;
}
else if(x>=3000&&x<4000)
{
tax = 0.15 * x;
}
else if(x>=4000&&x<5000)
{
tax = 0.20 * x;
}
else
{
tax = 0.25 * x;
} printf(“Tax of salary %.2f YUAN is %.2f YUAN.n”, x, tax);}
(2)將輸入的一行字符復制到輸出,復制過程中將一個以上的空格字符用一個空格代替。
#include
if(c==' '){
if(flag==0){
putchar(c);
flag=1;
}
}
else{
putchar(c);
flag=0;
}
}
return 0;}
(3)打印如下楊輝三角形。
/*第0行 */ 1 1 /*第1行 */ 1 2 1 /*第2行 */ 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1
jjCCii每個數據值可以由組合計算(表示第i行第j列位置的值),而的計算如下:
Ci0?1
(i=0,1,2,?)Cij?Cij?1*(i-j?1)/ j(j=0,1,2,3,?,i)本程序中為了打印出金字塔效果,要注意空格的數目。一位數之間是3個空格,兩位數之間有2個空格,3位數之間只有一個空格,程序編制過程中要注意區分。
#include
(4)編寫一個程序,將用戶輸入的任意正整數逆轉,例如,輸入1234,輸出4321。#include
4.選做題
-6 編寫一個程序,用牛頓迭代法求方程f(x)?3x?4x?5x?13?0滿足精度e=10的一個近似根,并在屏幕上輸出所求近似根。
32?x0?a?x?xk?f(xk)/f'(xk),其中f'(x)是牛頓迭代法:求方程近似根的迭代公式為?k?1函數f(x)的導函數。牛頓迭代法首先任意設定的一個實數a來作為近似根的迭代初值x0,然后用迭代公式計算下一個近似根x1。如此繼續迭代計算x2, x3, ?, xn, 直到xn?xn?1?精度e,此時值xn即為所求的近似根。
#include
double f(double x){ return(3*x*x*x-4*x*x-5*x+13);} double f_(double x){ return(9*x*x-8*x-5);} double root(double m){ double n;n=m-f(m)/f_(m);if(fabs(m-n)<=0.000001){ return n;} else{ return root(n);} }
四、實驗體會
了解更多有關C語言的語法知識和循環結構以及熟練了調試過程。