2013-12-11 1 views
0

Я пытаюсь найти C-эквивалентны следующий кусок сборки:ассемблер на C эквивалентного

 .section .text 
     .globl mystery 
     .type mystery, @function 
    mystery: 
     pushl %ebp 
     movl %esp, %ebp 
     xorl %eax, %eax 
     xorl %exc, %ecx 
     movl 8(%ebp), %edx 

    begin: 
     cmpl 12(%ebp), %ecx 
     jge done 
     addl (%edx, %ecx, 4), %eax 
     incl %ecx 
     jump begin 

    done: 
     movl %ebp, %esp 
     popl %ebp 
     ret 

я получаю «начать» раздел. Это похоже на цикл, который принимает параметр из функции и сравнивает его с тем, что находится в% ecx. Если условие jge выполнено, функция возвращает, если не добавляет% edx на 4% ecx, перемещает его в% eax, увеличивает% ecx и снова проходит.

Я действительно не понимаю часть «тайны». В частности, операторы xorls и movl. Если ничего нет в% eax или% ecx, чтобы начать, что делает xorl. Предполагаю, что movl принимает параметр из функции и перемещает ее в% edx?

Любое понимание полезно и ценится.

+0

Где вы находите этот код? – unwind

+1

@unwind Я чувствую домашнюю работу. –

+1

XORing что-то само по себе означает установить его на ноль. – Michael

ответ

6

Функция использует переход cdecl. C man, когда вы скомпилируете это, будет _mystery.

int __attribute__((cdecl)) mystery(int * array, int length) { 
    // save the rpevious function stack 
    // pushl %ebp 
    // movl %esp, %ebp 

    // xorl %eax, %eax 
    int eax = 0; 
    // xorl %exc, %ecx 
    int ecx = 0; 

    // cmpl 12(%ebp), %ecx 
    // jge done 
    while (length > ecx) { 
     // addl (%edx, %ecx, 4), %eax 
     eax += array[ecx]; 
     // incl %ecx 
     ecx++; 
     // jump begin 
    } 

    // restorre previous stack frame 
    // movl %ebp, %esp 
    // popl %ebp 

    // ret 
    return eax; 
} 

Функция вычисляет сумму по массиву целых чисел.

+2

Или более реалистично, сборка исходила от функции C, тело которой было бы: 'int i, sum; sum = 0; for (i = 0; i lurker

+3

@mbratch да, возможно, но я хотел сохранить то же имя, что и регистры, чтобы показать, как они переходят друг в друга –

1

xorl %eax, %eax Это стандартный способ сброса регистра (установка его значения 0). Независимо от того, какое значение имеет регистр, XOR между теми же двумя значениями (битовые значения) равен 0.

2

Этот язык ассемблера уже выглядит как разборка простой программы на языке C.

mystery: 
    % The next two instructions set up the stack frame. %ebp is saved on the 
    % stack to preserve its value. Then %ebp is set to the value in %esp (the 
    % current stack ptr) to establish the stack frame for this function. 
    % See http://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames 
    % for details on stack frames. 
    pushl %ebp 
    movl %esp, %ebp 

    % XOR anything with itself zeroes it out since 
    % 1 xor 1 is 0, and 0 xor 0 is 0. 
    % So the following two instructions clear %eax and %ecx 
    xorl %eax, %eax 
    xorl %ecx, %ecx  % (note the typo fix :)) 

    % The following instruction assumes there's a parameter passed from the 
    % caller that's on the stack. It is moving that parameter into %edx 
    movl 8(%ebp), %edx 
begin: 
    ...