Я хотел бы добавить свой собственный комментарий, но правила! # * & $% Stackoverflow запрещают мне комментировать, пока у меня не будет 28 миллионов кредитных пунктов (возможно, немного меньше).
Прежде всего, вы хотите написать свою функцию mull () на C настолько просто, насколько это возможно. Результирующий код будет проще (НАМНОГО проще), если вы будете использовать в качестве входных данных два 32-битных целых числа (вероятно, просто 'int', но зависит от вашей платформы). Если вы делаете это, судя по комментариям вашего профессора, это должно сводиться к одной инструкции умножения, которая выполняет 32-битное * 32-битное = 64-битное умножение. Если вы используете 64-битные целые числа в качестве входных данных, на вашем ЦП может не быть инструкции 64-битная * 64-битная = 128-битная, но даже если это слишком для вашего назначения. Если этого не произойдет, то компилятор выдаст последовательность инструкций для выполнения 64-битного * 64-битного = 128-битного умножения, что значительно затруднит вам понимание того, что происходит.
Когда вы получаете отдельную сборку C-файла для объектного файла и связываетесь с объектным файлом main (), вам нужно выполнить его разборку и найти инструкцию умножения. Как только вы нашли его, проследите назад, чтобы выяснить, откуда пришли его аргументы ... они могут быть в регистрах или, возможно, в ячейках памяти в стеке, в зависимости от ABI вашей системы. Затем проследуйте вперед до возврата функции, чтобы увидеть, куда идут результаты умножения, когда оно возвращается вызывающей стороне.
Возможно, вы захотите продублировать эту функциональность в вашей сборочной версии mult (), но за этим исключением: скомпилированная версия C-кода, вероятно, включает в себя хороший набор прологов и инструкций эпилога, которые просто не нужны в функции, которая так же просто, как Mult (). Но если компилятор действительно хорош в оптимизации, он не заметит этого, и скомпилированный результат будет, вероятно, в восемь раз дольше, чем это действительно необходимо. Судя по комментариям вашего профессора, вся ваша функция Mult () может быть всего от 2 до 6 инструкций ... и, в зависимости от вашего ABI, вам может понадобиться, а может и не понадобиться стек. (Для x86 вы это сделаете, но для PowerPC или других машин RISC вам не понадобится такая простая функция, поскольку для многих машин RISC функции с несколькими аргументами передают все свои аргументы в регистры, поэтому им не нужно стек вообще.)
Итак, если вам НЕОБХОДИМО использовать стек, ваша функция может выглядеть примерно так:
_mult:
...instructions to move parameters from stack locations into registers...
...multiply instruction using those registers...
...instructions to move the results into the appropriate stack locations
for return values (or return value registers, depending on your ABI)...
...and finally, your processor's "return" instruction
... всего, возможно, максимум 6 инструкций.