Jump zu einem Far Pointer ?

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Krüsty, Marwin

Jump zu einem Far Pointer ?

Beitragvon Quicks3 » Dienstag 10. Mai 2005, 12:39

Hi

Was ich machen will:
Ich möchte ein Stück Code an eine andere Stelle im Ram kopieren und das Codesegment sowie den InstructionPointer (CS:IP) umsetzen (für einen ramtest)

Wie ich es bisher mache:
- Ich definiere den Anfang und das Ende des zu kopierenden Codes durch 2 Sprungmarken "BEGIN" und "ENDE"
- Der Offset, auf den ich nach dem Kopieren meinen IP setzen möchte wird durch die Marke "CONTINUE" bestimmt.
- Dann kopiere ich den ganzen code und möchte an den Offset von CONTINUE im kopierten code springen

Hier der vollständigkeit halber der gesamte code:
Das Kopieren funktioniert einwandfrei und er kopiert den code wie gewollt.
Nur er springt nicht an die stelle
Code: Alles auswählen
BEGIN:
    ; Initial Counter
    mov   cx, OFFSET ENDE       ;CX = Startoffset des Codes
    sub   cx, OFFSET BEGIN      ;CX = Startoffset des Codes - Endoffset des Codes = Codelänge
    shr   cx, 01h               ;CX = Codelänge / 2, da ich immer wortweise kopiere
   
    ; Copy Code
    mov   ax,1000h              ;das ziel-segment soll 1000h sein
    mov   es,ax                 ;initialisiere ES mit dem Zielsegment (1000h)
    mov   bx, OFFSET BEGIN      ;initialisiere BX mit dem Startoffset
    copyLoop:
      mov   ax, cs:[bx]         ;"Inhalt der Speicherstelle des Quell-Codes" nach AX
      mov   es:[bx], ax         ;AX nach "Inhalt der Speicherstelle des Ziel-Codes"
      add   bx, 2               ;Incrementiere BX um 2 (Springe 1 Wort weiter)
    loop  copyLoop              ;...solange bis die ganze Codelänge durchlaufen ist
   
    ; Jump to new code
    xor   edi, edi              ;Nulle edi
    mov   di, 1000h             ;Ziel-Segment nach di (EDI=00001000h)
    shl   edi, 16               ;Ziel-Segment an die oberen 16bit von edi shiften (EDI=10000000h)
    mov   di, OFFSET CONTINUE   ;Offset der Marke CONTINUE an die unteren 16bit von edi setzen
                                ;Sei der offset z.B. 1234h dann wäre nun EDI=10001234h
    jmp   far ptr edi           ;Springe an den offset (z.B. 1234h) im Segment 1000h
                                ;(also nach 1000:1234)

CONTINUE:
    ;ab hier sollte der kopierte code ausgeführt werden
   
EMDE:

Kann mir jemand sagen wie ich einen korrekten far-jump nach 1000:OFFSET CONTINUE mache ?

vielen dank für eure hilfe

grüssle
Quicks[/code]
Quicks3
Newbie
 
Beiträge: 3
Registriert: Donnerstag 21. April 2005, 11:41

Beitragvon crack » Donnerstag 12. Mai 2005, 08:42

Das ist von der Synaxconvention des Compilers abhängig bei MASM musst du mit:

CONTINUE LABEL FAR

das Label entsprechend deklarieren, wärend Du bei A86 oder A386 (die Compiler von Eric Isaacson) die jmp far 'Anweisung' benutzt.
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf


Zurück zu Assembler

 


  • { RELATED_TOPICS }
    Antworten
    Zugriffe
    Letzter Beitrag

Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot]

cron