2015-02-05 2 views
0

Цель: Получить эту сборку код:Преобразование мелких деталей от С до x86 Ассамблеи

main: 
      leal 4(%esp), %ecx 
      andl $-16, %esp 
      pushl -4(%ecx) 
      pushl %ebp 
      movl %esp, %ebp 
      pushl %ecx 
      subl $16, %esp 
      movl $-559038737, -16(%ebp) 
      movl $0, -12(%ebp) 
      movl $1, -8(%ebp) 
      jmp  .L2 
    .L3: 
      movl -8(%ebp), %eax 
      andl -16(%ebp), %eax 
      testl %eax, %eax 
      setne %al 
      movzbl %al, %eax 
      addl %eax, -12(%ebp) 
      sall -8(%ebp) 
    .L2: 
      cmpl $0, -8(%ebp) 
      jne  .L3 
      addl $16, %esp 
      popl %ecx 
      popl %ebp 
      leal -4(%ecx), %esp 
      ret 

путем заливки в заготовке:

#include <stdio.h> 
int main() 
{ 
int x = 0x________; 
int result = ______; 
int mask; 
for (mask = _________; mask _______; mask = ________) { 
result += ________; 
} 
} 

Что я получил:

#include <stdio.h> 
int main() 
{ 
    int x = 0xFFFFFFFFDEADBEEF; 
    int result = 0; 
    int mask; 

    for (mask = 1; mask != 0; mask = mask + 1) 
    { 
     result += x & mask; 
    } 
} 

мой код сборки:

main: 
     pushl %ebp 
     movl %esp, %ebp 
     subl $16, %esp 
     movl $-559038737, -4(%ebp) 
     movl $0, -12(%ebp) 
     movl $1, -8(%ebp) 
     jmp  .L2 
.L3: 
     movl -8(%ebp), %eax 
     movl -4(%ebp), %edx 
     andl %edx, %eax 
     addl %eax, -12(%ebp) 
     sall -8(%ebp) 
.L2: 
     cmpl $0, -8(%ebp) 
     jne  .L3 
     leave 
     ret 

Я застрял на этом несколько часов: как мне добавить этот код на C, чтобы он использовал команды testl, setne, and movzbl? Я знаю, что testl проверяет, что оба операнда равны 0, но я не уверен, где это вписывается в контекст программы C. Кроме того, что такое addl $16, %esp в нижней части основного? Просто еще раз указав на стопку стека?

+0

Объясните, какие тесты, setne и movbl означают для нас. когда вы это сделаете, вы можете лучше понять, что вам нужно сделать в c. у вас есть правильное объяснение движения esp - он раскручивает фрейм стека, который должен был содержать автоматические переменные. –

+1

Тройка 'test eax, eax \ setne al \ movzx eax, al' примерно означает' something! = 0' в C, который затем используется как значение (вы не должны видеть этот шаблон, если это сравнение используется как условие для отделение). – harold

ответ

0

Вы используете тот же компилятор, который сгенерировал примерный код сборки? Во-первых, andl $ -16,% esp округляет esp до 16-байтовой границы. Есть ли опция компиляции с вашим компилятором, чтобы это произошло?

Addl $ 16,% esp в конце кода примера восстанавливает стек из $ subl $ 16,% esp около начала кода.

Фактический указатель стека + 4 сохраняется в ecx, затем ecx помещается в стек рядом с началом кода примера и восстанавливается ближе к концу. Затем esp восстанавливается с использованием leal $ -4 (% ecx),% esp.

Все вышеперечисленное относится к тому, как ваш компилятор обрабатывает прологи и эпилоги.

Остальная часть примера кода сборки переводится в пример кода C, вам просто нужно заполнить пробелы, как было задано.

Смежные вопросы