In Delphi heb ik wat inline assembler geschreven. De functie IsPowerOfTwo controleert of de parameter Value een macht van twee is. De functie MakePowerOfTwo controleert of Value niet kleiner is dan LoBound en niet Groter is dan HiBound; als hieraan is voldaan, wordt Value opgerond naar de eerstvolgende macht van twee.
Iemand commentaar?
Delphi:
Delphi kent alleen de 80386 instructieset en retourneert de functiewaarde in AL/AX/EAX. Aangezien ik nog maar weinig ervaring heb met assembler ben ik benieuwd of mijn code een beetje efficiënt geschreven is of juist heel omslachtig. Het gaat me hierbij niet zozeer om de code die het snelst wordt uitgevoerd, maar om zo min mogelijk regels broncode.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| function IsPowerOfTwo(Value: Cardinal): Boolean; asm { Check if Value < 2 } CMP Value,2 JL @False { Check if only one bit is set } BSR ECX,Value BSF EDX,Value CMP ECX,EDX JNE @False MOV EAX,True JMP @End @False: MOV EAX,False @End: end; function MakePowerOfTwo(Value, LoBound, HiBound: Cardinal): Cardinal; asm { Test lower bound } CMP Value,LoBound JNL @High MOV EAX,LoBound JMP @End { Test higher bound } @High: CMP Value,HiBound JNG @1 MOV EAX,HiBound JMP @End @1: MOV EAX,Value { Check if only one bit is set } BSR ECX,Value BSF EDX,Value CMP ECX,EDX JE @End { Set Value to first higher power of two } MOV EAX,1 INC CL SHL EAX,CL @End: end; |
Iemand commentaar?
Een goede grap mag vrienden kosten.