Czy jest sposób na wstawienie kodu asemblera do C?

Pamiętam jak kiedyś ze starym kompilatorem Borland DOS można było zrobić coś takiego:

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

Czy jest na to jakiś półautomatyczny sposób? Mam potrzebę wykonania połączenia z BIOSem, więc jeśli byłby sposób, aby to zrobić bez kodu asm, byłoby to dla mnie równie przydatne.

Author: kristianp, 2008-09-14

4 answers

Using GCC

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

Using VC++

__asm {
  mov eax, edx
  add eax, 2
}
 56
Author: Niall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-14 14:05:30

W GCC chodzi o coś więcej. W instrukcji musisz powiedzieć kompilatorowi co się zmieniło, aby jego optymalizator nie spieprzył. Nie jestem ekspertem, ale czasami wygląda to tak:

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

Dobrym pomysłem jest napisanie przykładowego kodu w języku C, a następnie poproszenie GCC o stworzenie listy złożeń, a następnie zmodyfikowanie tego kodu.

 10
Author: Martin Del Vecchio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 02:25:49

Dobrym początkiem byłoby przeczytanie tego artykułu, który mówi o inline assembly W C / C++:

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

Przykład z artykułu:

#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 ;
}
 4
Author: Espo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-14 13:57:55

Kompilatory innych niż x86 nie obsługują montażu liniowego. Musisz zdefiniować całą funkcję w oddzielnym pliku źródłowym assemblera i przekazać ją do asemblera.

Jest bardzo mało prawdopodobne, aby być w stanie wywołać BIOS w trybie chronionym systemu operacyjnego i powinien korzystać z wszelkich udogodnień dostępnych w tym systemie. Nawet jeśli jesteś w trybie jądra, prawdopodobnie jest to niebezpieczne - BIOS może nie być poprawnie zsynchronizowany ze stanem systemu operacyjnego, jeśli to zrobisz.

 2
Author: Mike Dimmick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 14:55:38