asm ['xxx', 'yyy']

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

asm ['xxx', 'yyy']

Beitragvon Mathias » 6. Okt 2017, 15:56 asm ['xxx', 'yyy']

In einem AVR-String-Thread, wurden beim end von einem asm-Block Register in [] geschrieben ?
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 ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3249
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Socke » 6. Okt 2017, 16:07 Re: asm ['xxx', 'yyy']

Mit Inline-Assembler kann man direkt auf die Prozessorregister zugreifen.
Damit der Compiler die dort verwendeten Register nicht selbst nutzt und damit den Assembler-Code des Entwicklers verändert, muss man dem Compiler mitteilen, welche Register man verändert hat.

Edit: hier der Link zur Dokumentation.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
 
Beiträge: 2393
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon Mathias » 6. Okt 2017, 17:16 Re: asm ['xxx', 'yyy']

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 ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3249
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon thosch » 6. Okt 2017, 20:50 Re: asm ['xxx', 'yyy']

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 ?


Ich verstehe es so, dass der Compiler den Stackrahmen, im Dokubeispiel:

Code: Alles auswählen
 
asm
   push EAX
   //mach irgendwas mit EAX
   pop EAX
end;
 


bei Angabe der veränderten Register automatisch setzt. Sonst muss der Programmierer das machen.

.
thosch
 
Beiträge: 69
Registriert: 10. Jul 2017, 19:32

Beitragvon Mathias » 7. Okt 2017, 16:33 Re: asm ['xxx', 'yyy']

Ich verstehe es so, dass der Compiler den Stackrahmen, im Dokubeispiel:

Ich kann da nirgends ein push/pop für ax und bx sehen.

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.
 
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3249
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon kupferstecher » 7. Okt 2017, 16:52 Re: asm ['xxx', 'yyy']

Mathias hat geschrieben:Ich kann da nirgends ein push/pop für ax und bx sehen.

Genau deswegen gibt es dieses Konstrukt, anstatt einfach im Assemblerbereich händisch zu pushen/poppen. Allein der Compiler hat den Überblick, ob die Register in Gebrauch sind. In deinem Beispiel sind sie nicht in Gebrauch, die Stackoperationen erübrigen sich damit.
kupferstecher
 
Beiträge: 77
Registriert: 17. Nov 2016, 11:52

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried