8

Myślę, że jest to całkiem prosty problem. Muszę odtworzyć ten kod asemblerowy na kod c. Zapewniam również, co myślę, że można, więc miejmy nadzieję, wskaż, gdzie popełniłem błąd i teraz mogę uczyć się na swoich błędach.Kod instalacyjny inżyniera odwrotnego kodu c

.LFBO 
    pushq %rbp 
    movq %rsp,%rbp 
    movl %edi,-4(%rbp) 
    movl %esi,-8(%rbp) 
    movl -4(%rbp),%eax 
    compl -8(%rbp),%eax 
    jg  .L2 
    movl -8(%rbp),%eax 
    jmp  .L3 
.L2: 
    movl -4(%rbp),%eax 
.L3: 
    popq %rbp 
    ret 

Więc to jest to, co myślę, że dzieje się z tym: pierwsze dwie linie po .LFBO:

pushq %rbp 
movq %rsp,%rbp 

dopiero utworzenie stosu na wykonanie, która jest o do naśladowania.

movl %edi,-4(%rbp) 

jest pobieranie pierwszej zmiennej, nazwać x

movl %esi,-8(%rbp) 

jest pobieranie drugi zmienny nazwać Y

movl -4(%rbp),%eax 

jest pobieranie X o stosunku w następnej linii

compl -8(%rbp),%eax 

porównanie ES zmiennych x i y, obliczając xy

jg  .L2 

mówi skok .L2 jeśli x> y

< jeśli X = Y, a następnie obliczyć kolejne linie bez skoków do .L2

movl -8(%rbp),%eax 

kopii x = Y

jmp  .L3 

skok .L3

jeśli x> y na linii jg następnie przejść do .L2: i zakończyć tę linię

movl -4(%rbp),%eax 

to jest, gdy zdałem sobie sprawę, że jestem naprawdę mylić. Wydaje mi się, że jesteś do kopiowania x x następnie .L3 jest zakończona i myślę, że x jest zwracana

+2

Wystarczy, aby potwierdzić, to zespół AT & T-składnia x86? – Dai

+4

Nie sądzę, że byłeś zdezorientowany. Właśnie patrzysz na niezoptymalizowany kod, więc są linie, które są całkowicie bezużyteczne (jak przypisywanie x do x, jak powiedziałeś). Jak myślisz, co robi ta funkcja, biorąc pod uwagę to wszystko? – JS1

+0

Tak, wierzę, że to jest montaż AT & T-skład x86. Został stworzony z kodu c na linuxie @Dai – scottybobby

Odpowiedz

9

Nie przesadzaj. Stopniowo zamień zespół na C. Oto możliwa sekwencja transformacji.

.LFBO 
    pushq %rbp 
    movq %rsp,%rbp 
    movl %edi,-4(%rbp) 
    movl %esi,-8(%rbp) 
    movl -4(%rbp),%eax 
    compl -8(%rbp),%eax 
    jg  .L2 
    movl -8(%rbp),%eax 
    jmp  .L3 
.L2: 
    movl -4(%rbp),%eax 
.L3: 
    popq %rbp 
    ret 

---- 

int LFBO (int edi, int esi) 
{ 
    rbp = rsp 
    [rbp - 4] = edi 
    [rbp - 8] = esi 
    eax = [rbp - 4] 
    if (eax > [rbp - 8]) goto L2 
    eax = [rbp - 8] 
    goto L3 
L2: 
    eax = [rbp - 4] 
L3: 
    return eax 
} 

---- 

int LFBO (int edi, int esi) 
{ 
    rbp = rsp 
    [rbp - 4] = edi 
    [rbp - 8] = esi 
    eax = [rbp - 4] 
    if (eax <= [rbp - 8]) { 
     eax = [rbp - 8] 
    } 
    else { 
     eax = [rbp - 4] 
    } 
    return eax 
} 

---- 

int LFBO (int edi, int esi) 
{ 
    int eax; 

    eax = edi; 
    if (eax <= esi) { 
     eax = esi; 
    } 
    else { 
     eax = edi; 
    } 
    return eax; 
} 

---- 

int LFBO (int edi, int esi) 
{ 
    if (edi <= esi) { 
     return esi; 
    } 
    else { 
     return edi; 
    } 
} 

---- 

int LFBO (int x, int y) 
{ 
    if (x <= y) { 
     return y; 
    } 
    else { 
     return x; 
    } 
} 

---- 

int LFBO (int x, int y) 
{ 
    return (x > y) ? x : y; 
} 

Możesz zastosować tę strategię do dowolnego elementu zespołu. Tutaj poświęciłem czas na szczegółowe przemiany. Dzięki praktyce możesz osiągnąć efekt końcowy o wiele szybciej.

+0

To jest niesamowite. Dzięki za pomoc! – scottybobby

2
LFB0(int x, int y){ 
    if (x<=y){ 
     x = y; 
    }else{ 
     x = x; 
    } 
    return(x); 
} 

To jest to, co myślę, że uznane za prawidłowe, z pomocą chłopaków w komentarze.

+0

@thang to nie to samo? – scottybobby

0
.LFBO 
    pushq %rbp    prolog 
    movq %rsp,%rbp   prolog 
    movl %edi,-4(%rbp)  [ebp-4] = edi 
    movl %esi,-8(%rbp)  [ebp-8] = esi 
    movl -4(%rbp),%eax  eax = [ebp-4] ie edi 
    compl -8(%rbp),%eax  cmp eax with [ebp-8] ie esi 
    jg  .L2     ;jg requires <= 
    movl -8(%rbp),%eax  so cutting the junk 
    jmp  .L3     this effectively becomes 
.L2: 
    movl -4(%rbp),%eax  (edi <= esi) ? { eax = esi } : { eax= edi} ; return; 
.L3: 
    popq %rbp    epilog 
    ret       epilog 

testowania hipotezy

lets compile the code in vc and test should compile unoptimized else 
clever compiler will cast away everything do 
/O1 push 10 pop eax retn; 
/O2 mov eax ,10 ret 

int main(void) { 
int edi=8,esi=10; 
if (edi <= esi) { return esi; } else { return edi;} 
} 

demontażu wynik

0:000> uf @eip 
image00400000+0x1000: 
00401000 55    push ebp 
00401001 8bec   mov  ebp,esp 
00401003 83ec08   sub  esp,8 
00401006 c745fc08000000 mov  dword ptr [ebp-4],8 
0040100d c745f80a000000 mov  dword ptr [ebp-8],0Ah 
00401014 8b45fc   mov  eax,dword ptr [ebp-4] 
00401017 3b45f8   cmp  eax,dword ptr [ebp-8] 
0040101a 7f07   jg  image00400000+0x1023 (00401023) 

image00400000+0x101c: 
0040101c 8b45f8   mov  eax,dword ptr [ebp-8] 
0040101f eb05   jmp  image00400000+0x1026 (00401026) 

image00400000+0x1023: 
00401023 8b45fc   mov  eax,dword ptr [ebp-4] 

image00400000+0x1026: 
00401026 8be5   mov  esp,ebp 
00401028 5d    pop  ebp 
00401029 c3    ret 
0:000>