名詞簡介
觸發器
觸發器是邊沿敏感的
存儲單元,數據存儲的動作有某一信號的上升或者下降沿進行同步的。
觸發器是在時鐘的沿進行數據的鎖存的,而鎖存器是用電平使能來鎖存數據的。所以觸發器的Q輸出端在每一個時鐘沿都會被更新,而
鎖存器只能在使能電平有效器件才會被更新。在FPGA設計中建議如果不是必須那么應該儘量使用觸發器而不是鎖存器。
暫存器
暫存器:在實際的數字系統中,通常把能夠用來存儲一組二進制代碼的同步時序邏輯電路稱為暫存器。由於觸發器內有記憶功能,因此利用觸發器可以方便地構成暫存器。由於一個觸發器能夠存儲一位二進制碼,所以把n個觸發器的時鐘連線埠連線起來就能構成一個存儲n位二進制碼的暫存器。
觸發器
觸發器,資料庫領域名詞。觸發器(trigger)是個特殊的存儲過程,它的執行不是由程式調用,也不是手工啟動,而是由個事件來觸發,比如當對一個表進行操作(insert,delete,update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。觸發器可以從DBA_TRIGGERS,USER_TRIGGERS數據字典中查到。觸發器可以查詢其他表,而且可以包含複雜的SQL語句。它們主要用於強制服從複雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。
觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關係。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用資料庫關係圖,則可以在表之間創建關係以自動創建外鍵約束。
創建觸發器的SQL語法
DELIMITER|
CREATETRIGGER``.``
ON
FOREACHROW
BEGIN
--dosomething
END|
觸發器的語言描述:
process
begin
waituntilclk’eventandclk=’1’;
q<=d;
endprocess;
所存器的語言描述:
process(en,d)
begin
ifen=’1’then
q<=d;
endif;
endprocess;
觸發器(flip-flop)VS暫存器(register)
觸發器:僅能存儲一位二進制信息。
暫存器:多個觸發器構成,存儲多位二進制信息。
觸發器:能夠存儲一位信號的基本單元電路稱為“觸發器”。
觸發器的優點
觸發器可通過資料庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制比用CHECK約束定義的約束更為複雜的約束。與CHECK約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的SELECT比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。觸發器也可以評估數據修改前後的表狀態,並根據其差異採取對策。一個表中的多個同類觸發器(INSERT、UPDATE或DELETE)允許採取多個不同的對策以回響同一個修改語句。
比較觸發器與約束
約束和觸發器在特殊情況下各有優勢。觸發器的主要好處在於它們可以包含使用Transact-SQL代碼的複雜處理邏輯。因此,觸發器可以支持約束的所有功能;但它在所給出的功能上並不總是最好的方法。實體完整性總應在最低級別上通過索引進行強制,這些索引或是PRIMARYKEY和UNIQUE約束的一部分,或是在約束之外獨立創建的。假設功能可以滿足應用程式的功能需求,域完整性應通過CHECK約束進行強制,而引用完整性(RI)則應通過FOREIGNKEY約束進行強制。在約束所支持的功能無法滿足應用程式的功能要求時,觸發器就極為有用。
例如:除非REFERENCES子句定義了級聯引用操作,否則FOREIGNKEY約束只能以與另一列中的值完全匹配的值來驗證列值。
CHECK約束只能根據邏輯表達式或同一表中的另一列來驗證列值。如果應用程式要求根據另一個表中的列驗證列值,則必須使用觸發器。
約束只能通過標準的系統錯誤信息傳遞錯誤信息。如果應用程式要求使用(或能從中獲益)自定義信息和較為複雜的錯誤處理,則必須使用觸發器。
觸發器可通過資料庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。
觸發器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。當更改外鍵且新值與主鍵不匹配時,此類觸發器就可能發生作用。例如,可以在titleauthor.title_id上創建一個插入觸發器,使它在新值與titles.title_id中的某個值不匹配時回滾一個插入。不過,通常使用FOREIGNKEY來達到這個目的。
如果觸發器表上存在約束,則在INSTEADOF觸發器執行後但在AFTER觸發器執行前檢查這些約束。如果約束破壞,則回滾INSTEADOF觸發器操作並且不執行AFTER觸發器。
觸發器到底可不可以在視圖上創建在SQLServer?在線上叢書中,是沒有說觸發器不能在視圖上創建的,並且在語法解釋中表明:
在CREATETRIGGER的ON之後可以是視圖。然而,事實似乎並不是如此,很多專家也說觸發器不能在視圖上創建。我也專門作了測試,的確如此,不管是普通視圖還是索引視圖,都無法在上面創建觸發器,真的是這樣嗎?請點擊詳細,但是無可厚非的是:當在臨時表或系統表上創建觸發器時會遭到拒絕。深刻理解FORCREATETRIGGER語句的FOR關鍵字之後可以跟INSERT、UPDATE、DELETE中的一個或多個,也就是說在其它情況下是不會觸發觸發器的,包括SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。相關內容一個有趣的套用我們看到許多註冊系統在註冊後都不能更改用戶名,但這多半是由應用程式決定的,如果直接打開資料庫表進行更改,同樣可以更改其用戶名,在觸發器中利用回滾就可以巧妙地實現無法更改用戶名……詳細內容觸發器內部語句出錯時……這種情況下,前面對數據更改操作將會無效。舉個例子,在表中插入數據時觸發觸發器,而觸發器內部此時發生了運行時錯誤,那么將返回一個錯誤值,並且拒絕剛才的數據插入。不能在觸發器中使用的語句觸發器中可以使用大多數T-SQL語句,但如下一些語句是不能在觸發器中使用的。
CREATE語句,如:CREATEDATABASE、CREATETABLE、CREATEINDEX等。
ALTER語句,如:ALTERDATABASE、ALTERTABLE、ALTERINDEX等。
DROP語句,如:DROPDATABASE、DROPTABLE、DROPINDEX等。
DISK語句,如:DISKINIT、DISKRESIZE。
LOAD語句,如:LOADDATABASE、LOADLOG。
RESTORE語句,如:RESTOREDATABASE、RESTORELOG。
RECONFIGURE
TRUNCATETABLE語句在sybase的觸發器中不可使用!
慎用觸發器觸發器功能強大,輕鬆可靠地實現許多複雜的功能,為什麼又要慎用呢。觸發器本身沒有過錯,但由於我們的濫用會造成資料庫及應用程式的維護困難。在資料庫操作中,我們可以通過關係、觸發器、存儲過程、應用程式等來實現數據操作……同時規則、約束、預設值也是保證數據完整性的重要保障。如果我們對觸發器過分的依賴,勢必影響資料庫的結構,同時增加了維護的複雜程式.
暫存器
暫存器定義
暫存器是中央處理器內的組成部份。暫存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和位址。在中央處理器的控制部件中,包含的暫存器有指令暫存器(IR)和程式計數器(PC)。在中央處理器的算術及邏輯部件中,包含的暫存器有累加器(ACC)。
暫存器是記憶體階層中的最頂端,也是系統獲得操作資料的最快速途徑。暫存器通常都是以他們可以保存的位元數量來估量,舉例來說,一個“8位元暫存器”或“32位元暫存器”。暫存器都以暫存器檔案的方式來實作,但是他們也可能使用單獨的正反器、高速的核心記憶體、薄膜記憶體以及在數種機器上的其他方式來實作出來。
暫存器通常都用來意指由一個指令之輸出或輸入可以直接索引到的暫存器群組。更適當的是稱他們為“架構暫存器”。例如,x86指令及定義八個32位元暫存器的集合,但一個實作x86指令集的CPU可以包含比八個更多的暫存器。暫存器是CPU內部的元件,暫存器擁有非常高的讀寫速度,所以在暫存器之間的數據傳送非常快。
暫存器用來存放數據的一些小型存儲區域,用來暫時存放參與運算的數據和
運算結果。其實
暫存器就是一種常用的
時序邏輯電路,但這種時序邏輯電路只包含存儲電路。暫存器的存儲電路是由鎖存器或觸發器構成的,因為一個鎖存器或觸發器能存儲1位二進制數,所以由N個鎖存器或觸發器可以構成N位暫存器。
暫存器用途
1.可將暫存器內的數據執行算術及邏輯運算;
2.存於暫存器內的地址可用來指向記憶體的某個位置,即定址;
3.可以用來讀寫數據到電腦的周邊設備。
數據暫存器
8086有14個16位暫存器,這14個暫存器按其用途可分為
(1)通用暫存器。
(2)指令指針。
(3)標誌暫存器。
(4)段暫存器。
(1)通用暫存器有8個,又可以分成2組,一組是數據暫存器(4個),另一組是指針暫存器及變址暫存器(4個).
數據暫存器分為:AH&AL=AX(accumulator):累加暫存器,常用於運算;在乘除等指令中指定用來存放運算元,另外,所有的I/O指令都使用這一暫存器與外界設備傳送數據。
BH&BL=BX(base):基址暫存器,常用於地址索引;
CH&CL=CX(count):計數暫存器,常用於計數;常用於保存計算值,如在移位指令,循環(loop)和串處理指令中用作隱含的計數器。
DH&DL=DX(data):數據暫存器,常用於數據傳遞。
他們的特點是,這4個16位的暫存器可以分為高8位:AH,BH,CH,DH.以及低八位:AL,BL,CL,DL。這2組8位暫存器可以分別定址,並單獨使用。
另一組是指針暫存器和變址暫存器,包括:
SP(StackPointer):堆疊指針,與SS配合使用,可指向堆疊位置;
BP(BasePointer):基址指針暫存器,可用作SS的一個相對基址位置;
SI(SourceIndex):源變址暫存器可用來存放相對於DS段之源變址指針;
DI(DestinationIndex):目的變址暫存器,可用來存放相對於ES段之目的變址指針。
這4個16位暫存器只能按16位進行存取操作,主要用來形成運算元的地址,用於堆疊操作和變址運算中計算運算元的有效地址。
(2)指令指針IP(InstructionPointer)
指令指針IP是一個16位專用暫存器,它指向當前需要取出的指令位元組,當BIU從記憶體中取出一個指令位元組後,IP就自動加1,指向下一個指令位元組。注意,IP指向的是指令地址的段內地址偏移量,又稱偏移地址(OffsetAddress)或有效地址(EA,EffectiveAddress)。
(3)標誌暫存器FR(FlagRegister)
8086有一個18位的標誌暫存器FR,在FR中有意義的有9位,其中6位是狀態位,3位是控制位。
OF:溢出標誌位OF用於反映有符號數加減運算所得結果是否溢出。如果運算結果超過當前運算位數所能表示的範圍,則稱為溢出,OF的值被置為1,否則,OF的值被清為0。
DF:方向標誌DF位用來決定在串操作指令執行時有關指針暫存器發生調整的方向。
IF:中斷允許標誌IF位用來決定CPU是否回響
CPU外部的可禁止中斷髮出的中斷請求。但不管該標誌為何值,CPU都必須回響CPU外部的不可禁止中斷所發出的中斷請求,以及CPU內部產生的中斷請求。具體規定如下:
(1)、當IF=1時,CPU可以回響CPU外部的可禁止中斷髮出的中斷請求;
(2)、當IF=0時,CPU不回響CPU外部的可禁止中斷髮出的中斷請求。
TF:跟蹤標誌TF。該標誌可用於程式調試。TF標誌沒有專門的指令來設定或清楚。
(1)如果TF=1,則CPU處於單步執行指令的工作方式,此時每執行完一條指令,就顯示CPU內各個暫存器的當前值及CPU將要執行的下一條指令。
(2)如果TF=0,則處於連續工作模式。
SF:符號標誌SF用來反映運算結果的符號位,它與運算結果的最高位相同。在微機系統中,有符號數採用補碼錶示法,所以,SF也就反映運算結果的正負號。運算結果為正數時,SF的值為0,否則其值為1。
ZF:零標誌ZF用來反映運算結果是否為0。如果運算結果為0,則其值為1,否則其值為0。在判斷運算結果是否為0時,可使用此標誌位。
AF:下列情況下,輔助進位標誌AF的值被置為1,否則其值為0:
(1)、在字操作時,發生低位元組向高位元組進位或借位時;
(2)、在位元組操作時,發生低4位向高4位進位或借位時。
PF:奇偶標誌PF用於反映運算結果中“1”的個數的奇偶性。如果“1”的個數為偶數,則PF的值為1,否則其值為0。
CF:進位標誌CF主要用來反映運算是否產生進位或借位。如果運算結果的最高位產生了一個進位或借位,那么,其值為1,否則其值為0。)
為了運用所有的記憶體空間,8086設定了四個段暫存器,專門用來保存段地址:
CS(CodeSegment):代碼段暫存器;
DS(DataSegment):數據段暫存器;
SS(StackSegment):堆疊段暫存器;
ES(ExtraSegment):附加段暫存器。
當一個程式要執行時,就要決定程式代碼、數據和堆疊各要用到記憶體的哪些位置,通過設定段暫存器CS,DS,SS來指向這些起始位置。通常是將DS固定,而根據需要修改CS。所以,程式可以在可定址空間小於64K的情況下被寫成任意大小。所以,程式和其數據組合起來的大小,限制在DS所指的64K內,這就是COM檔案不得大於64K的原因。8086以記憶體做為戰場,用暫存器做為軍事基地,以加速工作。
以上是8086暫存器的整體概況,自80386開始,PC進入32bit時代,其定址方式,暫存器大小,功能等都發生了變化。
以下是80386的暫存器的一些資料:
暫存器都是32-bits寬。
通用暫存器
下面介紹通用暫存器及其習慣用法。顧名思義,通用暫存器是那些你可以根據自己的意願使用的暫存器,修改他們的值通常不會對計算機的運行造成很大的影響。通用暫存器最多的用途是計算。
EAX:通用暫存器。相對其他暫存器,在進行運算方面比較常用。在保護模式中,也可以作為記憶體偏移指針(此時,DS作為段暫存器或選擇器)
EBX:通用暫存器。通常作為記憶體偏移指針使用(相對於EAX、ECX、EDX),DS是默認的段暫存器或選擇器。在保護模式中,同樣可以起這個作用。
ECX:通用暫存器。通常用於特定指令的計數。在保護模式中,也可以作為記憶體偏移指針(此時,DS作為暫存器或段選擇器)。
EDX:通用暫存器。在某些運算中作為
EAX的溢出暫存器(例如乘、除)。在保護模式中,也可以作為記憶體偏移指針(此時,DS作為段暫存器或選擇器)。
同AX分為AH&AL一樣,上述暫存器包括對應的16-bit分組和8-bit分組。
用作記憶體指針的特殊暫存器
ESI:通常在記憶體操作指令中作為“源地址指針”使用。當然,ESI可以被裝入任意的數值,但通常沒有人把它當作通用暫存器來用。DS是默認段暫存器或選擇器。
EDI:通常在記憶體操作指令中作為“目的地址指針”使用。當然,EDI也可以被裝入任意的數值,但通常沒有人把它當作通用暫存器來用。DS是默認段暫存器或選擇器。
EBP:這也是一個作為指針的暫存器。通常,它被高級語言編譯器用以建造‘堆疊幀'來保存函式或過程的局部變數,不過,還是那句話,你可以在其中保存你希望的任何數據。SS是它的默認段暫存器或選擇器。
注意,這三個暫存器沒有對應的8-bit分組。換言之,你可以通過SI、DI、BP作為別名訪問他們的低16位,卻沒有辦法直接訪問他們的低8位。