La primera cosa que es probable que el disparo hasta que la lista es el apoyo del compilador D de códigos de operación no incluye outb
, según lo especificado por la función C que ya ha proporcionado. Después de algunas excavaciones, descubrí que outb
es un nombre más específico para el código de operación general out
. outb
indica que el primer argumento del código de operación estará en un registro de bytes (en oposición a outw
y outl
, que indican un primer tamaño de argumento de, respectivamente, una palabra y una palabra doble), sin embargo, el compilador D usa el código de operación out
para todas las operaciones, y determina qué código de operación específico escribir en función del tamaño del argumento que especifique.
Con eso fuera del camino, lo siguiente que hay que hacer es convertir la sintaxis GCC en sintaxis D. De acuerdo con el CCG-inline-Asamblea-COMO, el código que ya ha proporcionado utiliza la sintaxis de montaje extendido:
asm (assembler template
: output operands /* optional */
: input operands /* optional */
: list of clobbered registers /* optional */
);
En cuanto a su plantilla, la función especifica una instrucción de montaje (outb
) con dos argumentos, el primero es una byte (%b0
) y el segundo es una palabra o entero corto (%w0
).
El truco sobre la lista de argumentos de entrada es la cadena que prefija cada uno de los parámetros de su función. Estos, según el CÓMO, se llaman restricciones. Básicamente, son reglas que GCC debe seguir al usar los parámetros como argumentos para las instrucciones de ensamblaje proporcionadas.La restricción "a"
aplicada al parámetro value
indica que el contenido de la variable debe colocarse en el registro eax
, ax
o al
según el tamaño de la variable. La restricción en la variable port
, "Nd"
, indica primero que el valor está en el rango de 0-255, y segundo, que el valor debe colocarse ya sea en el registro edx
, dx
o dl
, de nuevo, según el tamaño del variable.
El compilador D no ofrece tanta ayuda con variables en bloques de ensamblaje como lo hace GCC; en el ensamblador en línea de D's, deberá mover los valores de los parámetros específicamente en los registros correspondientes. Para outb
, estos registros son dx
y al
. Siguiente sintaxis de ensamblador en línea D's, puede mover las variables y llamar al código de operación out
de la siguiente manera:
asm
{
MOV AL, value;
MOV DX, port;
OUT DX, AL;
}
Tenga en cuenta que, debido a GCC utiliza la sintaxis de ensamblador AT & T y D utiliza la sintaxis de ensamblador Intel, el orden de los argumentos proporcionados a OUT
se invierten.