Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Problem mit Assem (https://www.delphipraxis.net/179469-problem-mit-assem.html)

inflames 10. Mär 2014 10:43

Problem mit Assem
 
Hallo,

ich hab ein kleines Problem, wir steigen grad von Delphi5 auf Delphi 7 um und bei folgender Function bringt er einen "Inline Assembler Syntaxfehler" in der Zeile "cmp ecx,dword ptr[dw]" ich kann leider keine Assembler, vllt könnt Ihr mir da helfen.

Vielen Dank im vorraus!

Delphi-Quellcode:
function createAk(var ss:TAllowKeys):TAllowKeys;
var
 stp: pointer;                                   // stZugr
 ssp: pointer;                                   // allowkeys
 dw: dword;                                     // anzahl
begin
 stp:=@stZugr[1];
 ssp:=@ssAllk;
 dw:=14;
 asm
        push  bp
        push  esi
        push  edi
        mov   edi,stp                 // stZugr
        mov   esi,ssp                 // ssAllk
        mov   word ptr[esi],0          // leer
        xor   ecx,ecx
@@1:   mov   eax,esi                 // ssAllk[0]
        cmp   ecx,8
        jl    @@2
        inc   eax                     // ssAllk[1]
@@2:   mov   ebx,eax                 // ssAllk
        xor   eax,eax
        mov   al,byte ptr[ebx]        // byte->al
        cmp   byte ptr[edi+ecx],'0'   // st.offen?
        jne   @@4
        mov   al,byte ptr[ebx]
        or    eax,edx
        mov   byte ptr[ebx],al
@@4:   inc   ecx                     // weiter
        cmp   ecx,dword ptr[dw]       // 14-st?
        jge   @@e
        imul  edx,2
        cmp   edx,256
        jb    @@1
        mov   edx,1
        jmp   @@1
@@e:   pop   edi
        pop   esi
        pop   bp
 end;
 result:=ss;
end;

nuclearping 10. Mär 2014 11:54

AW: Problem mit Assem
 
Entweder legst du dw auf ein Register oder du übergibst die 14 direkt.
Delphi-Quellcode:
cmp ecx,dword ptr[14]


Sorry, schwachsinn. Ist bei mir auch schon ewig her. :D

Delphi-Quellcode:
cmp ecx,dword ptr[&dw]
Funktioniert.

Variablen musst du per &Variable übergeben.

inflames 10. Mär 2014 12:10

AW: Problem mit Assem
 
Habe es jetzt mit
Delphi-Quellcode:
cmp   ecx,14
gelöst.
Jetzt funktionierts :-D
Nach dem Debuggen in D5 hat aussgesehn, als obes nur ne Schleifenvariable wäre.
Vllt kanns einer der sich mehr damit ausskennt bestätigen :P

PS: Sorry wegen Titel hab's vercheckt ihn zu ergänzen und im nachhinein gehts leider nimmer ihn zu ändern :/

nuclearping 10. Mär 2014 12:14

AW: Problem mit Assem
 
Ja, ecx ist in dem Fall ein Durchlaufszähler und wird am Anfang mit
Delphi-Quellcode:
xor ecx, ecx
auf 0 gesetzt. Also die Schleife wird nach 15 (0-14) Durchläufen verlassen.

inflames 10. Mär 2014 12:15

AW: Problem mit Assem
 
Mit
Delphi-Quellcode:
cmp ecx,dword ptr[&dw]
funktioniert auch!
Vielen Danke für die Hilfe und die Erklärung!

Schönen Montag noch :thumb:

jaenicke 10. Mär 2014 12:19

AW: Problem mit Assem
 
Wobei es sehr sinnvoll ist alle Assemblerquelltexte auch mit purem Delphiquelltext per IFDEF daneben zu schreiben wie es auch in Delphi in der RTL gemacht wird. Denn wenn mal eine Kompilierung auf einer anderen Plattform oder auch nur 64-Bit ansteht, hat man sonst ein Riesenproblem...

Hat man aber eine Pure Pascal Variante, kann man auch einfach, auch in einem Fall wie diesem hier, diese aktivieren und es läuft erst einmal.

gammatester 10. Mär 2014 12:32

AW: Problem mit Assem
 
Noch ein Hinweis: Die eigentliche Fehlermeldung rührt daher, das dw eine Assemblerdirektive ist. Wenn Deine Variable zB cnt heißt, kannst Du ohne Probleme cmp ecx,dword ptr[cnt] benutzen. Wenn man mit Assembler arbeitet, sollte man solche Namen wie dw vermeiden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:17 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