πŸ“Œ ИспользованиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· C ΠΊΠ°ΠΊ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° Π² asm

ΠŸΡ€ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ C ΠΈ ассСмблСра с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнного asm (GCC/Clang), Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· C-ΠΊΠΎΠ΄Π° ΠΈ Π΅Ρ‘ использованиС ΠΊΠ°ΠΊ ΠΈΠΌΠΌΠ΅Π΄ΠΈΠ°Ρ‚ (literal) Π² ассСмблСрной вставкС. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ извСстно Π½Π° этапС компиляции.

🧠 Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠ°ΠΊ Π»ΠΈΡ‚Π΅Ρ€Π°Π» ($42 Π² x86_64), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ„ΠΎΡ€ΠΌΠ°:

const int myval = 42;
int result;
asm volatile (
    "movl $%c1, %0"
    : "=r"(result)
    : "i"(myval)
);
  • %c1 β€” вставляСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ константу.

  • "i" β€” ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ константой Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции.

  • const ΠΈΠ»ΠΈ #define ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, Ссли трСбуСтся literal.

Π§Π΅Ρ€Π΅Π· макрос:

#define MYVAL 42
asm volatile (
    "movl $%c0, %%eax"
    :
    : "i"(MYVAL)
);

❌ НСдостатки

  • НСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… нСизвСстно Π½Π° этапС компиляции (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ int, Π½Π΅ const).

  • ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ΠΊ синтаксису GCC Inline Assembly.

βœ… ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ эффСктивный ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±Π΅Π· лишнСй Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΠ· памяти.

  • ΠŸΡ€ΠΎΡΡ‚Π°Ρ интСграция ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ compile-time Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

βš™οΈ Π“Π΄Π΅ примСняСтся

  • Π’ систСмном ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ написании Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² ΠΈΠ»ΠΈ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠ².

  • Π’ Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, Π³Π΄Π΅ Π²Π°ΠΆΠ΅Π½ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ инструкциями.