Я смотрел на Проект Эйлера Задача 48 :
Серия, 1 1 + 2 2 + 3 3 + ... + 10 10 = 10405071317.
Найдите последние десять цифр серии: 1 1 + 2 2 + 3 3 + ... + 1000 1000 .
В Python я могу сделать это одной строкой:
sum((x**x for x in xrange(1,1001))
Но эквивалент этого ассемблера будет 100 строк и настоящий вызов.
Должен ли я делать некоторые из этих головоломок в сборке, чтобы получить представление о низкоуровневом программировании и понять, как на самом деле работает компьютер?
self-improvement
assembly
Nishant
источник
источник
*
в Python?Ответы:
Помимо изучения ассемблера, я считаю, что изучение того, как компилируется язык низкого уровня, такой как C, очень ценно. Так что мой ответ - да, но опять же, я, вероятно, предвзят, потому что мне нравится программирование низкого уровня.
Например, просто понимание того, как составляются простые утверждения. Следующая функция,
... становится (по крайней мере, интересным):
Этот код берет аргумент из стека (val, параметр в func), сдвигает его влево на 2 позиции (умножить на 2 ^ 2 или 4) и затем добавляет исходное значение к результату. Конечным результатом является умножение на 5. Пример, подобный этому, иллюстрирует ряд вещей, о которых нужно знать, таких как оптимизация компилятора. Вместо того, чтобы вызывать инструкцию для прямого умножения на 5, она сдвигает два места для умножения на 4, а затем добавляет исходное значение. Подобные примеры я нашел, чтобы значительно улучшить мое понимание вещей на более низком уровне.
Генерируйте вывод ассемблера из gcc с
-S
опцией. Однако следует помнить, что результаты будут зависеть от компилятора и уровня оптимизации.В любом случае, я не думаю, что быть программистом на ассемблере - это то же самое, что понимать ассемблер . Опять же, я чувствую, что программирование на языке, подобном C, и знание того, как это делается в машинном коде, является ценной практикой.
источник
Вероятно, нет необходимости в том, чтобы действительно иметь возможность писать ассемблер (большинство из которых - детали инициализации и соглашения о вызовах для вашей системы).
Это стоит понять некоторым, если вы пытаетесь что-то отладить без исходного кода.
НО, безусловно, стоит понимать машину, по крайней мере, на уровне «C» и указателей (по сути, это ассемблер высокого уровня), чтобы вы знали, почему плохая последовательность строк миллион раз в цикле.
источник
for i in range(1000000): s = s + '.'
(намного) хуже, чем «оптимизированные» версии, которые я повторно используюs
. Точно так же несколько других разработок лишают законной силы то, что является разумным предположением со знанием C и предполагающим наивную реализацию. Но в целом это больше полезно, чем вредно. Просто помните, что языковые реализации иногда умнее вас;)Хороший вопрос. Обучение сборке определенно хорошо и стоит усилий.
источник
Да и нет.
Хотя это правда, что это даст вам лучшее понимание того, что делает ваш код и почему некоторые вещи являются просто плохой идеей, вы должны подумать об усилиях.
Обучение ассемблеру - это не проект выходного дня, оно займет у вас много времени, и вам нужно подумать, лучше ли потратить это время.
Если вы не в оптимизированный код, то вы, вероятно, никогда не увидите преимущества, равные усилиям, которые вы вкладываете.
источник
Я много работал на ассемблере, когда был моложе, и я не думаю, что это помогло понять что-либо вне ассемблера. Если вы посмотрите на современный ассемблер, то все равно это все на макроязыке. Я обычно ненавижу аналогии, но здесь все равно идет речь: делает ли знание того, как работает двигатель автомобиля, лучший водитель?
источник
Я работал над пониманием ассемблера, написав программы на языках более высокого уровня, а затем заменив части (по крайней мере, надеюсь) функционально эквивалентными участками собранного кода. Это означает, что я могу использовать HLL для того, что они хороши для организации и решения проблем высокого уровня, и я использую asm для удара по металлу.
(Когда я говорю о программе хоста, записываемой в HLL, я имею в виду C или ObjC, когда я пытаюсь изучить asm x86_64, и BASIC, когда я работаю над asm Z80, 6502 и 6809).
источник