asm ['xxx', 'yyy']

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

asm ['xxx', 'yyy']

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: asm ['xxx', 'yyy']

Beitrag von Socke »

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

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: asm ['xxx', 'yyy']

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Re: asm ['xxx', 'yyy']

Beitrag von thosch »

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.

.

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: asm ['xxx', 'yyy']

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: asm ['xxx', 'yyy']

Beitrag von kupferstecher »

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.

Antworten