функции в ассемблере - PullRequest
       23

функции в ассемблере

3 голосов
/ 10 марта 2010

Я немного философствовал о назначении стека, и после некоторого кодирования я понял, в чем его сила. Единственное, что лежит в моем животе, это как он работает с функциями? Я попытался сделать несколько простых функций для добавления двух чисел, используя универсальные регистры, но я полагаю, что это не так, например, как это работает в Си ... где все параметры, локальные переменные и где хранится результат?

как бы вы переписали это на ассемблере? (Как компилятор для C переписать это?)

int function(int a, int &b, int *c){
 return a*(b++)+(*c);
}

я знаю, этот пример отстой ... но так я могу понять все возможности

Ответы [ 3 ]

5 голосов
/ 10 марта 2010

Во-первых, ссылки (int&) не на C, а только на C ++.

Если вы хотите увидеть, что происходит под капотом с gcc, используйте флаг -S. Вам не нужно иметь реальную программу.

g++ -S func.c

создает файл func.s, который содержит (без заголовков и т. Д. В поле x86):

    .text
.globl __Z8functioniRiPi
__Z8functioniRiPi:
LFB2:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    movl    %edi, -4(%rbp)
    movq    %rsi, -16(%rbp)
    movq    %rdx, -24(%rbp)
    movq    -16(%rbp), %rax
    movl    (%rax), %edx
    movl    %edx, %ecx
    imull   -4(%rbp), %ecx
    movq    -24(%rbp), %rax
    movl    (%rax), %eax
    addl    %eax, %ecx
    incl    %edx
    movq    -16(%rbp), %rax
    movl    %edx, (%rax)
    movl    %ecx, %eax
    leave
    ret

Обратите внимание на искажение имени в C ++ (__Z8functioniRiPi). Теперь мы даем g ++ флаг -O2:

    .text
    .align 4,0x90
.globl __Z8functioniRiPi
__Z8functioniRiPi:
LFB2:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    movl    (%rsi), %ecx
    movl    %ecx, %eax
    imull   %edi, %eax
    addl    (%rdx), %eax
    incl    %ecx
    movl    %ecx, (%rsi)
    leave
    ret

-O3 дает тот же код; на самом деле оптимизировать больше нечего.

Получайте удовольствие, играя со сборкой. ^ _ ^

5 голосов
/ 10 марта 2010

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

3 голосов
/ 10 марта 2010

То, что Аарон сказал о соглашениях о вызовах, является правильным ответом. Для моего личного изучения темы я нашел, что Smashing the Stack For Fun и Прибыль - отличное упражнение в роли стекового фрейма и того, что может произойти, когда он испортится. Finlay Я рекомендую сборочный праймер для хакеров , который охватывает важные концепции ассемблера, а также забавные вещи, которые вы можете сделать с вашим отладчиком.

...