Bildschirm löschen&Far jmps



  • Tach, ich hät da mal ein Paar frage:
    1.Wie kann ich mit TASM im "normalen" Dos text modus den Bildschirm löschen!
    2.Wie krieg ich das mit den jmps über 128bit (oder wie auch immer...) geregelt???Ich raff das irgendwie net!
    thx schonmal!
    cu
    z-man



  • Zu 1: FAQ (hm... warum steht da wohl dieser Nette Text ueber der Themenuebersicht? ;))
    Zu 2: Far Jumps sind an sich Jumps ueber Segmentgrenzen. Im RM sind solche Zieladdressen von Far jumps 32Bit lang (Segment:Offset)
    Sollte das deine Frage nicht beantworten, dann bitte etwas genauer...
    (vielleicht auch nochmal bei den Tutorials ein bissel umschauen, da wird das Prinzip der Segmente etc. auch erklaert)



  • Original erstellt von Nobuo T:
    ... Im RM sind solche Zieladdressen von Far jumps 32Bit lang (Segment:Offset)
    ...

    hmmm ...

    ich hätte jetzt gesagt, im RM sind Adressen 20 Bit (21 Bit mit Trick) lang. Kann das sein? Ich bin mir jetzt nicht mehr sicher ....

    [ Dieser Beitrag wurde am 03.01.2003 um 11:11 Uhr von mady editiert. ]



  • 😕
    Es ist richtig, dass maximal 20 Addressleitungen zur Verfuegung stehen, deshalb kann doch aber die Segment:Offset-Addresse in einem Jump laenger sein... (16Bit Segmentregister u. 16Bit Offset)
    Rechnung fuer endgueltige Adresse im RM ist schliesslich folgende:
    Segment*16+Offset. Das passt sehr schoen in 20Bit. (21 bei A20)
    [edit]kleine Korrektur[/edit]

    [ Dieser Beitrag wurde am 03.01.2003 um 15:28 Uhr von Nobuo T editiert. ]



  • *g*Sorry...hab ganz vergessen in den Faqs zu schauen...!Zu meiner 2.Frage:
    Ich wollte eigentlich nur wissen wie ich diese Sprünge in TASM jetzt geregelt kriege...ich hab jetzt ein etwas größeres (natürlich trotzdem kleines...) proggie geschrieben und der Assembler sagt mir das ich zu weit springe!
    cu
    z-man



  • Ist das genaue Wortlaut der Fehlermeldung? "Relative jump out of range by ????h bytes"
    Wenn ja, benutzt Du relative jumps zusammen mit "short"?
    Sollte das auch zutreffen: dieses "short" bei den betroffenen jumps einfach weglassen und es laeuft. 🙂



  • hab zwar schon ewig nicht mehr den TASM angerührt, aber versuch es mal mit dem schlüsselwort 'far'.
    PS.: Jcc (Conditonal Jumps) können nur relativ zur aktuellen Addr. +/- 127 springen.

    mfg
    -bg-



  • Original erstellt von -bg-:
    **PS.: Jcc (Conditonal Jumps) können nur relativ zur aktuellen Addr. +/- 127 springen.

    mfg
    -bg-**

    Ja, das war bis zum 286 so... Seither gibts aber auch 16/32Bit relative jumps. (egal ob jcc oder jmp).



  • Thx,werds probieren!
    cu
    z-man



  • upsy, das kommt halt davon, wenn mensch alte Tuts ließt.

    Aber du solltest auf die einschränkung achten, wenn du Kompatibilität zu 286 und älter waren willst *grins* !

    ps:
    Meine ersten Codes waren voll 8086 kompatibel, konnte es aber nie austesten, da ich sowas nicht habe, aber wenn einer sowas loswerden will, nur her damit, würde gerne mal sehen, wie der meinen alten Code verwurschtelt *g*.

    mfg
    -bg-



  • ...also irgendwie krieg ich das mit den Teilen nicht geregelt!Also hier mal die NASM error message (in ungefähr*g*):

    Short jump is out of range (Line xyz)
    

    (Ich hab das Prob jetzt speziel bei nem je (nach cmp*g*) jmp...macht das irgendwas aus?????)
    Daher denke ich das ich dann ja wohl far jumps benutzten muss*g*Ich bräuchte wenn möglich kompatiblität nach unten!Ich schreibe das ganze Zeug auch für nen 286&386 (Weil ich da ein altens (mit alt meine ich sehr alt*g*)Notebook und nen mini-pc (der ist wirklich klein*g*) erwischt habe und auf denen ausser DOS und Win 3.11 im moment nix drauf is!(ich krieg nirgendwoher ein laufendes linux*heul*))*g*Solange ich für dos progge (16bit code etc.) wollte ich eigentlich so verbleiben das das Zeug dann auch auf den beiden Teilen läuft!
    thx
    cu
    z-man
    ps: Man bin ich dämlich...*heul*Das is schlimm...da sag ich mir immer vor "Du brauchst das ganze für NASM sonst läuft das nicht...!" und was mach ich?Schreib TASM...allgemeines sorry!!! 😞
    pps: Soweit ich gelesen hab macht TASM das mit den Far jumps ja automatisch?Oder?

    [ Dieser Beitrag wurde am 06.01.2003 um 18:20 Uhr von z-man editiert. ]



  • Ein Stueck Code waer nicht schlecht. Aber dieser Fehlermeldung zuvolge brauchst Du IMO keinen FAR Jump (=Jump ueber Segmentgrenzen) sondern musst deine Jump-konstruktionen etwas umbauen...

    Beispiel:

    cmp ax,1234h
    je  bla1
    ...
    ...
    bla1:
    ;Angenommen, dieser jcc da oben ist out of range... (Springt weiter als 128Byte)
    
    ;Abhilfe schafft diese Konstruktion:
    cmp ax,1234h
    jne bla1A
    jmp bla1
    bla1A:
    ...
    ...
    bla1:
    

    Ist zwar nicht schoen, sollte aber funktionieren.



  • Original erstellt von Nobuo T:
    **Ein Stueck Code waer nicht schlecht. Aber dieser Fehlermeldung zuvolge brauchst Du IMO keinen FAR Jump (=Jump ueber Segmentgrenzen) sondern musst deine Jump-konstruktionen etwas umbauen...

    Beispiel:

    cmp ax,1234h
    je  bla1
    ...
    ...
    bla1:
    ;Angenommen, dieser jcc da oben ist out of range... (Springt weiter als 128Byte)
    
    ;Abhilfe schafft diese Konstruktion:
    cmp ax,1234h
    jne bla1A
    jmp bla1
    bla1A:
    ...
    ...
    bla1:
    

    Ist zwar nicht schoen, sollte aber funktionieren.**

    Jaja, so hab ich das auch immer gelöst... 😃
    bis mir dann eher zufällig die richtige Seite in der Doku zugefallen ist. Das Kommando / Schalter / Option ... wie auch immer ... "JUMPS" am anfang des Codes lässt TASM dieses "Umherspringen" automatisch machen. Wenn du deinen Code so beginnst

    MODEL SMALL
    IDEAL
    STACK 100h
    

    dann mach einfach ein

    MODEL SMALL
    JUMPS
    IDEAL
    STACK 100h
    

    draus, und es sollte gehen (hoffen wirs mal, bei mir gings 😉 )

    mfG ETNA



  • [edit]Sorry, das sollte eigentlich eine Antwort auf einen anderen Thread sein!(Ich hab mich glaube noch nie so oft in einem thread entschuldigen müssen :)[/edit]
    Negative Zahlen werden in spezieller Weise dargestellt (habe mich früher, vor meiner Asm-Zeit auch immer gefragt wie das geht:).

    Bei positiven Zahlen ist das klar (mache das jetzt alles mit 8bit zahlen):
    1 =
    0000 0001

    2 =
    0000 0010

    3 =
    0000 0011

    ...

    Bei der Änderung des Vozeichen von + nach - wird so Verfahren:

    1. Alle Bits invertieren
    2. um 1 inkrementieren (+1)

    (für die Konvertierung von - nach + können die Schritte umgekehrt erfolgen, oder es muss 1 subtrahiert anstatt addiert werden.)

    -1 =
    1111 1111

    -2 =
    1111 1110

    -3 =
    1111 1101

    mfg
    -bg-

    [ Dieser Beitrag wurde am 09.01.2003 um 23:18 Uhr von -bg- editiert. ]



  • k
    thx für alle Antworten!!Das mit dem Bildschirm löschen klappt denke ich schon!Das mit dem jumps regle ich dann halt mit den Umwegen!
    cu
    z-man
    ps: ich hab NASM...TASM kriegt man ja nicht einfach so*grml*



  • Also irgendwie läuft das Teil nicht!Der bildschirm wird leer aber das proggie hängt sich auf!!!!!!!!!!!!!!
    Ich geben den text mit int 9h im dos modus aus!(10h is doch der Grafikmodus?oder?)aus!
    thx cu
    z-man



  • Int 09h ist der Interrupt vector fuer IRQ1, das ist der IRQ der Tastatur.
    Unter DOS kannst Du einen Text-String (byte 24h terminiert) mit ah=09h, int 21h oder mit ah=13h, int 10h (keine Terminierung - Laenge in cx) ausgeben. Hierzu bitte vor Benutzung eine Interrupt-Tabelle (z.B. von Ralf Brown) ansehen!



  • Sorry...ein Vertipper meinerseits...ich meinte mit int 21h mit 09h im ah register*g*
    cu
    z-man



  • Tja... Mit so wenigen Informationen kann ich dir nicht weiter helfen. Alles was ich so dazu sagen kann: In meinen Programmen funktioniert die Textausgabe mit int 21h. 😉
    Der Code des fehlerhaften Programms koennte hier uU. hilfreich sein. (schliesslich bezog sich die Ausgangsfrage auch auf einen Jump 😕 )



  • Das war sowas wie ne Doppelfrage...ich schreibe grad an nem Proggie das signale am Parallelport ausgiebt...und da is mir der Source wohl zu groß (obwohl doch ziemlich winzig...) geraten.Aber das problem is mit der umherspringerei schon gut gelöst (nochmal thx!).Ausserdem hatte ich das prob das es hässlich aussieht wenn mein Menue jedesmal wieder unter das alte gezeichnet wird...deswegen dachte ich mir Frag ich doch auch gleich mal wie ich den Bildschirm wieder löschen kann (sowas wie cls() in C)!Also mit dem 13h hat das nicht geklapppt...aber ich glaube ich hab mich wohl ein wenig "undeutlich" ausgedrückt*g*Strings etc. terminieren brauch ich nicht!Ich will nur den Bildschirm löschen... 😃
    cu
    z-man
    ps: Wie benutzt man diese RalfBrown liste...ich hab mir den Viewer dazu runtergeladen...aber das einzige was ich an Listen habe is irgendwie was spezielles für Mikrokontroller etc. nur eine Kurze zusammenfassung der DOS interrupts ist dabei...aber keine beschreibung der Optionen!


Anmelden zum Antworten