In和Out
OUT 0FAH,AL(它是指從AL中輸出一個字節到0FAH的一個端口嗎?)
OUT DX,AL
OUT 0FAH,AX(AX是一個字為什么也能輸出到0FAH所指的8位端口中呢?)
OUT 03F8H,AL(這個指令有錯誤為什么?)
這是因為在OUT指令中直接用數字尋址,端口號只能是0到FFH,而上面這條指令應改為
MOV DX 03F8H ;只能放在DX,這是規定。
OUT DX,AL
-----------------------------------------
OUT 0FAH,AL(它是指從AL中輸出一個字節到0FAH的一個端口嗎?)
是的
---------------------------------------
OUT 0FAH,AX(AX是一個字為什么也能輸出到0FAH所指的8位端口中呢?)
這條指令將AL中的數據放在0FAH,將AH中的數據放在0FBH。
這四條指令主要就是說明這個OUT指令的不同用法,學這些指令不用硬記每條指令的各種用法,只要根據規定的尋址方式。
IN(Input) 輸入
OUT(Output) 輸出
這組指令只限於使用累加器AX或AL傳送信息.
IN 輸入指令長格式為: IN AL,PORT(字節)
IN AX,PORT(字)
執行的操作: (AL)<-(PORT)(字節)
(AX)<-(PORT+1,PORT)(字)
短格式為: IN AL,DX(字節)
IN AX,DX(字)
執行的操作: AL<-((DX))(字節)
AX<-((DX)+1,DX)(字).
OUT 輸出指令長格式為: OUT PORT,AL(字節)
OUT PORT,AX(字)
執行的操作: (PORT)<-(AL)(字節)
(PORT+1,PORT)<-(AX)(字)
短格式為: OUT DX,AL(字節)
OUT DX,AX(字)
執行的操作: ((DX))<-(AL)(字節)
((DX)+1,(DX))<-AX(字)
在IBM-PC機里,外部設備最多可有65536個I/O端口,端口(即外設的端口地址)為0000~FFFFH.其中前256個端口(0~FFH)可以直接在指令中指定,這就是長格式中的PORT,此時機器指令用二個字節表示,第二個字節就是端口號.所以用長格式時可以在指定中直接指定端口號,但只限於前256個端口.當端口號>=256時,只能使用短格式,此時,必須先把端口號放到DX寄存器中(端口號可以從0000到0FFFFH),然后再用IN或OUT指令來傳送信息.
IN,OUT端口讀寫指令
端口是主機與外設進行數據交換的。(外設接口電路有專用於數據交互的寄存器。為了與CPU中的寄存器相區別,稱之為端口)。端口有數據端口,狀態端口和控制端口3種。
PC機給予每一個端口分配了一個地址(稱為端口號),形成一個獨立於內存空間的I/O地址空間。在8086/8088中,端口地址的范圍是0000至FFFF。
CPU對外設的操作通過專門的端口讀寫指令來完成。讀端口用IN指令,寫端口用OUT指令。
IN ACC,PORT;從端口PORT讀取數據到ACC;
PORT可以是立即數,也可以是DX。
ACC為AL時,從PORT讀取1字節數據到AL
ACC為AX時,從PORT讀取2字節數據到AX
OUT PORT,ACC;將ACC的數據寫入端口PORT;
例子:
IN AL,21H;表示從21H端口讀取一字節數據到AL
IN AX,21H;表示從端口地址21H讀取1字節數據到AL,從端口地址22H讀取1字節到AH
MOV DX,379H
IN AL,DX;從端口379H讀取1字節到AL
OUT 21H,AL;將AL的值寫入21H端口
OUT 21H,AX;將AX的值寫入端口地址21H開始的連續兩個字節。(port[21H]=AL,port[22h]=AH)
MOV DX,378H
OUT DX,AX;將AH和AL分別寫入端口379H和378H