Существует множество причин, по которым конкретный генератор кода может выдавать указанную вами последовательность команд.Скорее всего, генератор кода, который вы используете, просто не очень старается создать оптимальный код.
Этот шаблон испускаемого кода подсказывает мне, что ваш генератор кода не знает, что в x86 есть команды "mov немедленные", которые непосредственно вставляют постоянное значение в поток команд.Кодирование x86 для кодов операций с непосредственными значениями может стать немного сложным (байты R / M переменной длины), но это уже требуется, если вы хотите использовать многие инструкции x86.
Этот испускаемый код также предполагает, чтогенератор кода не знает, что EAX не модифицируется инструкциями EBX.Такое ощущение, что кодеген управляется шаблоном, а не дискретной логикой.
Этот кодоген происходит, когда внутреннее промежуточное представление компилятора недостаточно детализировано, чтобы представить все аспекты целевой архитектуры.Это особенно верно, если архитектура генератора кода изначально была разработана для набора команд RISC, но была перенастроена для выдачи команд x86.Архитектура RISC, как правило, имеет очень мало и очень простых инструкций загрузки / хранения и работы с reg / reg, в то время как набор команд x86 органично развивался в течение десятилетий и включал широкий спектр кодов операций, которые работают непосредственно с памятью, встроенными константами в инструкции,и целый беспорядок других вещей.Если промежуточное представление компилятора (граф выражений) связано с RISC, будет трудно заставить его впитывать все разнообразие и тонкости x86.