Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Inline Assembler (https://www.delphipraxis.net/144936-inline-assembler.html)

Luckie 20. Dez 2009 02:50


Inline Assembler
 
Delphi-Quellcode:
procedure CvtInt;
{ IN:
    EAX: The integer value to be converted to text
    ESI: Ptr to the right-hand side of the output buffer: LEA ESI, StrBuf[16]
    ECX: Base for conversion: 0 for signed decimal, 10 or 16 for unsigned
    EDX: Precision: zero padded minimum field width
  OUT:
    ESI: Ptr to start of converted text (not start of buffer)
    ECX: Length of converted text
}
asm
        OR     CL,CL
        JNZ    @CvtLoop
@C1:   OR     EAX,EAX
        JNS    @C2
        NEG    EAX
        CALL   @C2
        MOV    AL,'-'
        INC    ECX
        DEC    ESI
        MOV    [ESI],AL
        RET
@C2:   MOV    ECX,10

@CvtLoop:
        PUSH   EDX
        PUSH   ESI
@D1:   XOR    EDX,EDX
        DIV    ECX
        DEC    ESI
        ADD    DL,'0'
        CMP    DL,'0'+10
        JB     @D2
        ADD    DL,('A'-'0')-10
@D2:   MOV    [ESI],DL
        OR     EAX,EAX
        JNE    @D1
        POP    ECX
        POP    EDX
        SUB    ECX,ESI
        SUB    EDX,ECX
        JBE    @D5
        ADD    ECX,EDX
        MOV    AL,'0'
        SUB    ESI,EDX
        JMP    @z
@zloop: MOV    [ESI+EDX],AL
@z:    DEC    EDX
        JNZ    @zloop
        MOV    [ESI],AL
@D5:
end;

////////////////////////////////////////////////////////////////////////////////
// Procedure : IntToHex
// Comment  :

function IntToHex(Value: Integer; Digits: Integer): string;
//  FmtStr(Result, '%.*x', [Digits, Value]);
asm
        CMP    EDX, 32        // Digits < buffer length?
        JBE    @A1
        XOR    EDX, EDX
@A1:   PUSH   ESI
        MOV    ESI, ESP
        SUB    ESP, 32
        PUSH   ECX           // result ptr
        MOV    ECX, 16        // base 16     EDX = Digits = field width
        CALL   CvtInt
        MOV    EDX, ESI
        POP    EAX           // result ptr
        CALL   System.@LStrFromPCharLen
        ADD    ESP, 32
        POP    ESI
end;
Fehlermeldung:
[/quote]units\MpuTools.pas(339,1) Fatal: Syntax error, "BEGIN" expected but "ASM" found[quote]
Setze ich vor Zeile 11 das begin

kommt folgende Fehlermeldungen für die Zeile 58:
[quote]units\MpuTools.pas(386,1) Error: Illegal expression
units\MpuTools.pas(386,10) Fatal: Syntax error, ";" expected but "identifier INTTOHEX" found

BUG 20. Dez 2009 03:18

Re: Inline Assembler
 
Wenn du nur vor Zeile 11 ein begin setzt, kann es sein das da in Zeile 52 ein end; zu wenig ist :mrgreen:

MfG,
Bug

Luckie 20. Dez 2009 06:41

Re: Inline Assembler
 
Zitat:

Zitat von BUG
Wenn du nur vor Zeile 11 ein begin setzt, kann es sein das da in Zeile 52 ein end; zu wenig ist :mrgreen:

MfG,
Bug

Mist, ich dachte, das hätte ich ausprobiert. Jetzt geht es.

Balu der Bär 20. Dez 2009 08:36

Re: Inline Assembler
 
Zitat:

Zitat von Luckie
Bitte gib deinem Beitrag einen aussagekräftigen Titel. Der jetzige Titel lässt nicht erkennen, um was für ein Problem oder Frage es sich handelt. Um den Titel zu ändern, editiere einfach deinen ersten Beitrag. Damit erleichterst du das Auffinden deines Beitrages mit der Suche und ersparst anderen Mitglieder ein unnötiges Öffnen deines Beitrages.

:mrgreen:

sirius 20. Dez 2009 09:03

Re: Inline Assembler
 
Die Frage ist aber, warum funktioniert die Syntax da oben nicht? Bei mir funktioniert sie.
Was hast du denn da für einen Uraltcompiler verwendet? Musst du evtl. noch "assembler" als Direktive hinter die Funktion schreiben. :mrgreen:


Edit: Ach mist, dieses *** Lazarus-Forum :duck:
Und ich hatte extra noch nachgesehen, welche Delphi-Version Luckie benutzt.....

Edit2: Kann man dieses Lazarusforum vielleicht in einer anderen Farbe gestalten (kirschrot bspw.)? Das ist nicht das erste Mal, dass mir das passiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz