Witam. Zacznę od tego ze w assemblerze piszę od kilku godzin.
Potrzebowałem funkcji do zapisywania i odczytywania bitów.
Oto owoc mojej pracy:
program Project1;
{$APPTYPE CONSOLE}
function GetBit(Val, Index: Byte): Byte;
asm
MOV CL, DL
SHR AL, CL
AND AL, 01h
end;
procedure PutBit(Val: PByte; Index, Bit: Byte);
asm
AND EDX, 0ffh
CMP CL, 00h
JE @lb1
BTS [EAX], DX
JMP @end
@lb1: BTR [EAX], DX
@end: // end
end;
var
B: Byte;
I: Integer;
begin
B := 138; // 10001010b
PutBit(@B, 5, 1); // 10101010b
for I := 7 downto 0 do Write(GetBit(B, I));
ReadLn;
end.
Wygląda, że działa. Mam tylko kilka pytań:
- Zauważyłem że argumenty trafiają do rejestrów tyle że jakoś dziwnie (A, D i C) czy zawsze tak jest?
- Jak argument Index typu Byte jest w DL to w całym EDX jest jakaś inna liczba. Dlaczego?
- Czy zawsze wynik funkcji trzeba wstawić do EAX, AX lub AL ?
- W funkcji GetBit tam gdzie jest SHR AL, CL; próbowałem wstawić DL zamiast CL, ale program się nie chciał skompilować. Czemu tylko CL ?
- Czy te funkcje można napisać lepiej. Jeżeli tak to jak?
- Jak napisać funkcję, która zwróci 4 argument? Chodzi mi o ten tajemniczy stos? Czytałem gdzieś, że tam trafiają argumenty, które nie trafią do rejestrów. Próbowałem coś kombinować, ale nic mi z tego nie wychodziło.