Если вы хотите узнать, как составляется ассемблерный код, какой тип инструкций заканчивается в ассемблерном коде с определенными свойствами, то (на x86 / x64) выполните следующее:
Возьмите справочные руководства по набору инструкций Intel (я думаю, четыре тома на момент написания этой статьи).Они содержат таблицы кодов операций (двоичные форматы команд) и подробные списки всех разрешенных кодов операций для конкретной мнемоники сборки (название инструкции).
Ознакомьтесь с ними и мысленно разделите их на две группы - те, которые соответствуют ожидаемым свойствам (например,, не содержащий символ «х» ... или любой другой конкретный), и те, которые не.2-я категория, которую вы должны исключить из своего кода, если они присутствуют.
Скомпилируйте ваш код, сказав компилятору не отбрасывать промежуточные компиляции:
gcc -save-temps -c csource.c
- Разобрать объектный файл:
objdump -d csource.o
Вывод дизассемблирования из objdump
будет содержать двоичные инструкции (коды операций), а такжеимена команд (мнемоника), т.е. вы точно увидите, какой формат кода операции был выбран.Теперь вы можете проверить, есть ли здесь какие-либо коды операций из 2-го набора, как указано выше.
Приходит творческая часть работы.Когда вы обнаружили в выводе разборки инструкцию, что не не соответствует вашим ожиданиям / требованиям, найдите / создайте замену (или, чаще, заменяющую последовательность из нескольких инструкций), которая даеттот же конечный результат, но он составлен только из инструкций, которые do соответствуют тому, что вам нужно.
Вернитесь к промежуточным компонентам компиляции, указанным выше, найдите сборку csource.s
, внесите изменения, соберите / перекомпоновайте,test.
Если вы хотите сделать свой код сборки автономным (т.е. не использовать системные библиотеки времени выполнения / выполнять системные вызовы напрямую), обратитесь к документации по внутренним компонентам вашей операционной системы (как выполнять системные вызовы)и / или разберите библиотеки времени выполнения, которые обычно делают это от вашего имени, чтобы узнать, как это делается.
Так как 5. определенно домашнее задание, такого же типа, как createцикл C for()
, эквивалентный данному циклу while()
, не ожидайте слишком большой помощи там.Справочные руководства по набору инструкций и эксперименты с (dis) ассемблером - вот что вам нужно.
Кроме того, если вы учитесь, посетите уроки о том, как работают компиляторы / как писать компиляторы - они охватывают как сборкувыбор инструкций выполняется компиляторами, и я могу себе представить, что это будет интересный / сложный проект термина, например, написать компилятор, в выводе которого гарантированно будет содержаться символ '?
' (0x3f
), но никогда '!
'(0x21
).Вы поняли.