介面晶元和埠 在pc系統的介面卡和主機板上,裝有各種介面晶元.介面晶元內部有若干暫存器,cpu將這些暫存器當做埠來訪問
cpu只能通過埠來對外設進行讀寫和控制,而外設也是通過埠來和cpu保持聯絡.
在pc系統中,cpu最多可以定位64k個不同的埠,範圍為0 ~ 65535
埠讀寫指令 只能用 ax 或 al 來存放從埠中讀入或傳送到埠的資料
訪問8位埠(0 ~ 255)時用al,訪問16位埠(256 ~ 65535)時用ax
in 讀取 in al,00h in ax,ffffh in al,dx
out 寫入 out ffh,al out ffffh,ax out dx,al
cmos ram 晶元
包含乙個實時時鐘和乙個有128個儲存單元的ram儲存器,靠電池供電.
時鐘占用 0 ~ 0dh 單元,其餘大部分儲存系統配置資訊,啟動時供bios讀取.
有兩個埠 70h 位址埠,存放要訪問的單元位址; 71h 資料埠,存放從選定單元中讀取的資料,或要寫入的資料
例: mov al,2
out 70h,al ;將2送入埠70h,表示讓71h存放好2號單元的內容
in al,71h ;讀出2號單元的內容
out 71h,al ;向2號單元寫入2
cmos ram中的時間資訊
存放單元(每個首席資訊官度為1位元組): 秒:0 分:2 時:4 日:7 月:8 年:9
存放方式:bcd碼 十進位製碼: 0 1 2 3 4 5 6 7 8 9
對應的bcd碼:0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
比如:數值26,表示為0010 0110 (高4位表示十位,低4位表示個位)
記憶體單元位數是從右到左的(76543210)
shl 邏輯左移指令 (如果位移數大於1,必須存放在cl中,如 shl al,cl)
1.將乙個暫存器或記憶體單元中的資料向左移位
2.將最後移出的一位寫入cf中
3.最低位用 0 補充
x邏輯左移一位,相當於執行 x = x*2
如: 00000001 = 1
00000010 = 2
00000100 = 4
左移1位相當於乘以[2^1]2,左移2位相當於乘以[2^2]4,左移3位相當於乘以[2^3]8,以此類推
x邏輯右移一位,相當於執行 x = x/2
shr 邏輯右移指令 和shl移動相反,操作步驟一樣 (如果位移數大於1,必須存放在cl中)
1.將乙個暫存器或記憶體單元中的資料向右移位
2.將最後移出的一位寫入cf中
3.最高位用 0 補充
拆分8位資料中的兩個bcd碼
mov ah,al ;假設al中為讀出的8位bcd碼
mov cl,4
shr ah,cl ;ah右移4位,便移除了個位的bcd碼
and al,00001111b ;al保留下來的便是個位bcd碼
i/o (input/output,輸入/輸出)
外中斷資訊
外設的輸入到達,相關晶元將向cpu發出相應的中斷資訊,cpu執行完當前指令後,引發中斷過程.
外中斷源
1.可遮蔽中斷 是cpu可以不響應的外中斷,是否響應該終端,取決於標誌暫存器if位的設定.
2.不可遮蔽中斷 是cpu必須響應的外中斷,中斷型別碼固定為 2 ,所以不需要取中斷型別碼,過程如下:
(1)標誌暫存器入棧,if=0,tf=0
(2)cs和ip入棧
(3)(ip)=(2*4),(cs)=(2*4+2)
幾乎所有由外設引發的外中斷,都是可遮蔽中斷.
第9位if 中斷標誌,如果if=1,則cpu在執行完當前指令後響應可遮蔽中斷,如果if=0,則不響應.
sti 用於設定if=1
cli 用於設定if=0
鍵盤輸入過程
1.鍵盤輸入
鍵盤上每個鍵相當於乙個開關,鍵盤中有乙個晶元對每個鍵的開關狀態進行掃瞄,按下鍵位晶元就產生乙個掃瞄碼,然後送入主機板上的相關介面晶元的暫存器,該暫存器的埠位址為60h
鬆開鍵位時,也產生乙個掃瞄碼,同樣也被送入60h埠中
掃瞄碼長度為乙個位元組 斷碼 = 通碼 + 80h
按下乙個鍵時產生的掃瞄碼 稱為 通碼 (第7位為0)
鬆開乙個鍵時產生的掃瞄碼 稱為 斷碼 (第7位為1)
2.引發9號中斷
鍵盤的輸入到達60h埠時,相關晶元會發出中斷型別碼為9的可遮蔽中斷資訊.cpu檢測到後,判斷if標誌位,決定是否引發中斷過程
3.執行 int 9 中斷例程 (bios提供了該例程)
(1)讀出60h埠中的掃瞄碼
(2)如果是字元鍵的掃瞄碼,將該掃瞄碼和它所對應的字元碼(即ascii碼)送入記憶體中的bios鍵盤緩衝區;
如果是控制鍵(如ctrl)和切換鍵(如capslock)的掃瞄碼,則將其轉變為狀態位元組(用二進位制位記錄控制鍵和切換鍵狀態的位元組)寫入記憶體中儲存狀態位元組的單元
bios鍵盤緩衝區 系統啟動後bios用於存放int 9中斷例程所接收的鍵盤輸入的記憶體區,可儲存15個鍵盤輸入.
int 9中斷例程除了接收掃瞄碼,還要產生與掃瞄碼對應的字元,所以乙個鍵盤輸入佔位2個記憶體單元,高位位元組存放掃瞄碼,低位位元組存放字元碼(ascii).如: 1e61h 緩衝區中a的掃瞄碼,儲存狀態為61 1e
0040:17 單元儲存鍵盤狀態位元組.記錄資訊如下:(二進位制)
0位: 右shift狀態,置1表示按下右shift鍵
1位: 左shift狀態,置1表示按下左shift鍵
2位: ctrl狀態,置1表示按下ctrl鍵
3位: alt狀態,置1表示按下alt鍵
4位: scrolllock狀態,置1表示scroll指示燈亮
5位: numlock狀態,置1表示小鍵盤輸入的是數字
6位: capslock狀態,置1表示輸入大寫字母
7位: insert狀態,置1表示處於刪除狀態
模擬int指令的呼叫功能,呼叫的入口位址在ds:0 ds:2中
pushf ;標誌暫存器入棧
pushf
pop ax
and ah,11111100b
push ax
popf ;if=0 tf=0
call dword ptr ds:[0] ;cs ip入棧:(ip)=((ds)*16+0),(cs)=((ds)*16+2)
xchg 交換字或位元組.( 至少有乙個運算元為暫存器,段暫存器不可作為運算元)
not 指令 不影響標誌暫存器的相關標誌位
資料標號(描述了單元長度的標號)
可以使用在其他段中(帶有":"的位址標號,只能在當前帶**段中使用)
不但表示記憶體單元的位址,還表示了記憶體單元的長度,
即此標號處以後的單元是位元組單元,還是字單元,或者是雙字單元
注:想在**段中直接用資料標號,則需用偽指令assume將標號所在的段和乙個段暫存器聯絡起來
assume cs:code ds:data等等,
假如資料標號在data段中,程式中則要給ds賦值段位址(mov ax,data mov ds,ax)
資料標號0 dw 資料標號1,資料標號2 ;資料標號0處儲存著 1 和 2 的偏移位址
相當於 資料標號0 dw offset 資料標號1,offset 資料標號2
資料標號0 dd 資料標號1,資料標號2 ;資料標號0處儲存著 1 和 2 的偏移位址和段位址
相當於 資料標號0 dw offset 資料標號1,seg 資料標號1,offset 資料標號2,seg 資料標號2
seg 操作符,取得某一標號的段位址
直接定址表 一種程式設計技巧,利用表在兩個資料集合之間建立一種對映關係,使可以用查表的方法根據給出的資料得到其在另一集合中的對應資料
int 16h 0號子程式
(1)檢測鍵盤緩衝區中是否有資料;
(2)沒有則繼續做第一步;
(3)讀取緩衝區第乙個字單元中的鍵盤輸入;
(4)將讀取的掃瞄碼送入ah, ascii碼送入al;
(5)將已讀取的鍵盤輸入從緩衝區中刪除.
彙編學習 第二章
書上的內容 頁數 雖然比第一章多,但是如果第一章理解完全後,第二章其實就是對第一章部分內容的深入操作。這一篇主要就把一些操作總結一下。第二章主要就是從8086cpu的角度,去看一下,cpu如何玩弄記憶體 暫存器就是這一章的主角,cpu和記憶體互動時,需要臨時儲存各種資料或者指令 都是1和0 這些資料...
彙編學習第二章
進入彙編第二章的學習,我們逐漸地開始認識這些位於計算機操作底部的硬體和資料。一 通用暫存器 通過對第一章的學習,我們了解到了暫存器的作用是進行資訊儲存。而對乙個彙編程式設計師來說,cpu中的主要部件,暫存器是cpu中程式設計師可以用指令讀寫的部件。在8086cpu中,通用暫存器為ax,bx,cx,d...
python 學習雜記
一 模組匯入問題 如果在機器上安裝了多個版本的python,往往會有匯入錯誤,例如一般的python程式頭都寫的是 usr bin env python 這個實際是 usr bin python 但是如果新版本的python是後安裝的,且沒有 prifex usr 可能這個鏈結仍指向老版本pytho...