Помимо изучения ассемблера, я считаю, что изучение того, как компилируется язык низкого уровня, такой как C, очень ценно. Так что мой ответ - да, но опять же, я, вероятно, предвзят, потому что мне нравится программирование низкого уровня.
Например, просто понимание того, как составляются простые утверждения. Следующая функция,
int func(int val)
{
int num = val * 5;
return num;
}
... становится (по крайней мере, интересным):
movl %edi, -20(%rbp)
movl -20(%rbp), %edx
movl %edx, %eax
sall $2, %eax
addl %edx, %eax
Этот код берет аргумент из стека (val, параметр в func), сдвигает его влево на 2 позиции (умножить на 2 ^ 2 или 4) и затем добавляет исходное значение к результату. Конечным результатом является умножение на 5. Пример, подобный этому, иллюстрирует ряд вещей, о которых нужно знать, таких как оптимизация компилятора. Вместо того, чтобы вызывать инструкцию для прямого умножения на 5, она сдвигает два места для умножения на 4, а затем добавляет исходное значение. Подобные примеры я нашел, чтобы значительно улучшить мое понимание вещей на более низком уровне.
Генерируйте вывод ассемблера из gcc с -S
опцией. Однако следует помнить, что результаты будут зависеть от компилятора и уровня оптимизации.
В любом случае, я не думаю, что быть программистом на ассемблере - это то же самое, что понимать ассемблер . Опять же, я чувствую, что программирование на языке, подобном C, и знание того, как это делается в машинном коде, является ценной практикой.