Модератор: Модераторы
{$ASMMODE INTEL}
var
i, ii : LongInt;
begin
asm
push eax
mov eax, 777
mov i, eax
dec eax
mov eax, i
mov ii, eax
pop eax
end;
WriteLn(i,' ',ii);
end.
Signaling changed registers
When the compiler uses variables, it sometimes stores them, or the result of some calculations, in
the processor registers. If you insert assembler code in your program that modifies the processor
registers, then this may interfere with the compiler’s idea about the registers. To avoid this problem,
Free Pascal allows you to tell the compiler which registers have changed in an asm block. The
compiler will then save and reload these registers if it was using them. Telling the compiler which
registers have changed is done by specifying a set of register names behind an assembly block, as
follows:
asm
...
end [’R1’, ... ,’Rn’];
Here R1 to Rn are the names of the registers you modify in your assembly code.
As an example:
asm
movl BP,%eax
movl 4(%eax),%eax
movl %eax,__RESULT
end [’EAX’];
This example tells the compiler that the EAX register was modified.
For assembler routines, i.e., routines that are written completely in assembler, the ABI of the processor
& platform must be respected, i.e. the routine itself must know what registers to save and what
not. The method described above doesn’t apply there.
The only thing the compiler does, is create a minimal stack frame if needed (e.g. when variables are
declared). All the rest is up to the programmer.
{$ASMMODE INTEL}
var
i, ii : LongInt;
begin
asm
mov eax, 777
mov i, eax
dec eax
mov eax, i
mov ii, eax
end ['EAX'];
WriteLn(i,' ',ii);
end.
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6