Kod jestOdnalezienie brakującego kodu C, z podanym kodem zespołu?
int f(int x, int y, int z) {
if (/* missing code here */)
return z;
else
return -z;
}
i montaż jest
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
cmpl 12(%ebp), %eax
jge .L2
movl 16(%ebp), %eax
jmp .L3
.L2:
movl 16(%ebp), %eax
negl %eax
.L3:
popl %ebp
ret
I pytanie prosi mnie, aby znaleźć to, co brakuje wyrażenie test musi być w celu otrzymania kodu montażu podane. W porządku, dość łatwo. Istnieje oczywiste porównanie pomiędzy x
i y
. Operator jge
zamierza wykonać skok w ciele pętli, jeśli 12(%ebp) > %eax
.
Możliwe wybory są
x<=y
x>=y
x>y
x<y
Moja odpowiedź była x<=y
, ponieważ 12(%ebp)
jest nawiązaniem do y
, i to jest celem. Ale ta odpowiedź była błędna i nie wiem, jak to zrobić. Jakieś wskazówki? Dziękuję bardzo.
Czy jge nie znaczy: skok większy lub równy? '> =' –
Możesz dekompilować/dezasemblować, ale szczerze mówiąc nie ma tam zbyt wiele, więc prawdopodobnie mógłbyś spróbować dowiedzieć się, co się dzieje. Myślę, że to robi x - y ('8 (% ebp)' i '12 (% ebp)' są pierwszymi argumentami funkcji poza stosem), a następnie przeskakiwanie, jeśli jest większe od zera. Co dla mnie oznacza, że x jest większe niż y. –
Używając składni intel i pseudo kodu, porównanie jest równoważne 'cmp x, y'. Stąd dochodzimy do gałęzi 'return -z' jeśli x> = y.Ponieważ chcemy wiedzieć, jaki jest testowany warunek, po prostu odwracamy ten test, dając nam test, który musi dać wynik prawdziwy dla pożądanej gałęzi. Wkrótce staje się jasne, że faktycznym testowanym warunkiem było x = y). –
enhzflep