Шалом.
Сегодня расскажу об одной из самых недооценённых фич в С++. А именно - макросы
С помощью них удобно вставлять код в исходный код одной строкой, при этом при написании макроса очень легко совершить ошибку из-за которой будет жаловаться компилятор.
В нашем случае я покажу пример с ассемблерными вставками (своего рода junkcode с безсмысленными инструкциями).
Стоит ещё учитывать тот факт, что в макросах при использовании однострочных комментариев "//" будет жаловаться компилятор, чтобы избежать этого - используйте комментарии в стиле Си "/* 123 */"
А теперь поясню:
#define JUNKCODE - Директива для связывания инструкций ассемблера
__asm{instruction} - Встроенный в компилятор ассемблер. Про инструкции и их операнды думаю лучше не говорить в этой теме, т.к. не имеют смысла.
Символ "\" - Определение макроса
Вызывается этот макрос также одной строкой, вписываем в main:
Как видим, на скрине с дизассемблером - макрос вызвался в виде безсмысленных инструкции как и было задумано.
На этом гайд подходит к концу, всем добра и позитива.
Сегодня расскажу об одной из самых недооценённых фич в С++. А именно - макросы
С помощью них удобно вставлять код в исходный код одной строкой, при этом при написании макроса очень легко совершить ошибку из-за которой будет жаловаться компилятор.
В нашем случае я покажу пример с ассемблерными вставками (своего рода 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;
}
Как видим, на скрине с дизассемблером - макрос вызвался в виде безсмысленных инструкции как и было задумано.
На этом гайд подходит к концу, всем добра и позитива.