Гайд [C++ для самых маленьких] Макросы + __asm

  • colby57
  • UNEXPECTED_KERNEL_MODE_TRAP_M (1000007f)
  • 155
  • 2
  • 240
Шалом.

Сегодня расскажу об одной из самых недооценённых фич в С++. А именно - макросы

С помощью них удобно вставлять код в исходный код одной строкой, при этом при написании макроса очень легко совершить ошибку из-за которой будет жаловаться компилятор.
В нашем случае я покажу пример с ассемблерными вставками (своего рода junkcode с безсмысленными инструкциями).

Стоит ещё учитывать тот факт, что в макросах при использовании однострочных комментариев "//" будет жаловаться компилятор, чтобы избежать этого - используйте комментарии в стиле Си "/* 123 */"

C++:
#define JUNKCODE        \
__asm{push eax}            \
__asm{push ebx}                \
__asm{mov eax, 0x99}        \
__asm{mov ebx, 0x99}        \
__asm{xor eax, ebx}        \
__asm{xor eax, eax}            \
__asm{xor ebx, ebx}            \
__asm{or eax, 0x23}            \
__asm{or ebx, 0x78}            \
__asm{xor eax, eax}            \
__asm{xor ebx, ebx}            \
__asm{pop eax}                    \
__asm{pop ebx}                    \

А теперь поясню:

#define JUNKCODE - Директива для связывания инструкций ассемблера
__asm{instruction} - Встроенный в компилятор ассемблер. Про инструкции и их операнды думаю лучше не говорить в этой теме, т.к. не имеют смысла.
Символ "\" - Определение макроса

Вызывается этот макрос также одной строкой, вписываем в main:
C++:
int main()
{
    JUNKCODE
    printf("hello, brokencore.club!");
    return 0;
}

Как видим, на скрине с дизассемблером - макрос вызвался в виде безсмысленных инструкции как и было задумано.
1611659218258.png


На этом гайд подходит к концу, всем добра и позитива.
 
Сверху Снизу