AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [asm]JMP bei Delphi-Inline-Assemlber

[asm]JMP bei Delphi-Inline-Assemlber

Ein Thema von SirThornberry · begonnen am 4. Jul 2006 · letzter Beitrag vom 4. Jul 2006
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#1

[asm]JMP bei Delphi-Inline-Assemlber

  Alt 4. Jul 2006, 11:57
Hallo,

ich will per Assemblerbefehl an die Adresse $00112233 springen

die Anweisung
Code:
jmp dword ptr [$00112233]
sorgt dafür das dorthin gesprungen wird worauf $00112233 zeigt
wenn ich
Code:
jmp [$00112233]
schreibe, wird automatisch von Delphi die erste Anweisung wieder daraus generiert (jmp dword ptr...)
Wie lautet die Anweisung um direkt zu einer Adresse zu springen?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: [asm]JMP bei Delphi-Inline-Assemlber

  Alt 4. Jul 2006, 12:10
Hallo,

vielleicht kannst du es mit einem kleinen Umweg lösen:

Code:
mov eax,$00112233
jmp eax
Es sollte aber auch eine direkte Möglichkeit geben.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: [asm]JMP bei Delphi-Inline-Assemlber

  Alt 4. Jul 2006, 12:15
auf so einfaches zeug bin ich natürli nicht gekommen. wobei ich trotzdem noch nach dem direkten weg suche
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#4

Re: [asm]JMP bei Delphi-Inline-Assemlber

  Alt 4. Jul 2006, 12:32
Zitat von SirThornberry:
wobei ich trotzdem noch nach dem direkten weg suche
BASM möchte unbedingt einen Relozierungseintrag erzeugen (die Adresse würde gefixt werden falls das Modul nicht an die gewünschte Adresse geladen werden kann). Du würdest diese Logik umgehen...
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: [asm]JMP bei Delphi-Inline-Assemlber

  Alt 4. Jul 2006, 13:02
achso... und weiß dann jemand wie der direkte Sprung binär aussieht?

die Anweisung
jmp dword ptr [$00564774]
sieht ja binär so aus
FF2574475600
also FF25 ist der Befehl und dahinter die Adresse.

Wie sieht das ganze bei einem direkten Sprung aus?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#6

Re: [asm]JMP bei Delphi-Inline-Assemlber

  Alt 4. Jul 2006, 13:53
Ansonsten war deine Angabe eh falsch, in Betracht auf dein Ziel,
jmp [$00112233] denn du wolltest doch bestimmt dieses verwirklichen?
jmp $00112233 die eckigen Klammern geben ja schließlich an, daß es dich bei der Angabe um einen "Zeiger" handeln soll.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: [asm]JMP bei Delphi-Inline-Assemlber

  Alt 4. Jul 2006, 13:54
Der Opcode für einen direkten unbedingten Sprung ist $E9 - das wird dir aber nicht viel helfen: danach muss nämlich nicht die Zieladresse angegeben werden sondern das "Displacement", also die Differenz zwischen der neuen und der aktuellen Code-Adresse. Darum erzeugen Assembler für so einen Befehl auch eine Relokation - der Linker muss die Adressdifferenz beim Binden nämlich erst noch berechnen.

Mache es doch wie vorgeschlagen:
Code:
mov eax, $11223344
jmp eax
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: [asm]JMP bei Delphi-Inline-Assemlber

  Alt 4. Jul 2006, 13:56
Zitat von himitsu:
Ansonsten war deine Angabe eh falsch, in Betracht auf dein Ziel,
jmp [$00112233] denn du wolltest doch bestimmt dieses verwirklichen?
jmp $00112233 die eckigen Klammern geben ja schließlich an, daß es dich bei der Angabe um einen "Zeiger" handeln soll.
Ich bin in asm nicht so bewandert. Delphi hat immer rumgemeckert wenn ich die "[]" vergessen hab.
Desweiteren bin ich davon ausgegangen das "ptr" angibt das es sich um einen Pointer handelt.
Jetzt weiß ich aber wenigstens das man die eckigen Klammern bei einem direkten Sprung weg lassen muss/soll.
Nur die Binäre code für diese Anweisung (jmp $00112233) fehlt mir noch.

@Flocke: Ich hab einfach direkt hinter meinem Jmp-Befehl zur Zeit die eigentliche Sprungadresse hinterlegt.
Ich verweise somit also bei meinem Sprung auf die Adresse hinter dem Sprungbefehl wo wiederum die richtige steht.
Die Variante mit dem moven auf EAX hab ich nicht gewählt da ich nicht weiß ob EAX bereits belegt ist und ich somit den Wert überschreibe (bin nicht so bewandert in asm - ich guck in der Regel nur was Delphi für asm-code aus den Befehlen erzeugt und leite mir dann die Bedeutung durch Zunahme einer kleinen Hilfe her - somit sind mir die ganzen Register, deren Reihenfolge etc. unbekannt)

@Flocke: Bei E9 wird die Differenz angegeben? Das heißt man nimmt keinen "dword" mehr sondern einen Integer? Ist dabei sichergestellt das der Wertebereich des Integers auch groß genug ist?

benötigt hab ich das ganze für folgendes:
http://www.delphipraxis.net/internal...=573675#573675
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: [asm]JMP bei Delphi-Inline-Assemlber

  Alt 4. Jul 2006, 14:31
Zitat von SirThornberry:
Die Variante mit dem moven auf EAX hab ich nicht gewählt da ich nicht weiß ob EAX bereits belegt ist und ich somit den Wert überschreibe (bin nicht so bewandert in asm - ich guck in der Regel nur was Delphi für asm-code aus den Befehlen erzeugt und leite mir dann die Bedeutung durch Zunahme einer kleinen Hilfe her - somit sind mir die ganzen Register, deren Reihenfolge etc. unbekannt)
Da MessageBoxA dir das Ergebnis in EAX zurückliefert ist der Inhalt beim Aufruf irrelevant.

Zitat von SirThornberry:
@Flocke: Bei E9 wird die Differenz angegeben? Das heißt man nimmt keinen "dword" mehr sondern einen Integer? Ist dabei sichergestellt das der Wertebereich des Integers auch groß genug ist?
Die CPU interessiert eigentlich das Vorzeichen überhaupt nicht, Integer und Cardinal werden mit denselben Maschinenbefehlen addiert und subtrahiert. Da die CPU hier modulo 2^32 rechnet kommt das selbe heraus.

Alle "near jumps" sind PC-relativ, man gibt also nur den Adressversatz an und nicht die Zieladresse selbst. Dadurch müssen lokale Sprünge in Maschinensprache nicht reloziert werden (z.B. bedingte Sprünge bei if / while), denn der Versatz innerhalb deiner Prozedur ist nicht abhängig von der wirklichen Adresse. Im Grunde steht im Kompilat dann nicht "Springe zu Adresse X" sondern "Springe ab hier Y Byte nach vorne/hinten".

Wenn du unbedingt eine "inline"-Variante mit absoluter Adresse haben willst, dann nimm:
Code:
$68 aa:bb:cc:dd    // push aa:bb:cc:dd <- hier die Adresse einsetzen
$C3                 // ret
das ist äquivalent zu einem Sprung (jmp).
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: [asm]JMP bei Delphi-Inline-Assemlber

  Alt 4. Jul 2006, 14:39
bei
Code:
$68 aa:bb:cc:dd    // push aa:bb:cc:dd <- hier die Adresse einsetzen
$C3                 // ret
wird doch aber der Stack angefasst oder nicht? ich wollte eigentlich eine allgemeine Funktion schreiben welche die Funktion umleitet auf eine mit gleichen Parameter ohne berücksichtigung ob diese EAX verwendet oder nicht.

Danke für den Excurs mit der relativen Sprungadresse. Allerdings versteh ich das nicht ganz.
Wenn ich mich zur Zeit an Adresse 500 befinde und dann realtiv angebe das ich vor/zurück 50 springen will. Woher weiß dann der Prozessor ob ich zu 550 oder 450 springen will?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:59 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