Autor Thema: FAR Calls  (Gelesen 7315 mal)

bscreator

  • Gast
Gespeichert
« am: 21. December 2010, 15:18 »
Hallo,
ich versuch grad, meine bisherigen internen Unterprogramme in externe Module zu packen.
Unter TASM sieht eine externe Prozedur so aus:
PUBLIC print
...
print PROC FAR
        lodsb
         ...
print ENDP

unter NASM wird das Schlüsselwort PUBLIC durch GLOBAL und das Schlüsselwort EXTRN durch EXTERN ersetzt. Leider hab ich keine Ahnung, wie die Syntax einer externen Prozedur und der Aufruf in NASM aussieht. Das ganze brauch ich, um die Segmentbegrenzung im Real Mode zu umgehen. (Protected Mode kommt erst später bei mir).

Vielen Dank für eure Hilfe,
bscreator

PNoob

  • Beiträge: 106
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #1 am: 21. December 2010, 16:19 »
ich wäre ja für einen Far Jump. vorher natürlich EIP Pushen
also
push ip ; ich weiß grad nicht wie das im RM heißt.
            ; ich glaube aber IP sonst einfach
            ; ausprobieren oder NASM Manual befragen
jmp far segment:offset


Ich hoffe ich konnte dir helfen.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 21. December 2010, 17:12 »
[global print]

print:
    push bp
    mov bp, sp

    leave
ret

[extern print]


call print
;call 0x42:print


@pnoob:
Auf IP kann man erst mit dem Long Mode für indirekte Adressierung zugreifen. push ip tut also nicht.
« Letzte Änderung: 21. December 2010, 17:14 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

bscreator

  • Gast
Gespeichert
« Antwort #3 am: 21. December 2010, 18:30 »
Sorry, aber beim Assemblieren kommt immer die Meldung:
"binary output format does not support external references"(in Zeile call ...).

Ich hab schon das ganze schon mit Jumps versucht, nur leider find ich dann nicht mehr die Stelle im Kernel, wo es weitergeht (nach dem Jump-Aufruf).

Vielen Dank,
bscreator

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 21. December 2010, 19:00 »
Mit flachen Binaries geht das natürlich nicht. Wenn du deinen Code auf mehrere Module (also mehrere Objektdateien) verteilst, musst du sie am Ende zusammenlinken, um eine ausführbare Datei zu bekommen. Damit der Linker das hinkriegt, braucht er aber ein paar Zusatzinformationen, die eine flache Binary nicht hat. Du wirst also zumindest für die Objektdateien ein richtiges Format nehmen müssen. Den Linker, der diese Objektdateien verarbeitet, kannst du anschließend wieder eine flache Binary ausgeben lassen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

PNoob

  • Beiträge: 106
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #5 am: 21. December 2010, 19:40 »
Moin

Vielleicht solltest du dir deine selbst angefangenen Threads erstmals durchlesen bevor du neue erstellst
http://forum.lowlevel.eu/index.php?topic=2499.0
Da hast du würde ich mal sagen das gleiche Problem gehabt.

Das man da nicht direkt drauf zugreifen kann, wusste ich gar nicht. aber geht das denn nicht dann zumindest mit diesem Code?
mov ax, ip
push ax
jmp far segment:offset

PNoob

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 21. December 2010, 19:42 »
Nein.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 21. December 2010, 19:55 »
PNoob, was du vorhast, geht so:
call foo
foo:
pop eax
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

PNoob

  • Beiträge: 106
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #8 am: 21. December 2010, 21:22 »
Moin

@taljeth: Ich wusste doch das man das irgendwie machen kann. wie genau wusste ich nicht. danke das du mir das erklärt hast.

@Svenska: auf was war das Nein bezogen?

PNoob

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 21. December 2010, 22:24 »
Auf deine Frage.

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 22. December 2010, 13:53 »
Hallo,


Das ganze brauch ich, um die Segmentbegrenzung im Real Mode zu umgehen.
Wenn Du dafür FAR-Jumps benutzen willst benötigst Du in jedem Fall ein relozierbares Executable-Format oder der Linker muss genau wissen an welche physische Adresse das Binär-File geladen wird. FAR-Jumps (und auch FAR-Calls) sind immer absolut (nicht relativ) was bedeutet das die absolute physische Zieladresse direkt im Befehl (oder einer bestimmten Speicherstelle) drin steht. Mehr als die 64 kBytes wirst Du nicht einfach so (also ohne gute Tricks) in ein simples Plain-Binary-File bekommen außer wenn Du schon zur Linkzeit genau weiß wo das im Speicher liegen wird.

(Protected Mode kommt erst später bei mir).
Dann wird Dir Dein Vorhaben aber noch viel Freude bereiten.


@bscreator: Ich kann Dir nur dringend empfehlen (zum wiederholten mal) Dich mal intensiv mit dem Aufbau von linkbaren und/oder relozierbaren Object-Dateien zu beschäftigen. Auch der Vorgang des Linkens ansich sollte mit viel Aufmerksamkeit von Dir bedacht werden. Dazu kämen dann noch die möglichen Adressierungsmodi für Jumps und Calls bei x86.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

bscreator

  • Gast
Gespeichert
« Antwort #11 am: 22. December 2010, 14:28 »
Zitat
Vielleicht solltest du dir deine selbst angefangenen Threads erstmals durchlesen bevor du neue erstellst
http://forum.lowlevel.eu/index.php?topic=2499.0
Da hast du würde ich mal sagen das gleiche Problem gehabt.
Da hast du, würde ich sagen recht. Leider hab ich die Lösung dieses Problems damals nicht schriftlich festgehalten und jetzt muss ich mich wieder ins Problem reinarbeiten.

Zitat
Ich kann Dir nur dringend empfehlen (zum wiederholten mal) Dich mal intensiv mit dem Aufbau von linkbaren und/oder relozierbaren Object-Dateien zu beschäftigen. Auch der Vorgang des Linkens ansich sollte mit viel Aufmerksamkeit von Dir bedacht werden. Dazu kämen dann noch die möglichen Adressierungsmodi für Jumps und Calls bei x86.

Danke an euch alle,
aber ein Stück Code wär mir lieber...
bsc

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 22. December 2010, 14:49 »
Hallo,


aber ein Stück Code wär mir lieber...
Warum?
Wäre es nicht viel schöner wenn Du die Zusammenhänge selber verstehen würdest?
Nicht bei jedem Problem kann Dir irgend jemand ne Lösung vorkauen.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

PNoob

  • Beiträge: 106
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #13 am: 22. December 2010, 16:52 »
Moin

Was für Code willst du denn noch?
Code hast du doch bekommen und das was du willst, geht mit flat binary's nicht. such dir nen anständiges Format oder wechsle in den PMode und benutze ELF. Der PMode ist auch gar nicht so schwer.


PNoob

 

Einloggen