Есть ли компилятор C, чтобы показать вам связанную программу в asm? - PullRequest
4 голосов
/ 06 октября 2010

Я ищу компилятор или лучшую IDE для C, которая могла бы генерировать полностью связанную программу, включая функции из CRT, в виде ассемблера. Есть ли? Я пробовал Visual C Express 2008. У него есть дизассемблер, но это несколько странно. Я имею в виду, по какой-то причине он показывает много «странных» строк кода, таких как mov a,#3 примерно в 100 строк .... Это для учебных целей. Спасибо за советы.

Ответы [ 5 ]

4 голосов
/ 06 октября 2010

gcc будет генерировать файлы ASM.Если вы используете gcc -Wa,-adhln -g [source.c] gcc и as, чередуете строки исходного кода C с сгенерированным кодом сборки.

clang с LLVM создаст файлы ASM высокого качества.

Пример:

Эта функция C:

long Fibonacci(long x) {
  if (x == 0) return 0;  
  if (x == 1) return 1;
  return Fibonacci(x - 1) + Fibonacci(x - 2);
}

Становится следующим ASM-файлом:

_Fibonacci:
Leh_func_begin1:
    pushq   %rbp
Ltmp0:
    movq    %rsp, %rbp
Ltmp1:
    subq    $32, %rsp
Ltmp2:
    movq    %rdi, -16(%rbp)
    movq    -16(%rbp), %rax
    cmpq    $0, %rax
    jne LBB1_2
    movq    $0, -8(%rbp)
    jmp LBB1_5
LBB1_2:
    movq    -16(%rbp), %rax
    cmpq    $1, %rax
    jne LBB1_4
    movq    $1, -8(%rbp)
    jmp LBB1_5
LBB1_4:
    movq    -16(%rbp), %rax
    movabsq $1, %rcx
    subq    %rcx, %rax
    movq    %rax, %rdi
    callq   _Fibonacci
    movq    -16(%rbp), %rcx
    movabsq $2, %rdx
    subq    %rdx, %rcx
    movq    %rcx, %rdi
    movq    %rax, -24(%rbp)
    callq   _Fibonacci
    movq    -24(%rbp), %rcx
    addq    %rax, %rcx
    movq    %rcx, -8(%rbp)
LBB1_5:
    movq    -8(%rbp), %rax
    addq    $32, %rsp
    popq    %rbp
    ret
Leh_func_end1:

Когда вы сделаете это, вы захотите отключить оптимизацию.

Также возможно чередовать сгенерированный код ASM с источником более высокого уровня, как, например, писатель ЗДЕСЬ .

1 голос
/ 06 октября 2010

Параметры командной строки для этого, особенно в Visual C ++ Express с использованием компилятора C ++, имеют вид / Fa

                          -OUTPUT FILES-

/ Fa [файл] имя файла сборки сборки
/FA [scu] настроить список сборок / Fd [имя файла] .PDB файл
/ Имя исполняемого файла Fe / Fm [файл] имя файла карты
/ Файл объекта имени Fo / Имя скомпилированного имени Fp / Fr [файл] имя исходного файла браузера / FR [файл] имя расширенное .SBR файл / doc [файл] обрабатывает комментарии к документации XML и, при желании, дает имя .xdc файлу

Здесь вы увидите выходные данные ассемблера,Объединив флаги препроцессора вместе, вы сможете увидеть все выходы, смешанные с ассемблером.

                          -PREPROCESSOR-

/ AI добавить в путь поиска сборки
/ FU принудительно использовать сборку/ module / C не удаляет комментарии
/ D {= | #} определяет предварительный процесс макроса / E для вывода на стандартный вывод
/ предварительный процесс EP к выводу на стандартный вывод, без предварительной обработки #line / P к файлу
/ добавлено слияние Fxкод в файл / имя ФИ принудительно включает файл
/ U удалить предопределенный макрос / u удалить все предопределенные макросы
/ Я добавляю, чтобы включить путь поиска / X игнорирует "стандартные места"

Большинство, если нет, ALL компиляторыспособны сделать это, нужно выяснить, какие переключатели использовать.

1 голос
/ 06 октября 2010

Не знаю, поможет ли это вам, но для изучения внутренних ресурсов я использую IDAPro и OllyDbg и disasm (на linux / unix), и они мне очень помогли.

0 голосов
/ 13 октября 2010
objdump -D <file-name>
0 голосов
/ 06 октября 2010

Обычный компилятор не имеет ничего общего с кодом после его связывания.Компилятор может выводить сборку для одного файла, но для получения результатов пост-линковки вам, скорее всего, потребуется использовать дизассемблер.Как отмечает @dgarcia, IDAPro очень хорош.Поскольку вы, очевидно, работаете в Windows, вы также можете использовать dumpbin /disasm.Это не так хорошо, как IDAPro, но это бесплатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...