Funkcje RCL i RCR w Delphi

0

Witam.

Kolejny problem z asmem i operacjami logicznymi. Otóż prosiłbym zorientowanych w temacie o przykład funkcji RCL oraz RCR w Delphi, bo zrobiłem póki co tak jak poniżej, ale to działa dla wartości poniżej A mniejszej od $00BA to znaczy zwraca takie wyniki jakie pokazuje Debugger dla śledzonego innego programu. Natomiast przy A = $0000, funkcja zwraca $00000000, a wedlug debuggera powinna zwrócić $00000001. Przydało by się też aby można było podawać jako A i S dowolne typy z zakresu, Byte, Word, DWord, a także aby funkcja zwracała DWord. Z góry dziękuję za pomoc i przykłady, bo bez Was nic nie wykombinuje lepszego, nie udało mi się wygooglować dobrego przykładu, a jak wspominałem w innym temacie z matmy ze mnie "noga", a w sprawach operacji logicznych zdaje się na kompilator i to co zwróci kod porównuje z wynikami w debuggerze przy śledzonym kodzie. Wiem, że mogę dać warunek if A < od iluś (no właśnie od ilu) to rób Inc(EAX), ale to bez sensu zacierać wyniki. Pewnie da się RCL i RCR zrobić inaczej i jednocześnie z prawidłowymi wynikami.

function RCL(A : Word; S : DWord) : DWord;
asm
  mov ecx, s
  rcl eax, cl
end;
0

function RCL(S : DWord) : DWord;
asm
mov eax, s
rcl eax,1
end; // starszy bit został w CF

0

Dziękuję za odpowiedź _13th_Dragon, widzę że chyba powróciłeś po dłuższej przerwie, bo wcześniej nie kojarzę Twoich postów, ale dobrze że się ktoś jeszcze udziela i pomaga jak może w postach dotyczących Pascala / Delphi. Co do Twojego kodu to niestety działa to tak jak do tej pory napisałem, otóż mam taki wycinek kodu w linijce 004019CF DX = 0000, a po linijce 004019D4 według debuggera rejestr EDX wynosi 00000001, a jakbym nie kombinował z funkcją RCL ona nadal zwraca w tym przypadku same zera. Natomiast dla kolejnych iteracji (bo ten wycinek kodu jest w pętli) Delphi zwraca wartość o jeden mniejszą niż pokazuje debugger, dopiero dla kolejnej którejś kolejnej wartości DX wyniki są takie jak w Debuggerze. Co robię nie tak? Może jakiś inny przykład dla funkcji, do ktorej można jako drugi parametr podać na przykład to co jest po "AH," czyli tutaj jedynkę, ale czasami dla funkcji RCL można podać inną większą wartość.

004019CF   . 66:D1D2        RCL DX,1
004019D2   . D0CC           ROR AH,1
004019D4   . 66:D1D2        RCL DX,1
0

Może wypróbuj to:
function RCL(S:DWord;var CF:Boolean):DWord;
asm
push eax // zachowaj S
mov al,[edx] // wpisz w al zmienną CF
rcr al,1 // przenieś do flagi CF
pop eax // odtwórz S
rcl eax,1 // zrób przesunięcie
push eax // zachowaj wynik
pushf // schowaj flagi
pop ax // odtworz flagi w ax
and al,1 // weź ostatni bit odpowiadający CF
mov [edx],al // wpisz w zmienną CF
pop eax // odtwórz wynik
end;

Problem polega na tym że nie kontrolujesz flagi CF, w podanym wyżej kodzie

0

Dzięki, już wszystko działa, chociaż nie dla wszystkich wariantów w śledzonym kodzie, ale to jak się wyśpie to spróbuje dojść dokłądnie dlaczego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1