Intereting Posts
Arduino-подобный Makefile с зависимостями …? Динамически сгенерированный код выполняется в неправильном адресе Как изящно реализовать ряд функций в версиях разных типов, используя чистую C? SIGIO, прибывающий для файловых дескрипторов, я не установил его и когда нет возможности ввода-вывода Попытка подclassа на консоли Подчините процедуру подclassа, чтобы он мог использоваться как в окне, так и в диалоговом окне Могу ли я использовать компилятор Visual C ++ без Visual Studio? Ошибка проверки функции, которая возвращает int C: Как передать двойной указатель на функцию Элемент гибкого массива во вложенной структуре Операторы сравнения для строк C Виртуальный микрофон Windows в C Почему в vulkan.h не отправляемые объекты всегда набираются до 64 бит? C Confused о том, как инициализировать и реализовать мьютекс pthread и переменную условия Endian представление 64-битных значений

определение типа возврата функции в сборке

Код ниже – домашнее задание, реальные команды сборки, которые я понимаю. Однако я не уверен (и смотрел), как определить возвращаемый тип функции и сколько аргументов, если какая-либо функция принимает. Профессор действительно не справился с этим хорошо (Monotone tenure princess). Назначение – прочитать ассемблерный код, а затем написать базу кода c на ассемблере. Снова я понимаю инструкции, просто не могу понять, что такое тип возврата или сколько аргументов принимает код

.file "hw5.c" .text .p2align 4,,15 .globl p1 .type p1, @function p1: .LFB0: .cfi_startproc addq %rsi, %rdi addq %rdi, %rdx movq %rdx, %rax ret .cfi_endproc 

Вы должны посмотреть на соглашение о вызове для процессора / платформы, чтобы понять реализацию на низком уровне.

Перед вызовом подпрограммы вызывающий абонент должен сохранять содержимое определенных регистров, которые назначены для вызова. Регистры, сохраненные вызывающим абонентом, – EAX, ECX, EDX [x86]. Поскольку вызываемой подпрограмме разрешено изменять эти регистры, если вызывающий объект полагается на свои значения после возвращения подпрограммы, вызывающий должен вытолкнуть значения в этих регистрах в стек (чтобы их можно было восстановить после возврата подпрограммы. подпрограмму, нажимаем их на стек перед вызовом. Параметры должны быть сдвинуты в инвертированном порядке (т. е. последний параметр). Поскольку стек растет, первый параметр будет сохранен с наименьшим адресом (эта инверсия параметров была исторически используется для разрешения функций через переменное количество параметров). [из соглашения о вызовах x86]

См. https://stackoverflow.com/tags/x86/info для ссылок на вызовы документов соглашений. Это похоже на стандартный SysV x86 ABI, используемый всем, кроме Windows.

Это, очевидно, делает два добавления 64-битных добавок, чтобы генерировать результат из трех входных регистров, а затем помещать результат в %rax .

Вы не можете определить, был ли результат подписан или неподписанным, хотя, поскольку код будет таким же.

Кроме того, оптимизированная версия будет пропускать mov , используя lea как неразрушающий add с выходом, который не был одним из входов:

 lea (%rdi,%rdx), %rax 

Есть 3 аргумента. Это rsi, rdi и rdx. Возвращаемое значение находится в rax. Функция суммирует три аргумента. Аргументы могут быть подписаны или без знака, так как Addq работает с обоими. Все аргументы и возвращаемое значение должны считаться одинаковыми (подписанные или неподписанные 64-битные целые числа).

Это соглашение о вызове, которое я никогда не видел на x64. Поэтому после преобразования в C компилятор не будет генерировать одну и ту же сборку, если вы не укажете условное соглашение о вызове (предполагая, что это поддерживает компилятор).

Как только вы определяете соглашение о вызове, вы можете сказать, что такое порядок аргументов. До тех пор вы не знаете, является ли rsi / rdi / rdx первым, вторым или третьим аргументом.

этот пост, отвечает на мой вопрос по большей части. Возвращаемое значение функции C для ASM. Я не видел этого, пока не полностью переосмыслил выбор своего слова. Я все еще пытаюсь выяснить количество аргументов, переданных в функцию. если я прав, хотя `

 addq %rsi, %rdi addq %rdi, %rdx 

эти две строки показывают мне, что переданы два приема. один хранится в &rsi другой сохранен в %rdi