Einzelnen Beitrag anzeigen

Olli
(Gast)

n/a Beiträge
 
#6

Re: Fehler beim Byte-Swap mit Assembler in Delphi

  Alt 1. Jul 2005, 22:04
Zitat von turboPASCAL:
Delphi-Quellcode:
// summe = summe + Value;

add eax, [Value]
// oder so?
add eax, Value
Das kommt immer darauf an. Wenn Value als var/const übergeben wird, kann das sein.

Delphis register ist fast wie __fastcall in C. Der erste Wert kommt in EAX, der zweite in ECX, der dritte in EDX, der Rest auf dem Stack, wenn ich nicht irre. Außerdem werden 32bit-Werte in EAX übergeben. 64bit in EAX:EDX.
Reihenfolge nachträglich korrigiert!

Die OH sagt dazu:
You can write complete procedures and functions using inline assembler code, without including a begin...end statement. For example,

Delphi-Quellcode:
function LongMul(X, Y: Integer): Longint;   

asm
  MOV EAX,X
  IMUL Y
end;
The compiler performs several optimizations on these routines:

No code is generated to copy value parameters into local variables. This affects all string-type value parameters and other value parameters whose size isn’t 1, 2, or 4 bytes. Within the routine, such parameters must be treated as if they were var parameters.
Unless a function returns a string, variant, or interface reference, the compiler doesn’t allocate a function result variable; a reference to the @Result symbol is an error. For strings, variants, and interfaces, the caller always allocates an @Result pointer.

The compiler generates no stack frame for routines that aren’t nested and have no parameters or local variables.
The automatically generated entry and exit code for the routine looks like this:

Delphi-Quellcode:
PUSH EBP ;Present if Locals <> 0 or Params <> 0

MOV EBP,ESP ;Present if Locals <> 0 or Params <> 0
SUB ESP,Locals ;Present if Locals <> 0
 ...
MOV ESP,EBP ;Present if Locals <> 0
POP EBP ;Present if Locals <> 0 or Params <> 0
RET Params ;Always present
If locals include variants, long strings, or interfaces, they are initialized to zero but not finalized.

Locals is the size of the local variables and Params is the size of the parameters. If both Locals and Params are zero, there is no entry code, and the exit code consists simply of a RET instruction.

Assembler functions return their results as follows.

Ordinal values are returned in AL (8-bit values), AX (16-bit values), or EAX (32-bit values).
Real values are returned in ST(0) on the coprocessor’s register stack. (Currency values are scaled by 10000.)
Pointers, including long strings, are returned in EAX.
Short strings and variants are returned in the temporary location pointed to by @Result.
  Mit Zitat antworten Zitat