[英]8086 assembly related troubles
這可能是非常基本的,但我無法理解它。
我正在使用8255的A和B端口輸入一個字。 我有類似的東西:
PORT_A EQU 0008h // inputs low byte
PORT_B EQU 000Ah // inputs high byte
稍后在代碼段中,我有一個部分執行此操作:
MOV DX, PORT_B
IN AL, DX
MOV AH, AL
MOV DX, PORT_A
IN AL, DX
MOV DX, AX
我在這里有幾個問題。 MOV DX, PORT_B
有效地做了什么? 它是否在DX中存儲PORT_B的地址? 為什么它在AL中輸入B的高字節,然后將AL移到AH,而不是簡單地將其寫為IN AH, DX
?
對於端口A和B的地址,“0008h”和“000Ah”的明智選擇是什么? 我以前只使用8085組裝,如果之前我選擇了0008h(0000 0000 0000 1000b),那么我就不會選擇000A(0000 0000 0000 1010b),因為A3位重疊(例如,I' d選擇0001h(... 0001b)和0002h(.... 0010b),以便沒有位重疊)。
我正在使用8255的A和B端口輸入一個字
然后,您將從8255的A端口獲取該字的低字節,並從8255的B端口獲取該字的高字節。
要從任何端口獲取任何內容,我們首先在DX
寄存器中移動I / O端口的地址。 然后我們使用in
指令實際獲取內容。 這可以是:
in al, dx
使用時in al, dx
一個字節 in ax, dx
使用的一個詞 in eax, dx
使用dword時 這些是一個唯一可能的目的地in
從I / O端口。 ( AH
不是一個選項!)
wallyk做了很好的評論你提供的代碼。 所以我想你明白為什么以及如何。
我想補充的是這個代碼可以優化。
PORT_A EQU 0008h // inputs low byte PORT_B EQU 000Ah // inputs high byte
鑒於上述端口地址,有一種更直接的方法來完成閱讀該單詞的任務。 對於適合單個字節的I / O地址,從0000h到00FFh,根本不需要使用DX
寄存器。 可以在in
指令本身中指定這些端口地址。
這提供了相當小的代碼大小:
IN AL, PORT_B ; Fetch high byte from port B
MOV DH, AL ; Becomes high byte of end result in DX
IN AL, PORT_A ; Fetch low byte from port A
MOV DL, AL ; Becomes low byte of end result in DX
還有1個字節的短版本( 8086編程只是喜歡空間保護)是:
IN AL, PORT_B ; Fetch high byte from port B
MOV AH, AL ; Store in AH for now
IN AL, PORT_A ; Fetch low byte from port A
XCHG DX, AX ; Transfer AX to end result in DX
缺少的評論將是這樣的
MOV DX, PORT_B ; set up address of port B
IN AL, DX ; read high byte from port B
MOV AH, AL ; save result from port B as most significant byte
MOV DX, PORT_A ; set up address of port A
IN AL, DX ; read low byte from port A
MOV DX, AX ; DX = 16 bit result
為什么它在AL中輸入B的高字節,然后將AL移到AH,而不是簡單地將其寫為IN AH,DX?
因為唯一的指令選擇是
in al, dx ; read 8 bits
in ax, dx ; read 16 bits
in eax, dx ; (32 bit mode only, i.e. 80386+) read 32 bits
in ah, dx
沒有in ah, dx
。 x86指令集看起來正交,但充滿了半驚人的限制和限制。
MOV DX PORT_B將常數(EQU創建一個常數)PORT_B的值移入16位寄存器DX。 因此,AX獲得的值為000Ah(基數為10)。 IN在低位字節上完成,因為000Ah足夠小以適合AX的8位部分。 AH獲得AL的值,以便在將PORT_A放入AL時保留PORT_B的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.