1. 程式人生 > >【lc3】彙編實現I/O中斷

【lc3】彙編實現I/O中斷

1.Purpose——To showhow interrupt-driven Input/Output can interrupt a program that is running,execute the interrupt service routine, and return to the interrupted program,picking up exactly where it left off (just as if nothing had happened).

The assignment consists of three parts:

1)The user program

2)The keyboard interrupt service routine

3)The operating system enabling code

2.Principle: (1)本實驗中對鍵盤輸入採用interrupt I/O方式,對顯示螢幕輸出則採用polling的方式

 (2)在user program 中,講“[email protected]”與“      ”作為兩個字串,控制二者輪流輸出和換行時機,以達到實驗要求輸出方式

                     (3)為了至於顯示頻重新整理過快,採用了延時的方法,即每一行輸出後,count2500方進行下一行的輸出

(4)在interrupt routine中不能採用trap指令,則逐一將需要輸出的字元儲存到DDR中以達到輸出目的

3. procedure

  程式碼註釋:

.ORIG x3000

                     LDR6,STACK ; initialize the stack pointer

LD R2,ADDR  ; set up the keyboard interrupt vector tableentry             LD R3,VECTOR

                     STRR2,R3,#0

 

                     LD R2,ENABLE      ;enable keyboard interrupts

                     LDR3,KBSR

                     STRR2,R3,#0

 

                     LDR1,FEEDNUM1 ; start of actual user programto print checkerboard

OUTPUT1      LEAR0,OUT1        ;輸出第一行,從字串OUT1開始輪流輸出OUT1和

                     TRAPx22             ;OUT2兩個字串,共輸出9個則換行

                     ADDR1,R1,#-1

                     LEAR0,OUT2

                     TRAPx22

                     ADDR1,R1,#-1

                     BRzOUTFED1      ;輸出換行

                     BRpOUTPUT1

 

OUTFED1      JSRDELAY

                     LDR0,FEED

                     TRAPx21

                     LDR1,FEEDNUM2

                     BRnzpOUTPUT2  ;轉至輸出第二行部分

 

OUTPUT2      LEAR0,OUT2        ;輸出第一行,從字串OUT2開始輪流輸出OUT2和

                     TRAPx22             ;OUT1兩個字串,共輸出8個則換行

                     ADDR1,R1,#-1

                     LEAR0,OUT1

                     TRAPx22

                     ADDR1,R1,#-1

                     BRzOUTFED2

                     BRpOUTPUT2

 

OUTFED2      JSRDELAY            ;換行並且轉至輸出line1的部分

                     LDR0,FEED

                     TRAPx21

                     LDR1,FEEDNUM1

                     BRnzpOUTPUT1

      

DELAY          STR1, SaveR1       ;延時

                    LD R1, COUNT

REP               ADDR1,R1,#-1

                    BRp REP

                    LD R1, SaveR1

                    RET

 

ENABLE        .FILLx4000

KBSR             .FILLxFE00

VECTOR        .FILLx180

ADDR            .FILLx1500

STACK           .FILLx3000

COUNT         .FILL#2500

SaveR1         .BLKW#1

FEED             .FILL#13

FEEDNUM1   .FILL#9

FEEDNUM2   .FILL#8

OUT1            .STRINGZ"
[email protected]
" OUT2 .STRINGZ" " .END ---------------------------------------------------------------------------- .ORIGx1500 STR0,SAVER0 ;store the registers STR2,SAVER2 STR3,SAVER3 STR4,SAVER4 STR5,SAVER5 STR7,SAVER7 LDI R1,KBDR ;初始化值 LDR2,NUM0 LDR3,NUM9 NOTR2,R2 ;講kbdr中只與0,9比較以判斷是否是數字 ADDR2,R2,#1 ADDR2,R2,R1 BRnNOTNUM NOTR3,R3 ADDR3,R3,#1 ADDR3,R3,R1 BRpNOTNUM BRnzpISNUM ISNUM LEAR2,OUT1 ;是數字輸出相應的字串 ISNUM2 LDRR0,R2,#0 JSROUTPUT ADDR2,R2,#1 LEAR3,OUT2 NOTR3,R3 ADDR3,R3,#1 ADDR3,R3,R2 BRzDONE BRnpISNUM2 NOTNUM LEAR3,OUT2 ;不是數字,輸出相應的字串 NOTNUM2 LDRR0,R3,#0 JSROUTPUT ADDR3,R3,#1 LEAR2,KBDR NOTR2,R2 ADDR2,R2,#1 ADDR2,R2,R3 BRzDONE BRnpNOTNUM2 OUTPUT STR1,SAVER1 ;因為不能使用trap,採用的輸出方法 LOOP LDIR1,DSR BRzpLOOP STIR0,DDR LDR1,SAVER1 RET DONE LDR1,ENABLE ;結束 LDR2,KBSR STRR1,R2,#0 LDR0,SAVER0 LDR2,SAVER2 LDR3,SAVER3 LDR4,SAVER4 LDR5,SAVER5 LDR7,SAVER7 RTI OUT1 .STRINGZ"\nICS2017:It is a number.\n" OUT2 .STRINGZ"\nICS2017: ?????? What is this ??????\n" KBDR .FILLxFE02 KBSR .FILLxFE02 ENABLE .FILLx4000 DSR .FILLxFE04 DDR .FILLxFE06 NUM0 .FILL#48 NUM9 .FILL#57 SAVER0 .BLKW#1 SAVER1 .BLKW#1 SAVER2 .BLKW#1 SAVER3 .BLKW#1 SAVER4 .BLKW#1 SAVER5 .BLKW#1 SAVER7 .BLKW#1 .END

4.results

(1)測試

輸入1,結果如下

輸入k,結果如下

*以其他字元進行測試,輸出均與要求一致

(2)反思

1.每行延遲為計數2500,在實際操作中仍然過快,在本人實驗中,每輸出一個7個字元的字串delay等同時間,顯示效果較佳

2.上述輪流輸出的方式較為繁瑣,把每行設定成一個字串能使程式碼簡化

3.在實驗中PC,PSR的棧的入棧操作由模擬器本身進行,出棧由RTI執行,未能清楚得到乃至修改PSR的值的方法


相關推薦

lc3彙編實現I/O中斷

1.Purpose——To showhow interrupt-driven Input/Output can interrupt a program that is running,execute the interrupt service routine, and ret

lc3彙編實現排序——student ID

Purpose: There are 64 students. Each has a unique ID,which consists of two integer. Given ID1 = (a1, a2) and ID2 = (b1, b2), then Ifa1 >

學點KaldiKaldi的I/O機制

本篇給出了Kalid中輸入輸出機制的概覽。(主要參考Kaldi的Doc) Kaldi中類的輸入輸出介面 Kaldi中定義的類有一個通用的I/O介面。標準的介面如下: class SomeKaldiClass { public: void Read(std::istream

caffe原始碼的梳理之五caffe資料I/O模組——資料變換器Data_Transformer

資料變換器   caffe的資料變換器(DataTransformer)主要提供了對原始影象的預處理方法,包括隨機的切塊、隨機的映象、幅度縮放、去均值、灰度、色度變換等。 1、資料結構的描述 message TransformationPa

bzoj4276[ONTAK2015]Bajtman i Okr?g?y Robin 線段樹優化建圖+費用流

har brush while inf uil mes queue eof div 題目描述 有n個強盜,其中第i個強盜會在[a[i],a[i]+1],[a[i]+1,a[i]+2],...,[b[i]-1,b[i]]這麽多段長度為1時間中選出一個時間進行搶劫,並計劃搶走

opencvJava實現的opencv3.x版本後Highhui報錯

-a sun div fan let 版本 ava line 報錯 隨筆為博主原創,如需轉載,請註明出處。 opencv3.x以後Highgui不再使用,用Imgcodecs代替,引入import org.opencv.imgcodecs.Imgcode

前端javascript實現導航欄筋鬥雲效果特效

超時 out die ron 滑動 scrip mouseover none point 實現效果:   實現效果如下圖所示 實現原理: 什麽是筋鬥雲效果: 這個效果很簡單,就是鼠標移到其他導航目錄時會有背景圖片跟著鼠標滑動到當前的目錄。 實現思路: 鼠標經過的時候

前端javascript實現帶有子菜單和控件的輪播圖slider

style creat radius .get abs weight col 技術分享 city 實現效果: 實現原理: // 步驟 // 1. 獲取事件源以及相關元素 // 2. 復制第一張圖片所在的li,添加到ul的最後面 // 3. 給ol添加li,ul中的個數-

C#C#實現事務

identity title ini body pro 簡單例子 ear scalar 技術分享 1、創建事務的結構 SqlConnection sqlConnection = new SqlConnection(); ...初始化連

Android如何實現Android發送短信

ted param close ase find array 短信 red phone 第一種:調用系統短信接口直接發送短信;主要代碼如下: /** * 直接調用短信接口發短信 * @param phoneNumber * @

quickhybrid如何實現一個Hybrid框架

釘釘 都是 不足 快速 view 環境 視野 swe 開發 章節目錄 【quickhybrid】如何實現一個跨平臺Hybrid框架 【quick hybrid】架構一個Hybrid框架 【quick hybrid】H5和Native交互原理 【quick hybrid】J

模板deque實現單調隊列

getch info 常數 單調隊列 har nbsp lse esp gin 雙端隊列deque容器: 關於deque最常用的有這幾個函數: 都是成員函數 雙端隊列模板題:【洛谷】P2952 [USACO09OPEN]牛線Cow Line 1 #in

Nginx Nginx實現端口轉發

nbsp 都是 localhost ron tro ups server 搭建 div 什麽是端口轉發 當我們在服務器上搭建一個圖書以及一個電影的應用,其中圖書應用啟動了 8001 端口,電影應用啟動了 8002 端口。此時如果我們可以通過 localhost:80

貪心時空定位I

img display ide 選擇 vector ems 描述 code ++i 題目描述 張琪曼已經確定了李旭琳在一個長為20千米,寬為2千米的空間,她要在橫中心線上放置半徑為Ri的定位裝置,每個定位裝置的效果都會讓以它為中心的半徑為實數Ri(0<Ri<15

pymongo實現模糊查詢

python article 匹配 light net details regex 使用 模糊匹配 pymongo 模糊匹配查詢在mongo中這樣實現 {‘asr‘:/若琪/}    使用pymongo 兩種實現方式 1.import re

QtQLabel實現的圓形圖像

不同 地址 ide qpixmap wro mask 描述 qpainter col 本篇只描述圓形圖像的兩種實現方式,動態陰影邊框如下: 目前實現的效果如下: 左右兩邊實現的方式不同: 右邊比較簡單 min-width: 100px; m

tp5tp5實現空模塊、空控制器、空操作的頁面404跳轉

die img not row header 分享 exc exce app 1、這裏只講tp5(5.0.18)的空模塊跳轉,空控制器和空操作官網有。 來個正確的空模塊處理吧: 首先找到think\App.php,備份,然後修改: 找到【throw new HttpExc

java簡單實現數據庫連接池

zed cal lean jdbc stat eof LEDE import thread 一直在想java事務是怎麽實現的,在原聲jdbc的時候級別下,我們可以通過關掉autocommit 然後再手動commit。但是項目開發中基本上是看不見conection的。所以自己

mysql實現隨機獲取幾條數據的方法

sele log rom net nbsp tab article .net sql sql語句有幾種寫法 1:SELECT * FROM tablename ORDER BY RAND() LIMIT 想要獲取的數據條數; 2:SELECT *FROM `table`

How can I get firmware version of a Qlogic HBA card?

https://access.redhat.com/solutions/36776 How can I get firmware version of a Qlogic HBA card?  SOLUTION UNVERIFIED - 已更新 2017年八月25