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.
4 answers
Using GCC
__asm__("movl %edx, %eax\n\t"
"addl $2, %eax\n\t");
Using VC++
__asm {
mov eax, edx
add eax, 2
}
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.
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 ;
}
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.
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