簡體   English   中英

8086裝配相關的麻煩

[英]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個字節的短版本( 編程只是喜歡空間保護)是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM