code c inline-assembly assembly

code - ¿Hay alguna manera de insertar el código de ensamblaje en C?



inline assembly code in c (4)

En GCC, hay más que eso. En la instrucción, tienes que decirle al compilador qué cambió, para que su optimizador no se estropee. No soy un experto, pero a veces se ve así:

asm ("lock; xaddl %0,%2" : "=r" (result) : "0" (1), "m" (*atom) : "memory");

Es una buena idea escribir algún código de muestra en C, luego pedirle a GCC que produzca una lista de ensamblaje y luego modificar ese código.

Recuerdo que en el día con el viejo compilador de DOS de Borland podías hacer algo como esto:

asm { mov ax,ex etc etc... }

¿Hay una forma independiente de semiplataforma para hacer esto ahora? Necesito hacer una llamada al BIOS, por lo que si hubiera una forma de hacerlo sin el código asm, eso me sería igualmente útil.


Los compiladores de Microsoft no x86 no son compatibles con el ensamblaje en línea. Debe definir la función completa en un archivo fuente de ensamblaje separado y pasarla a un ensamblador.

Es muy poco probable que pueda llamar al BIOS bajo un sistema operativo en modo protegido y debería usar las instalaciones disponibles en ese sistema. Incluso si está en el modo kernel, probablemente no sea seguro: el BIOS puede no estar sincronizado correctamente con respecto al estado del sistema operativo si lo hace.


Un buen comienzo sería leer este artículo que habla sobre el montaje en línea en C / C ++:

http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx

Ejemplo del artículo:

#include <stdio.h> int main() { /* Add 10 and 20 and store result into register %eax */ __asm__ ( "movl $10, %eax;" "movl $20, %ebx;" "addl %ebx, %eax;" ); /* Subtract 20 from 10 and store result into register %eax */ __asm__ ( "movl $10, %eax;" "movl $20, %ebx;" "subl %ebx, %eax;" ); /* Multiply 10 and 20 and store result into register %eax */ __asm__ ( "movl $10, %eax;" "movl $20, %ebx;" "imull %ebx, %eax;" ); return 0 ; }


Usando GCC

__asm__("movl %edx, %eax/n/t" "addl $2, %eax/n/t");

Usando VC++

__asm { mov eax, edx add eax, 2 }