端口01 - 零基础入门学习汇编语言67
第十四章:端口01
?讓編程改變世界
Change the world by program
?
引言
CPU可以直接讀寫3 個(gè)地方的數(shù)據(jù)
(1)CPU 內(nèi)部的寄存器; (2)內(nèi)存單元; (3)端口。 這一章,我們討論端口的讀寫。 ?端口的讀寫
? 對(duì)端口的讀寫不能用mov、push、pop等內(nèi)存讀寫指令。 端口的讀寫指令只有兩條:in 和 out分別用于從端口讀取數(shù)據(jù)和往端口寫入數(shù)據(jù)。 ?我們看一下CPU 執(zhí)行內(nèi)存訪問指令和端口訪問指令時(shí)候,總線上的信息:
(1)訪問內(nèi)存 (2)訪問端口 ?訪問內(nèi)存
? mov ax,ds:[8] ? ? ;假設(shè)執(zhí)行前 (ds)=0執(zhí)行時(shí),與總線相關(guān)的操作:
CPU通過地址線將地址信息8發(fā)出;
CPU通過控制線發(fā)出內(nèi)存讀命令,選中存儲(chǔ)器芯片,并通知它,將要從中讀取數(shù)據(jù);
存儲(chǔ)器將 8號(hào)單元中的數(shù)據(jù)通過數(shù)據(jù)線送入CPU。
?訪問端口
? in al,60h ? ? ?;從60h號(hào)端口讀入一個(gè)字節(jié)執(zhí)行時(shí)與總線相關(guān)的操作:
CPU通過地址線將地址信息60h發(fā)出;
CPU通過控制線發(fā)出端口讀命令,選中端口所在的芯片,并通知它,將要從中讀取數(shù)據(jù);
端口所在的芯片將60h端口中的數(shù)據(jù)通過數(shù)據(jù)線送入CPU。
?端口的讀寫
?動(dòng)畫片時(shí)間(具體內(nèi)容請(qǐng)看視頻中詳解)
[kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/14_端口讀寫.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] [/kml_flashembed] 注意:在in和out 指令中,只能使用 ax 或al 來存放從端口中讀入的數(shù)據(jù)或要發(fā)送到端口中的數(shù)據(jù)。訪問8 位端口時(shí)用 al ,訪問16 位端口時(shí)用ax 。 ?對(duì)0~255以內(nèi)的端口進(jìn)行讀寫:
in al,20h ;從20h端口讀入一個(gè)字節(jié)
out 20h,al ;往20h端口寫入一個(gè)字節(jié)
?對(duì)256~65535的端口進(jìn)行讀寫時(shí),端口號(hào)放在dx中:
mov dx,3f8h ;將端口號(hào)3f8送入dx
in al,dx ;從3f8h端口讀入一個(gè)字節(jié)
out dx,al ;向3f8h端口寫入一個(gè)字節(jié)
? ?CMOS RAM 芯片
?PC機(jī)中有一個(gè)CMOS RAM芯片,其有如下特征:
(1)包含一個(gè)實(shí)時(shí)鐘和一個(gè)有128個(gè)存儲(chǔ)單元的RAM存儲(chǔ)器。(早期的計(jì)算機(jī)為64個(gè)字節(jié)) (2)該芯片靠電池供電。因此,關(guān)機(jī)后其內(nèi)部的實(shí)時(shí)鐘仍可正常工作, RAM 中的信息不丟失。 (3)128 個(gè)字節(jié)的 RAM 中,內(nèi)部實(shí)時(shí)鐘占用 0~0dh單元來保存時(shí)間信息,其余大部分分單元用于保存系統(tǒng)配置信息,供系統(tǒng)啟動(dòng)時(shí)BIOS程序讀取。BIOS也提供了相關(guān)的程序,使我們可以在開機(jī)的時(shí)候配置CMOS RAM 中的系統(tǒng)信息。 (4)該芯片內(nèi)部有兩個(gè)端口,端口地址為70h和71h。CPU 通過這兩個(gè)端口讀寫CMOS RAM。 (5)70h為地址端口,存放要訪問的CMOS RAM單元的地址;71h為數(shù)據(jù)端口,存放從選定的CMOS RAM 單元中讀取的數(shù)據(jù),或要寫入到其中的數(shù)據(jù)。 ? 可見,CPU對(duì)CMOS RAM的讀寫分兩步進(jìn)行。 ?比如:讀CMOS RAM的2號(hào)單元:
1、將2送入端口70h
2、從71h讀出2號(hào)單元的內(nèi)容
?檢測(cè)點(diǎn)14.1
?shl指令和shr指令
shl指令和shr指令是邏輯移位指令,后面的課程中我們要用到移位指令,這里進(jìn)行一下講解。 ?shl邏輯左移指令
功能為:(1)將一個(gè)寄存器或內(nèi)存單元中的數(shù)據(jù)向左移位;
(2)將最后移出的一位寫入CF中;
(3)最低位用0補(bǔ)充。
? 例如有如下指令:mov al,01001000b
shl al,1 ? ? ?;將al中的數(shù)據(jù)左移一位
執(zhí)行后 (al)=10010000b,CF=0。 ? 如果移動(dòng)位數(shù)大于1時(shí),必須將移動(dòng)位數(shù)放在cl中。 比如,指令:mov al,01010001b
mov cl,3
shl al,cl
? 執(zhí)行后(al)=10001000b,那請(qǐng)問,CF的值是多少捏? 因?yàn)樽詈笠瞥鲆晃皇?,所以CF=0。 ? 可以看出,將X邏輯左移一位,相當(dāng)于執(zhí)行X=X*2。 [caption id="attachment_409" align="aligncenter" width="300"] 邏輯左移[/caption] ?shr邏輯右移指令,它和shl所進(jìn)行的操作剛好相反:
將一個(gè)寄存器或內(nèi)存單元中的數(shù)據(jù)向右移位;
將最后移出的一位寫入CF中;
最高位用0補(bǔ)充。
? 可以看出,將X邏輯右移一位,相當(dāng)于執(zhí)行X=X/2。 [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/14_shl指令.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] [/kml_flashembed] ?檢測(cè)點(diǎn)14.2
[buy]?獲得所有教學(xué)視頻、課件、源代碼等資源打包?[/buy] [Downlink href='http://kuai.xunlei.com/d/LEOOTFIPBURI']視頻下載[/Downlink]轉(zhuǎn)載于:https://www.cnblogs.com/LoveFishC/archive/2011/05/06/3847066.html
總結(jié)
以上是生活随笔為你收集整理的端口01 - 零基础入门学习汇编语言67的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个性签名坚强面对所有
- 下一篇: 程序员的周末:纯野的一天