2017-02-28 77 views
5

Próbuję porównać ac kod funkcji do równowartości montażu i rodzaj mylić w sprawie warunkowego skaczeskoki warunkowe - porównując kod C do montażu

enter image description here

Spojrzałam jl dyspozycję i mówi skakać, jeśli <, ale odpowiedź na pytanie brzmiała: >= Czy ktoś może wyjaśnić, dlaczego tak jest?

+0

W jakim typie procesora znajduje się ten asembler? Motorola 68000? – Codor

+1

'<' and '> =' są nawzajem inwersjami. Ten pierwszy (z '<') jest prawdopodobnie mniejszą lub szybszą instrukcją, więc jest to problem z optymalizacją. –

+0

Czy to intel procesorowy x86? – user2584325

Odpowiedz

4

Zgodnie z moim rozumieniem warunek jest odwrócony, ale logika jest taka sama; źródło C określa

jeśli warunek jest spełniony, należy wykonać następujące blok

natomiast źródłem zespół definiuje

jeśli warunek jest łamane, pomiń poniższy blok

co oznacza, że ​​przepływ wykonania będzie taki sam w obu implementacjach.

+0

zabawne, w tym przypadku warunek nie ulega zmianie. ale kolejność operatorów. oba warunki są "jeśli mniej", w asm to "jl" (tak samo jak "if <" w kodzie C), ale nie "a Tommylee2k

2

Zasadniczo to, co robi ten zespół, wykonuje swój warunek podczas ustawiania, ale przy użyciu logiki negatywnej.

Twój stan mówi:

Jeśli jest mniejsze niż b, powrót x. W przeciwnym razie zwróć y.

co mówi kod zespół (uproszczonych)

Move Y w buforze do zawracania. Przenieś b do innego bufora. Jeśli a jest większe niż b, przejdź do kroku powrotu. Następnie zwracana jest wartość y.. Jeśli a nie jest większe niż b, kontynuuj w programie. Następny krok przypisuje x do bufora powrotu. Krok po tym powraca jako normalny.

Wynik jest taki sam, ale proces jest nieco inny.

+0

masz stracił "a" w wyjaśnieniach –

+0

@ MichałWalenciak Dziękuję. Poprawiłem odpowiedź. Mylnie napisałem tam na x. – Magisch

1

zespół ma, linia po linii (code nieuwzględnione, bo pisał go jako obraz):

foo: 
    return_value (eax) = y; // !!! 
    temporary_edx = b;  // x86 can't compare memory with memory, so "b" goes to register 
    set_flags_by(a-b);  // cmp does subtraction and discards result, except flags 
    "jump less to return" // so when a < b => return y (see first line) 
    return_value (eax) = x; 
    return 

tak zrobić, że kod C zrobić to samo, czego potrzebujesz:

if (a >= b) { return x; } else { return y; } 

BTW, zobacz jak łatwo jest odwrócić:

if (a < b) { return y; } else { return x; } 

Więc nie ma sensu tłumaczyć jl do "mniej" w C, musisz wyśledzić każdą gałąź, co tak naprawdę się dzieje, i znaleźć dla każdej gałęzi obliczenia poprawne obliczenie strony C, a następnie "stworzyć" warunek w C, aby uzyskać te same obliczenia po obu stronach , więc to zadanie nie polega na "tłumaczeniu" zespołu, ale na rozszyfrowaniu logiki asm + i przepisaniu go ponownie w C.Wygląda na to, że całkowicie pomijasz punkt i spodziewałeś się, że uda ci się uciec z jakimś prostym tłumaczeniem "dopasuj wzór", podczas gdy musisz to w pełni zrozumieć.