[تمرين] : عمل محاكاة للدالة rgb
#1
السلام عليكم و رحمة الله و بركاته

المطلوب : عمل دالة MakeRGB تعمل نفس عمل الدالة RGB
+ عمل محاكاة للدوال التالية GetRValue,GetGValue,GetBValue

PHP كود :
function MakeRGB(r, g, b: Byte): COLORREF;
function 
GetBValueX(RGB:Cardinal):Byte;
function 
GetGValueX(RGB:Cardinal):Byte;
function 
GetRValueX(RGB:Cardinal):Byte; 

الشروط :
- يمنع استخدام دوال جاهزة
- يمنع استخدام التعليمات التالية : XOR , OR,SHL,SHR,ROR,ROL
-يمكنك ان أحببت أن تستخدم الأسمبلي بشرط مراعاة الشرطين السابقين
المدة : أسبوع قابل للتمديد (على حسب الحلول)
[COLOR="Red"]انتهت مدة التمرين
[/COLOR]------------------------------------------------
عدد الأعضاء الذين استطاعوا حل التحدي اثنين فقط (كنت أتوقع الكثير ) :
[COLOR="red"]- B.M.AbdelAziZ
- ALmuhhnad[/COLOR]

حلول الأخ B.M.AbdelAziZ :
PHP كود :
{            By B.M.AbdelAziZ              }
function 
MakeRGB(r, g, b: Byte): COLORREF;
begin
  result
:=b*$10000+g*$100+r;
end;
function 
GetBValueX(RGB:Cardinal):Byte;
begin
  result
:= RGB div $10000;
end;
function 
GetGValueX(RGB:Cardinal):Byte;
begin
  result
:= RGB div $100;
end;
function 
GetRValueX(RGB:Cardinal):Byte;
begin
  result
:= RGB div 1;
end;
{-------------------------------------------------------------------------}
type
  TCoulor 
= record
    
case Integer of
      0
:(color: Dword);
      
1:(r,g,b,nop: byte);
  
end;
Var 
Coulor : TCoulor;
function 
MakeRGB2(r, g, b: Byte): COLORREF;
begin
  Coulor
.r:=r;
  
Coulor.g:=g;
  
Coulor.b:=b;
  
result:=Coulor.color;
end;
function 
GetBValueX2(RGB:Cardinal):Byte;
begin
  result
:=Coulor.b;
end;
function 
GetGValueX2(RGB:Cardinal):Byte;
begin
  result
:=Coulor.g;
end;
function 
GetRValueX2(RGB:Cardinal):Byte;
begin
  result
:=Coulor.r;
end; 
حلول الأخ ALmuhhnad :
PHP كود :
{            By ALmuhhnad               }
function 
MakeRGB(R,G,B : Byte):Cardinal ;
begin
  Result 
:= B * $10000;
  
asm
    MOV EAX
,0
    MOV EAX
,Result
    MOV AH
,G
    MOV AL
,R
    MOV Result
,EAX
  end
;
end;

function 
GetRValue_T(RGB : Cardinal):Byte ;
begin
  asm
    MOV EAX
,RGB
    MOV Result
,AL
  end
;
end;

function 
GetGValue_T(RGB : Cardinal):Byte ;
begin
  asm
    MOV EAX
,RGB
    MOV Result
,AH
  end
;
end;

function 
GetBValue_T(RGB : Cardinal):Byte ;
begin
  Result 
:= RGB div $10000;
end;  
{-------------------------------------------------------------------------}
function 
MakeRGB2(R,G,B : Byte):Cardinal ;
begin
  asm
    MOV EAX
,0
    MOV AL
,B
    MOV ECX
,$10000
    MUL EAX
,ECX
    MOV AL
,G
    MOV CX
,$100
    MUL AX
,CX
    MOV AL
,R
    MOV Result
,EAX
  end
;
end; 
function 
GetRValueX(RGB : Cardinal):Byte;
asm
  MOV BYTE PTR DS
:[Result],AL
end
;

function 
GetGValueX(RGB : Cardinal):Byte;
asm
  MOV BYTE PTR DS
:[Result],AH
end
;

function 
GetBValueX(RGB : Cardinal):Byte;
asm
  PUSH EAX
  MOV CL
,BYTE PTR DS:[ESP+2]
  
POP EAX
  MOV AL
,CL
end
;
function 
MakeRGB3(R,G,B : Byte):Cardinal;
asm
  MOV BYTE PTR DS
:[Result],AL
  MOV BYTE PTR DS
:[Result+1],DL
  MOV BYTE PTR DS
:[Result+2],CL
end
;  
function 
GetBValueX2(RGB : Cardinal):Byte;
asm
  SAR EAX
,$10
end
; 

حلول صاحب التحدي SMP3 :
PHP كود :
{    By SMP3       }
function 
GetRValueX(RGB:Cardinal):Byte;
var
  
RGBB:PByte;
begin
  RGBB
:= @RGB ;
  
Result:=RGBB^;
end;

function 
GetGValueX(RGB:Cardinal):Byte;
var
  
RGBB:PByte;
begin
  RGBB
:= @RGB ;
  
Inc(RGBB);
  
Result:=RGBB^;
end;

function 
GetBValueX(RGB:Cardinal):Byte;
var
  
RGBB:PByte;
begin
  RGBB
:= @RGB ;
  
Inc(RGBB,2);
  
Result:=RGBB^;
end;

function 
MakeRGB(R, G, B: Byte): COLORREF;
begin
 Result 
:= ((B * $10000) + (G * $100) - (B * $10000) and (G * $100))  ;
 
Result := Result + R - ( Result and R);
end;

{-------------------------------------------------------------------------------------}

type TRGB = record
     R
:Byte;
     
G:Byte;
     
B:Byte;
end;
PRGB= ^TRGB ;

function 
GetRValueX2(RGB:Cardinal):Byte;
var 
RGBStruc:PRGB;
begin
  RGBStruc
:=@RGB;
  
Result:=RGBStruc.R;
end;

function 
GetGValueX2(RGB:Cardinal):Byte;
var 
RGBStruc:PRGB;
begin
  RGBStruc
:=@RGB;
  
Result:=RGBStruc.G;
end;

function 
GetBValueX2(RGB:Cardinal):Byte;
var 
RGBStruc:PRGB;
begin
  RGBStruc
:=@RGB;
  
Result:=RGBStruc.B;
end;

function 
MakeRGB2(R,G,B:Byte):COLORREF;
var 
RGBStruc:TRGB;
    
RGB:PInteger;
    
P:PByte;
begin
  RGBStruc
.R:=R;
  
RGBStruc.G:=G;
  
RGBStruc.B:=B;
  
P:=@RGBStruc.B;
  
Inc(P);
  
P^:=$00;
  
RGB:=@RGBStruc.R;
  
Result:=RGB^;
end;

{-------------------------------------------------------------------------------------}
{
$IFNDEF PUREPASCAL}

function 
GetRValueX3(RGB:Cardinal):Byte;
asm
{$IFDEF CPUX64}
    
MOV AL,CL
{$ENDIF}
end;

function 
GetGValueX3(RGB:Cardinal):Byte;
asm
{$IFDEF CPUX64}
    
MOV AL,CH
{$ELSE  !CPUX64}
    
MOV AL,AH
{$ENDIF !CPUX64}
end;

function 
GetBValueX3(RGB:Cardinal):Byte;
asm
{$IFDEF  CPUX64}
    
BSWAP ECX
    MOV AL
,CH
{$ELSE  !CPUX64}
    
BSWAP EAX
    MOV AL
,AH
{$ENDIF !CPUX64}
end;

function 
MakeRGB3(R,G,B:Byte): COLORREF;
asm
{$IFDEF CPUX64}
    
MOV AL,CL
    MOV AH
,DL
    BSWAP EAX
    MOV AL
,R8B
    
XOR AL,AL //MOV AH,00
    
XCHG AL,AH
    BSWAP EAX
{$ELSE !CPUX64}
    
MOV AH,DL
    BSWAP EAX
    MOV AH
,CL
    
XOR AL,AL //MOV AL,00
    
BSWAP EAX
{$ENDIF !CPUX64}
end;

{-------------------------------------------------------------------------------------}

function 
GetRValueX4(RGB:Cardinal):Byte;{$IFDEF CPUX86}pascal;{$ENDIF}
asm
{$IFDEF CPUX86}
    
MOV  AL,[EBP+$8]
{
$ELSE !CPUX86}
    
PUSH RCX
    POP  RCX
    MOV  AL
,[RSP-$8]
{
$ENDIF !CPUX86}
end;
function 
GetGValueX4(RGB:Cardinal):Byte;{$IFDEF CPUX86}pascal;{$ENDIF}
asm
{$IFDEF CPUX86}
    
MOV  AL,[EBP+$9]
{
$ELSE !CPUX86}
    
PUSH RCX
    POP  RCX
    MOV  AL
,[RSP-$7]
{
$ENDIF !CPUX86}
end;
function 
GetBValueX4(RGB:Cardinal):Byte;{$IFDEF CPUX86}pascal;{$ENDIF}
asm
{$IFDEF CPUX86}
    
MOV  AL,[EBP+$A]
{
$ELSE !CPUX86}
    
PUSH RCX
    POP  RCX
    MOV  AL
,[RSP-$6]
{
$ENDIF !CPUX86}
end;

(*function 
MakeRGB4(R,G,B:Byte):COLORREF;
asm
{$IFDEF CPUX64}
    
MOV     [EBP+$8],CL
    MOV     
[EBP+$9],DL
    MOV     
[EBP+$A],R8B
    MOV     
[EBP+$B],$00
    MOV EAX
,[EBP+$8]
{
$ELSE !CPUX64}
    
MOV     [EBP-$4],AL
    MOV     
[EBP-$3],DL
    MOV     
[EBP-$2],CL
    MOV     
[EBP-$1],$00
    MOV EAX
,[EBP-$4]
{
$ENDIF !CPUX64}
end;*)

function 
MakeRGB4(R,G,B:Byte):COLORREF;
asm
{$IFDEF CPUX86}
    
MOV    BYTE [Result+$0],AL
    MOV    BYTE 
[Result+$1],CL
    MOV    BYTE 
[Result+$2],DL
{$ELSE}
    
MOV    BYTE [Result+$0],CL
    MOV    BYTE 
[Result+$1],DL
    MOV    BYTE 
[Result+$2],R8B
{$ENDIF}
    
MOV    BYTE [Result+$3],$00
end
;

{-------------------------------------------------------------------------------------}

function 
GetRValueX5(RGB:Cardinal):Byte;
asm
{$IFDEF CPUX86}
    
PUSH EAX
    POP  EAX
    MOV  AL
,BYTE PTR DS:[ESP-$4]
{
$ELSE  !CPUX86}
    
PUSH RCX
    POP  RCX
    MOV  AL
,[RSP-$8]
{
$ENDIF  !CPUX86}
end;
function 
GetGValueX5(RGB:Cardinal):Byte;
asm
{$IFDEF CPUX86}
    
PUSH EAX
    POP  EAX
    MOV  AL
,BYTE PTR DS:[ESP-$3]
{
$ELSE  !CPUX86}
    
PUSH RCX
    POP  RCX
    MOV  AL
,[RSP-$7]
{
$ENDIF  !CPUX86}
end;
function 
GetBValueX5(RGB:Cardinal):Byte;
asm
{$IFDEF CPUX86}
    
PUSH EAX
    POP EAX
    MOV AL
,BYTE PTR DS:[ESP-$2]
{
$ELSE  !CPUX86}
    
PUSH RCX
    POP  RCX
    MOV AL
,[RSP-$6]
{
$ENDIF  !CPUX86}
end;

{-------------------------------------------------------------------------------------}

function 
SwapX(X:Cardinal):Cardinal ;
asm
{$IFNDEF CPUX86}
   
MOV EAX,ECX
{$ENDIF}
   
BSWAP EAX
end
;

function 
GetRValueX6(RGB:Cardinal):Byte;
begin
Result
:=Byte(RGB);
end;

function 
GetGValueX6(RGB:Cardinal):Byte;
begin
Result
:=Byte(SwapX(WORD(RGB)*$10000));
end;

function 
GetBValueX6(RGB:Cardinal):Byte;
begin
Result
:=Byte(SwapX(RGB*$100));
//Result:=Byte(SwapX((RGB-WORD(RGB))*$100));
end;
{
$ENDIF !PUREPASCAL} 

هدية للأخ virtual :
PHP كود :
A Or B = (A+B) - (A And B) 
الرد


الردود في هذا الموضوع
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 28-04-2013, 06:39 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 29-04-2013, 04:46 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة virtual - 29-04-2013, 11:36 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 30-04-2013, 12:00 AM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 30-04-2013, 12:30 AM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة virtual - 30-04-2013, 10:41 AM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 30-04-2013, 11:08 AM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة virtual - 30-04-2013, 01:41 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 30-04-2013, 02:20 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 30-04-2013, 02:22 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 01-05-2013, 03:09 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 01-05-2013, 03:16 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 01-05-2013, 05:30 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 01-05-2013, 05:56 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 01-05-2013, 06:01 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 01-05-2013, 06:43 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 01-05-2013, 06:46 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 01-05-2013, 09:24 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 01-05-2013, 09:46 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 02-05-2013, 12:25 AM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 02-05-2013, 02:36 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 03-05-2013, 02:01 AM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 05-05-2013, 02:12 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 05-05-2013, 02:43 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 05-05-2013, 03:38 PM
[تمرين] : عمل محاكاة للدالة rgb - بواسطة SMP3 - 06-05-2013, 05:42 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم