32-битная сборка Linux в C - PullRequest
       32

32-битная сборка Linux в C

0 голосов
/ 29 сентября 2018

Я хочу преобразовать этот asm-код в C ++ или C, я могу понять основные понятия внутри main, такие как декларирование переменных и вызов функций, но я застрял в командах push и pop и не могу понять, как они работают.

    main:
   0x080489cc <+0>: lea    ecx,[esp+0x4]
   0x080489d0 <+4>: and    esp,0xfffffff0
   0x080489d3 <+7>: push   DWORD PTR [ecx-0x4]
   0x080489d6 <+10>:    push   ebp
   0x080489d7 <+11>:    mov    ebp,esp
   0x080489d9 <+13>:    push   ebx
   0x080489da <+14>:    push   ecx
   0x080489db <+15>:    sub    esp,0x10
   0x080489de <+18>:    call   0x80488b0 <__x86.get_pc_thunk.bx>
   0x080489e3 <+23>:    add    ebx,0xa261d
   0x080489e9 <+29>:    mov    DWORD PTR [ebp-0xc],0x1
   0x080489f0 <+36>:    mov    DWORD PTR [ebp-0x10],0x3
   0x080489f7 <+43>:    mov    DWORD PTR [ebp-0x14],0x9
   0x080489fe <+50>:    sub    esp,0x4
   0x08048a01 <+53>:    push   DWORD PTR [ebp-0x14]
   0x08048a04 <+56>:    push   DWORD PTR [ebp-0x10]
   0x08048a07 <+59>:    push   DWORD PTR [ebp-0xc]
   0x08048a0a <+62>:    call   0x8048a34 <blender>
   0x08048a0f <+67>:    add    esp,0x10
   0x08048a12 <+70>:    sub    esp,0x8
   0x08048a15 <+73>:    push   eax
   0x08048a16 <+74>:    lea    eax,[ebx-0x2ed18]
   0x08048a1c <+80>:    push   eax
   0x08048a1d <+81>:    call   0x804f100 <printf>
   0x08048a22 <+86>:    add    esp,0x10
   0x08048a25 <+89>:    mov    eax,0x0
   0x08048a2a <+94>:    lea    esp,[ebp-0x8]
   0x08048a2d <+97>:    pop    ecx
   0x08048a2e <+98>:    pop    ebx
   0x08048a2f <+99>:    pop    ebp
   0x08048a30 <+100>:   lea    esp,[ecx-0x4]
   0x08048a33 <+103>:   ret    

blender:
   0x08048a34 <+0>: push   ebp
   0x08048a35 <+1>: mov    ebp,esp
   0x08048a37 <+3>: call   0x8048a51 <__x86.get_pc_thunk.ax>
   0x08048a3c <+8>: add    eax,0xa25c4
   0x08048a41 <+13>:    mov    edx,DWORD PTR [ebp+0x8] 
   0x08048a44 <+16>:    mov    eax,DWORD PTR [ebp+0xc] 
   0x08048a47 <+19>:    add    eax,edx 
   0x08048a49 <+21>:    add    eax,eax 
   0x08048a4b <+23>:    imul   eax,DWORD PTR [ebp+0x10] 
   0x08048a4f <+27>:    pop    ebp
   0x08048a50 <+28>:    ret

1 Ответ

0 голосов
/ 29 сентября 2018

Inside main () От 0x080489e9 до 0x080489f7 // объявляя три 4-байтовых целых числа и инициализируя их 1,3 и 9, мы можем принять эту часть как:

int a = 1;
int b = 3;
int c = 9;

От 0x08048a01 до 0x08048a0a // pushingпеременные справа налево для отправки их в качестве аргумента функции blender, затем вызывает blender blender (a, b, c);

Inside blender ()

 0x08048a41 <+13>:  mov    edx,DWORD PTR [ebp+0x8] // edx = 1
   0x08048a44 <+16>:    mov    eax,DWORD PTR [ebp+0xc] // eax = 3
   0x08048a47 <+19>:    add    eax,edx // eax = eax+edx = 4
   0x08048a49 <+21>:    add    eax,eax //eax = 2*eax
   0x08048a4b <+23>:    imul   eax,DWORD PTR [ebp+0x10] //[ebp +0x10] = 9 imul means signed multiply so this means; eax = eax * 9 
        pop

что-то вроде

return 2*(a+b) *c // 2*(1+3) * 9 = 72

После вызова blender он вызывает 0x08048a1d <+81>: вызывает функцию 0x804f100 и печатает результат, между объявлением переменной внутри printf

prinf("%d" , blender())

нет никакого другого объявления переменнойКонечный код выглядит так:

int main()
{
    int a = 1;
    int b = 3;
    int c = 9;

    printf("%d" , blender(a,b,c));
    return 0;
}

int blender(int a, int b, int c)
{
    return 2*(a+b) * c;
}
...