Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Assembler: if-Anweisung? (https://www.delphipraxis.net/10243-assembler-if-anweisung.html)

Illuminator-23-5 14. Okt 2003 16:57


Assembler: if-Anweisung?
 
ich bin grad dabei, ein bisschen in assembler zu proggen, weils irgendwie auch spaß macht, und hab auch dazu ein paar tuts gelesen und auch manchen asm-code in somanchen delphiunits angeschaut.
Doch ich hab nun ein problem: eine if-abfrage kann ich mit cmp machen, sprich cmp a, b. Aber wie kann ich das nun auswerten? das ist ws in einem bestimmten Register gespeichert, aber wie heißt dieses?
ich glaube mir das so vorzustellen:
@@eins: //tu irgenwas
cmp EAX, EBX //Vergleichen
GroesserGleich //Wenns größer/gleich ist dann tu was dahinter steht
//Tu was...

Kann mir da jemand helfen?

nTE 14. Okt 2003 17:01

Re: Assembler: if-Anweisung?
 
Dazu gibt es (bedingte) Sprünge.
Zum Beispiel jne = jump if not equal

Delphi: if (a <> b) then...

Alle Sprünge die ich schonmal gehört habe: ;)

Code:
jne             jump if not equal
je              jump if equal
ja              jump if above
jna             jump if not above
jae             jump if above or equal
jnae            jump if not above or equal
jb              jump if below
jnb             jump if not below
jbe             jump if below or equal
jnbe            jump if not below or equal
jg              jump if greater
jng             jump if not greater
jge             jump if greater or equal
jnge            jump if not greater or equal
jl              jump if less
jnl             jump if not less
jle             jump if less or equal
jnle            jump if not less or equal
jmp oder jmps   jump directly to
Hast du dir schon mal ein x86 Buch angeschaut? Da stehen dann bestimmt alle drin (falss ich welche vergessen habe).
Gibts sogar kostenlos als pdf. :P


------
Und hier gleich mal ein Link dazu: Intel Handbücher

Illuminator-23-5 14. Okt 2003 17:16

Re: Assembler: if-Anweisung?
 
das is mehr als ich brauchte! Super! Thx!

CalganX 14. Okt 2003 17:37

Re: Assembler: if-Anweisung?
 
Hi,
wenn ich das nun richtig verstehe müsste ich das ungefähr so machen, richtig?
Code:
cmp EAX, EAB
je IstGleich
// Hier geht's weiter, wenn es nicht gleich ist
Chris

PS: Hast du ein eBook im PDF-Format als Link zufällig da liegen?

nTE 14. Okt 2003 18:06

Re: Assembler: if-Anweisung?
 
Chakotay:

Als eBook kann ich dir nur die Handbücher von Intel anbieten (die allerdings nicht soo schlecht sind, eben nur etwas mehr als nur die ASM Befehle beinhalten), da ich im Moment keinen Plan habe wo es kostenlose ASM Lernbücher runterzuladen gibt.

Und das Prinzip mit dem Jump hast du sehr gut verstanden. :D

CalganX 14. Okt 2003 18:20

Re: Assembler: if-Anweisung?
 
Hi,
Zitat:

Zitat von nTE
Als eBook kann ich dir nur die Handbücher von Intel anbieten (die allerdings nicht soo schlecht sind, eben nur etwas mehr als nur die ASM Befehle beinhalten), da ich im Moment keinen Plan habe wo es kostenlose ASM Lernbücher runterzuladen gibt.

Okay. Trotzdem danke.

Zitat:

Zitat von nTE
Und das Prinzip mit dem Jump hast du sehr gut verstanden. :D

Hehe. Das ist gut. :)

Chris

Illuminator-23-5 14. Okt 2003 18:20

Re: Assembler: if-Anweisung?
 
jup, so ca. mach ichs
z.B.:
Delphi-Quellcode:
if a >= b then
  ...
else
  ...
//Und nun das ganze in assembler
asm
MOV EBX, a
MOV EDX, b
CMP EBX, EDX
JB @@2
//Anweisungen des teiles (a >= b) = true
jmp @@3
@@2:
//Anweisungen des else-Teiles
@@3:
//und weiter gehts in der Prozedur...
end;
Müsste glaub ich so gehn...


Können da eigentlich recht schlimme Dinge passieren, wenn man ein bisschen zu viel mit assembler rumspielt?

nTE 14. Okt 2003 18:26

Re: Assembler: if-Anweisung?
 
Solange du nicht ring0 programmierst, kannst du dir eigentlich keine Hardware zerschiessen und selbst Windows sollte sich (wie man es von einem guten OS erwartet =) selbst schützen. (Würde ich mal sagen, keine Zitate, keine Gewähr ;)

Wenn du dich jetzt fragst was ring0 ist, dann bin ich mir sicher, dass du nicht ring0 codest. *g*

-------
btw, sprechende Namen helfen auch in ASM weiter =)
Wenn der Code allerdings nur zum hier zeigen war, dann hab ich nichts gesagt. :P

negaH 15. Okt 2003 00:10

Re: Assembler: if-Anweisung?
 
Code:
jne             jump if not equal
je              jump if equal
ja              jump if above
jna             jump if not above
jae             jump if above or equal
jnae            jump if not above or equal
jb              jump if below
jnb             jump if not below
jbe             jump if below or equal
jnbe            jump if not below or equal
jg              jump if greater
jng             jump if not greater
jge             jump if greater or equal
jnge            jump if not greater or equal
jl              jump if less
jnl             jump if not less
jle             jump if less or equal
jnle            jump if not less or equal
jmp oder jmps   jump directly to
Nich zu vergessen
Code:
jz              jump if zero
jnz             jump if not zero
jc              jump if carry
jnc             jump if not carry
jcxz            jump if CX = 0
jecxz           jump if ECX = 0
js              jump if sign
jns             jump if not sign
jo              jump if overlow
jno             jump if not overflow
jp              jump if parity
jnp             jump if not parity

Gruß hagen

negaH 15. Okt 2003 00:12

Re: Assembler: if-Anweisung?
 
Delphi-Quellcode:
if a >= b then
  ...
else
  ...
//Und nun das ganze in assembler
asm
MOV EBX, a
MOV EDX, b
CMP EBX, EDX
JB @@2 
//Anweisungen des teiles (a >= b) = true
jmp @@3 
@@2:
//Anweisungen des else-Teiles
@@3:
//und weiter gehts in der Prozedur...
end;
EBX muss unbedingt gesichert werden. Also entweder nutzt du PUSH EBX und POP EBX, oder du verzichtest auf die Verwendung von EBX ganz (was du auch solltest). Statt EBX bieten sich hier EAX und ECX an.

Sollten A und B Integer sein, also Vorzeichen behaften dann kannste JG oder JNLE verwenden, sollten A,B Cardinals sein, dann musst du JB oder JNAE verwenden.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr.
Seite 1 von 2  1 2      

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