When I write IN AL,80H ,how is 80H treated as an address?
Shouldn't it be IN AL,[80H] ?
(Aprendí que para especificar una dirección, se utilizan corchetes).
When I write IN AL,80H ,how is 80H treated as an address?
Shouldn't it be IN AL,[80H] ?
(Aprendí que para especificar una dirección, se utilizan corchetes).
Tiene razón, es inconsistente que el conjunto de instrucciones no use paréntesis alrededor del número de puerto para indicar el direccionamiento indirecto que se está utilizando (es decir, que su 80h es la dirección de algo, no el valor para usar directamente).
No dices para qué microprocesador es esta instrucción IN. Me imagino que es 8086.
El Zilog Z80 es consistente en el uso de corchetes alrededor de los números de puertos IN / OUT. La instrucción equivalente para ello sería IN A,(80h)
.
Para todos los propósitos, los puertos de E / S x86 son solo números. Realmente no se comportan como direcciones, no pueden usarse para almacenar datos y no admiten la mayoría de los modos de direccionamiento. (Puede hacer referencia a un puerto de E / S mediante un registro, pero solo si ese registro es al
, ax
o eax
.)
De hecho, hay diferentes ensambladores que requieren una sintaxis diferente para las instrucciones IN
y OUT
en las CPU x86.
Linux y Solaris (versiones x86) son sistemas operativos bastante similares. Ambos sistemas operativos se envían con un ensamblador. En ambos casos, el ensamblador incluido con el sistema operativo utiliza una sintaxis que es un poco diferente a la norma de Intel:
Linux / Solaris Intel standard
--------------- --------------
mov (0x80), %al mov al, [80h]
mov $0x80, %al mov al, 80h
mov (%si), %ax mov ax, [si]
mov %si, %ax mov ax, si
Sin embargo, las instrucciones in
y out
difieren entre los ensambladores:
Linux Solaris Intel standard
----- ------- --------------
in $0x80, %al in (0x80), %al in al, 80h
in %dx, %al in (%dx), %al in al, dx
out %al, $0x80 out %al, (0x80) out 80h, al
out %al, %dx out %al, (%dx) out dx, al
Si deja de lado los paréntesis, recibirá un mensaje de error al usar el ensamblador de Solaris; use los corchetes y recibirá un mensaje de error al usar el (antiguo) ensamblador de Linux.
El código binario creado por los ensambladores es exactamente el mismo, por supuesto, los ensambladores generan código para las CPU de 80x86.
Al comparar la sintaxis de las instrucciones in
y out
con la sintaxis de la instrucción mov
, puedes ver que los desarrolladores del sistema operativo Solaris obviamente pensaban como tú:
Un puerto es una dirección, por lo que el número de puerto debe escribirse entre paréntesis.
Los desarrolladores del ensamblador GNU (incluido con Linux), así como los desarrolladores de Intel pensaban de manera diferente:
Un puerto es algo especial (y no una dirección) por lo que el número de puerto no se pone entre paréntesis.
La respuesta directa a tu pregunta
Depende del ensamblador que uses si tienes que escribir "80h" o "[80h]". Los ensambladores que usan el estándar Intel usan "80h" sin corchetes.
Lea otras preguntas en las etiquetas microprocessor