Dies scheint auch auf der Intel-Plattform kompilierbar.
Code: Alles auswählen
{$ASMMODE intel}
procedure test;
begin
asm
mov ax, bx;
end ['ax', 'bx'];
end;
Nur zu Frage für was ist dies gut ?
Code: Alles auswählen
{$ASMMODE intel}
procedure test;
begin
asm
mov ax, bx;
end ['ax', 'bx'];
end;
Mathias hat geschrieben:Habe ich das richtig verstanden, damit wird verhindert, das der Compiler vor dem asm-Block etwas in das ax-Register lädt und nach dem asm-Block den Inhalt des ax-Register verwenden will ?
Code: Alles auswählen
asm
push EAX
//mach irgendwas mit EAX
pop EAX
end;
Ich verstehe es so, dass der Compiler den Stackrahmen, im Dokubeispiel:
Code: Alles auswählen
procedure test;
begin
asm
mov ax, bx;
nop;
nop;
nop;
end ['ax', 'bx'];
asm
mov ax, bx;
nop;
nop;
nop;
end;
end;
Code: Alles auswählen
project1.lpr:6 begin
00000000004001C0 55 push %rbp
00000000004001C1 4889e5 mov %rsp,%rbp
00000000004001C4 488d6424f0 lea -0x10(%rsp),%rsp
00000000004001C9 48895df8 mov %rbx,-0x8(%rbp)
project1.lpr:8 mov ax, bx;
00000000004001CD 6689d8 mov %bx,%ax
project1.lpr:9 nop;
00000000004001D0 90 nop
project1.lpr:10 nop;
00000000004001D1 90 nop
project1.lpr:11 nop;
00000000004001D2 90 nop
project1.lpr:14 mov ax, bx;
00000000004001D3 6689d8 mov %bx,%ax
project1.lpr:15 nop;
00000000004001D6 90 nop
project1.lpr:16 nop;
00000000004001D7 90 nop
project1.lpr:17 nop;
00000000004001D8 90 nop
project1.lpr:19 end;
00000000004001D9 488b5df8 mov -0x8(%rbp),%rbx
00000000004001DD c9 leaveq
00000000004001DE c3 retq
00000000004001DF 00 add %dl,0x48(%rbp)
project1.lpr:22 begin
00000000004001E0 55 push %rbp
00000000004001E1 4889e5 mov %rsp,%rbp
00000000004001E4 e897650100 callq 0x416780 <fpc_initializeunits>
project1.lpr:23 test;
00000000004001E9 e8d2ffffff callq 0x4001c0 <TEST>
project1.lpr:24 end.
Mathias hat geschrieben:Ich kann da nirgends ein push/pop für ax und bx sehen.