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ć.
W jakim typie procesora znajduje się ten asembler? Motorola 68000? – Codor
'<' and '> =' są nawzajem inwersjami. Ten pierwszy (z '<') jest prawdopodobnie mniejszą lub szybszą instrukcją, więc jest to problem z optymalizacją. –
Czy to intel procesorowy x86? – user2584325