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:vielen dank für eure hilfe
grüssle
Quicks[/code]