Как я могу понять процесс компиляции, используемый g cc? - PullRequest
0 голосов
/ 24 января 2020

Я пытался перепроектировать некоторые программы psp, разработанные с использованием бесплатного pspsdk

https://sourceforge.net/projects/minpspw/

Я заметил, что создал функцию, чтобы увидеть, как MIPS обрабатывает более 4 аргументов (а0-а4). Все, кого я знаю, сказали мне, что они попадают в стек. К моему удивлению, этот 5-й аргумент был фактически передан в регистр t0, и компилятору даже не использовался стек!

он также встроил функцию, даже не используя jal или переход к ней. (очевидная оптимизация). Хотя в памяти действительно был пробел, и вы могли бы проверить это дважды, используя print с аргументом указателя на функцию. Тот фактический код, который был выполнен, автоматически вставлялся без необходимости инструкции вызова функции.

^^, но это не очень полезно для попытки обратного инжиниринга ...

есть справочная страница для этой версии g cc. и установка занимает несколько секунд, если кто-то может предоставить его человеку для компиляции, если он есть. Это так долго, я даже не знаю, как ссылаться на информацию надежно

1 Ответ

1 голос
/ 24 января 2020

Способ передачи аргументов определяется ABI (двоичным интерфейсом приложения). Таким образом, вы должны найти соответствующие документы.

Более того, существует более одного такого ABI, а именно n32 и n64. В случае mips-gcc некоторые решения комментируются в источниках G CC, таких как . / Gcc / config / mips / mips.h

/* This structure has to cope with two different argument allocation
   schemes.  Most MIPS ABIs view the arguments as a structure, of which
   the first N words go in registers and the rest go on the stack.  If I
   < N, the Ith word might go in Ith integer argument register or in a
   floating-point register.  For these ABIs, we only need to remember
   the offset of the current argument into the structure.

   The EABI instead allocates the integer and floating-point arguments
   separately.  The first N words of FP arguments go in FP registers,
   the rest go on the stack.  Likewise, the first N words of the other
   arguments go in integer registers, and the rest go on the stack.  We
   need to maintain three counts: the number of integer registers used,
   the number of floating-point registers used, and the number of words
   passed on the stack.

   We could keep separate information for the two ABIs (a word count for
   the standard ABIs, and three separate counts for the EABI).  But it
   seems simpler to view the standard ABIs as forms of EABI that do not
   allocate floating-point registers.

   So for the standard ABIs, the first N words are allocated to integer
   registers, and mips_function_arg decides on an argument-by-argument
   basis whether that argument should really go in an integer register,
   or in a floating-point one.  */

Там больше таких комментариев в mips backend . Ищите «накопительный» или «накопительный» в mips.c и mips.h.

...