Offsetübergabe



  • Hallo,

    Wie übergibt man einer asm-Funktion von C aus eine Variable??? Zum Beispiel zum Text ausgeben. Wenn man folgende Funktion hat:

    _print:
    mov ax,data
    mov dx,ax
    mov ah,9
    mov dx,TEXT
    int 21h
    

    Dann braucht man immer noch das Offset TEXT um diesen auszugeben. Aber wie übergibt man das nun von C aus dem asm-Programm???

    Danke im Voraus



  • Guckst du hier.

    Code-Hacker



  • Erst mal THX.
    Aber tut mir leid, ich versteh leider kein Wort. Was meinst du soll ich aus dem Thread lernen??? Wenn du den Assembler-Code oben meinst, dann erklär doch mal bitte was der bewirkt und wo du dann die übergebenen Werte im asm-Code übernimmst.



  • Ich zitiere immer wieder gerne:
    http://bkausbk.netfirms.com/callconv.html

    Dort findest du, wie C seine Parameter übergibt 🙂



  • Sorry!
    Also mit push bp sicherst du die Rückkehradresse. mov bp,sp sorgt dafür das mit bp adressiert wird. Mit [bp+8] holst du den dritten Parameter. Das Programm vergleicht dann was es tun soll, subtrahieren oder die Speichergröße herausfinden. Mit [bp+4] holst du den 1. und mit [bp+6] holst du den 2. Parameter. Dann wird subtrahiert. Wenn du als 3. Parameter die 2 übergeben haben solltest stellt das Programm die Hauptspeichergröße fest. Am Ende stellst du mit mov sp,bp den Stack wieder her und mit pop bp holst du die Rücksprungadresse und kehrst anschließend zum Aufrufer zurück.

    Code-Hacker



  • Erst mal danke, aber mal 'ne Zwischenfrage: Gehört der int 21 BIOS oder zu DOS? Denn den benutz ich ja zur Textausgabe. Geht das denn überhaupt ohne OS, Was ich da oben geschrieben hab'? Und wenn nicht, wie gebe ich da dann Text aus???

    thx



  • Hi.

    DOS-System-Funktionen werden normalerweise ueber int 21h aufgerufen.
    Die in deinem Code verwendete int 21h-Funktion gehoert auch zu DOS und ist somit nicht verfuegbar, wenn DOS nicht installiert ist.
    Textausgabe ohne OS, kannst du entweder unter Verwendung des VGA-BIOS via int 10h realisieren oder indem du direkt in den Textbuffer schreibst, der im RM normalerweise bei B800:0000 liegt.
    (1.byte=Zeichen 2.byte=Farbe usw.)



  • RM normalerweise bei B800:0000 liegt
    

    kann man die stelle irgendwie abfragen?



  • Nicht direkt.

    Die Addresse des aktiven Text-Bildschirmspeichers wird durch die aktive Bildschirmseite und den momentan gesetzten Text-Modus bestimmt (Farbe/Monochrome)
    Aber mit B800:0000 bist du bei einem 16Farben Textmodus meist auf der sicheren Seite.



  • soweit ich weiss hängt das davon ab ob die graphik karte vga compatibel ist.
    und bei vga fangen alle textmodi bei 0B8000 hex an.
    sehr alte hercules karten [die betonung liegt auf "sehr"] hatten ihre textmodi
    bei 0B0000, aber darum muss man sich heutzutage keine sorgen mehr machen.



  • wasiliy schrieb:

    soweit ich weiss hängt das davon ab ob die graphik karte vga compatibel ist.

    Sry, aber damit hat das nicht unbedingt etwas zu tun. Wie geschrieben, haengt das doch eher vom verwendeten Modus ab.

    wasiliy schrieb:

    und bei vga fangen alle textmodi bei 0B8000 hex an.

    Jo, aber nicht vergessen, was passiert, wenn mal nicht die erste Bildschirmseite aktiv ist... 😉

    Wie gesagt: Der Speicherbereich fuer B/W-Textdarstellung liegt nach wie vor auch bei aktuellen Karten bei B000:0000, das hat nichts mit "sehr alten hercules karten" zu tun.
    Wenn man nun ganz krank drauf ist, kann man AFAIK den VGA-Speicherbereich auch noch so umbasteln, dass der Speicherbereich fuer alle Textmodi auf B000:0000 gemapt wird.



  • ai stimmt im modus 7 fängt der speicher bei 0B0000 an. aber den benutzt eh keiner ... =p



  • "Jo, aber nicht vergessen, was passiert, wenn mal nicht die erste Bildschirmseite aktiv ist... ;)"

    hä warum sollte nicht die erste bildschirmseite aktiv sein? solange man nicth in vga registern rumpfuscht ...



  • wasiliy schrieb:

    hä warum sollte nicht die erste bildschirmseite aktiv sein? solange man nicth in vga registern rumpfuscht ...

    Dazu braucht man noch nicht einmal selbst in den VGA-Registern rumpfuschen, ein BIOS call tuts auch. (Funktion 05h)
    Ich habe diese Funktion allerdings selbst noch nicht gebraucht und weiss daher nicht genau, wie sich der Speicher der nicht aktiven Seiten verhaelt=>Ich kann keine Auskunft darueber geben, warum jemand nun genau auf eine andere Bildschirmseite umschalten sollte.

    Fakt ist aber, dass die Moeglichkeit besteht und man beim Schreiben eines Bildschirmtreibers fuer den Textmodus daher entsprechende Routinen mit einbinden sollte.



  • naja man könnte auf eine andere plane umschalten um zB seine eigene font in den speicher zu kopieren (plane #2). jemand der das tut wird aber auch wissen was er tut und auf das nötige achten. äh worauf wollte ich eigentlich hinaus ... ? ah ja, die speicher der textmodi ausser modus 7 fangen trotzdem bei 0B8000 an =p

    btw, auch wenn man die plane umschaltet so muss man trotzdem auf den selben speicherbereich schreiben. um den rest kümmert sich die vga hardware.



  • wasiliy schrieb:

    naja man könnte auf eine andere plane umschalten um zB seine eigene font in den speicher zu kopieren (plane #2).

    Ehrlichgesagt keine Ahnung, wovon du jetzt gerade redest, aber ich redete zumindest von Textbildschirm-pages.

    wasiliy schrieb:

    jemand der das tut wird aber auch wissen was er tut und auf das nötige achten.

    Schon moeglich. Es kann aber auch durchaus passieren, dass ein Programm eine andere Page als 0(da faengts an zu zaehlen - habs inzwischen ausprobiert :D) aktiviert... DOS kann zB. damit umgehen und setzt seinen prompt dann in die momentan aktive page. Ich glaube ehrlichgesagt nicht, dass es diese nun beim Start eines neuen Programms wieder auf 0 zuruecksetzen wird... 😮

    wasiliy schrieb:

    äh worauf wollte ich eigentlich hinaus ... ? ah ja, die speicher der textmodi ausser modus 7 fangen trotzdem bei 0B8000 an =p

    Bitte, probiers aus. 😃 Ich bin schon die ganze Zeit aufgrund deiner selbstsicher wirkenden Aeusserungen um rumprobieren.
    Page 1 faengt bei einer Pagesize von 1000h bei B800:1000 an (=B900:0000) und Page 2 bei B800:2000 (=BA00:0000)... usw.

    [edit]Mir ist jetzt gedaemmert, was du mit "planes" meintest, aber das hat nichts direkt mit dem Zugriff auf den Speicher fuer den Textbildschirm zu tun... Fonts aendern ist doch nochmal 'ne andere Kiste. 🙄[/edit]



  • ne fonts ändern hat was mit dem speicher und den planes zu tun. die muster für die font die du im textmodus siehst sind alle in der plane #2 gespeichert, dh wenn du deine eigene font benutzen willst ( und nicht die bios routinen benutzen kannst/ willst ), dann kannst du diese auf die plane #2 schreiben und diese wird dann von der karte benutzt (musst aber den odd/even mode ausschalten, bevor du deine font auf die plane schreibst, sonst kannst du nur auf die bytes schreiben, die gerade adressen haben)

    wenn ein programm sichergehen will, dass die momentane plane die #0 ist, dann kann es einfach auch den modus neu setzen, per int 10h, dann werden alle vga register auf bestimmte werte gesetzt, dies kann man in tabellen nachschlagen, wenn man sie unbedingt braucht.

    und was genau probierst du da eingentlich aus?? 🙂
    klar stimmen deine adressen, aber die brauchste alle nicth, man schreibt normalerweise immer auf auf die stelle wo der graphikspeicher anfängt und wenn man eine andere plane ansprechen will so sagt man es dem Map Mask register.



  • Ok, nun nochmal langsam.
    Ich glaube so langsam, wir reden ein wenig aneinander vorbei. 🤡

    wasiliy schrieb:

    ne fonts ändern hat was mit dem speicher und den planes zu tun.

    Sry, wenn das so ruebergekommen ist, aber diesen Sachverhalt wollte ich zu keiner Zeit bestreiten. 😉
    Ich hatte lediglich vor, zum Ausdruck zu bringen, dass sich die Diskussion IMHO ausschliesslich um das Setzen von Textzeichen und Attribut in planes #0/1 dreht und dabei die plane #2 zu vernachlaessigen ist. Darauf kann eh nicht ohne rumpfuschen in VGA-Registern zugegriffen werden.
    Auf diese 2 Planes und die verschiedenen Offsets der Bildschirmseiten darin war ich nun so fixiert, dass es mir daher auch erst nicht aufgegangen ist, wovon du im vorherigen Beitrag schriebst. 🙄
    Somit waere der 1. Block damit IMHO erledigt.

    wasiliy schrieb:

    wenn ein programm sichergehen will, dass die momentane plane die #0 ist, dann kann es einfach auch den modus neu setzen, per int 10h, dann werden alle vga register auf bestimmte werte gesetzt, dies kann man in tabellen nachschlagen, wenn man sie unbedingt braucht.

    Ob der Plane-zugriff wieder zurueckgesatzt wird, habe ich jetzt nicht nachgeprueft, ich nehme es aber mal so hin. :p
    Auf jeden Fall wird dadurch auch wieder die erste Bildschirmseite aktiviert, was ich nicht bedacht hatte... 🙄

    wasiliy schrieb:

    und was genau probierst du da eingentlich aus?? 🙂

    Du verwirrst mich halt, hier ploetzlich mit Zugriff auf plane #2 anzufangen, wo ich doch einfach beim Textzeichensetzen auf den ersten beiden bin. 😮 😃



  • ich glaub du solltest den thread lieber schliessen 🙂



  • ach ja, mit dem zugriff auf plane #2 hab ich angefangen weil du weiter oben dich gefragt hattest warum einer auf ne anderen plane zugreifen sollte. war nur ein beispiel.


Anmelden zum Antworten