fragen zum quellcode und stacksegment



  • hi,
    also ich habe jetzt mal gleich 2 fragen...zuerst :

    also im realmode hat man ja 1 mb speicher zuverfügung und jedes segment darf max. 64kb gross sein. wenn man jetzt aber im assembler folgenden code eingibt :

    .STACK 100h

    hat man einen Stapelspeicher von 256byte...wie kann ich das verstehen heisst, das das das stacksegment nur 256 byte gross ist oder wie...in meinem buch steht das wenn man diese anweisung nicht macht, dass dann der speicher automatisch auf 1024byte = 1kb gestellt wird....wieso nur 1kb, wieso nicht 64 ?

    zweite frage zu diesem code :

    .MODEL Small
    .STACK 100h

    .DATA
    msg db 10, 13, "BITTE EINEN TEXT EINGEBEN (max. 10) : ", 10, 13, ""ccldb10,13,"" ccl db 10, 13, ""

    puffer STRUC
    max db 10
    anz db ?
    txt db 13 DUP(?)
    puffer ENDS

    buffer puffer<>

    .CODE
    Start : mov ax, @data
    mov ds, ax

    mov dx, OFFSET msg
    mov ah, 09h
    int 21h

    mov dx, OFFSET buffer
    mov ah, 0Ah
    int 21h

    mov bx, dx ;HIER KRIEGT JA BX DIE OFFSET ADRESSE VON "buffer"

    mov dx, OFFSET ccl
    mov ah, 09h
    int 21h

    add bx, 2 ;PLUS 2 ? GLEICH ER ZEIGT AUF DEN TEXT ODER WIE ?
    add bl, buffer.anz ;ZEIGT ER JETZT AUF DAS LETZTE ZEICHEN DES TEXTES ODER WOHIN ?
    adc bh, 0 ;WIESO DAS ? ALSO WENN CARRY GESETZT IST KIREGT BH EINE 1 ZUADDIERT FÜR WAS IST DAS GUT ?

    mov word ptr [bx], 0D0Ah
    mov byte ptr [bx + 2], "$"

    mov dx, OFFSET buffer.txt
    mov ah, 09h
    int 21h

    mov ah, 4Ch
    int 21h
    END Start

    meine fragen sind als kommentare...siehe oben!

    danke.....



  • Hi.

    CSR schrieb:

    ...und jedes segment darf max. 64kb gross sein.

    Das hat weniger etwas mit "duerfen" zu tun, als damit, dass man nur 16Bit breite Offset-Adressen verwenden kann.
    Damit laesst sich nunmal nicht mehr als 64kb adressieren.

    CSR schrieb:

    wie kann ich das verstehen heisst, das das das stacksegment nur 256 byte gross ist oder wie...

    Eigentlich heisst das, dass dein Stapel maximal 256byte fassen kann.
    Praktisch wird hierbei das Register SP mit dem Wert 256 initialisiert.
    Da der Stapel nach unten waechst, wird nach 256Byte ein Ueberlauf auftreten -> der Stapel ist voll.
    Der Ausdruck "Stacksegment" beschreibt in dem Zusammenhang also kein ganzes RealMode-Segment im eigentlichen Sinne, sondern nur den fuer den Stack bereitgestellten Speicherbereich.

    CSR schrieb:

    in meinem buch steht das wenn man diese anweisung nicht macht, dass dann der speicher automatisch auf 1024byte = 1kb gestellt wird....wieso nur 1kb, wieso nicht 64 ?

    Ist eben default beim TASM und zudem eigentlich auch ganz sinnvoll so.
    Mir ist bisher zumindest noch kein sinnvolles Stueck Code untergekommen, das mehr als 1kb Stack gebraucht haette. 😉

    CSR schrieb:

    add bx, 2 ;PLUS 2 ? GLEICH ER ZEIGT AUF DEN TEXT ODER WIE ?

    Jo.

    CSR schrieb:

    add bl, buffer.anz ;ZEIGT ER JETZT AUF DAS LETZTE ZEICHEN DES TEXTES ODER WOHIN ?

    Fast. Er zeigt nun direkt hinter das letzte Zeichen.

    CSR schrieb:

    adc bh, 0 ;WIESO DAS ? ALSO WENN CARRY GESETZT IST KIREGT BH EINE 1 ZUADDIERT FÜR WAS IST DAS GUT ?

    Insgesammt soll Das Byte buffer.anz auf bx addiert werden.
    Das geht nunmal aber net so einfach, da bei der Instruktion "add" beide Operanden gleich lang sein muessen.
    Also wird buffer.anz erstmal auf bl addiert und der Uebertrag (aehnlich schriftlicher Addition) dieser Rechnung auf bh.

    Hm... Am besten, ich versuche das nochmal anhand eines Beispiels zu verdeutlichen:
    Gegeben sei bl=F8h; bh=01h
    bx enthaelt dann die Zahl 01F8h
    Nun folgende Rechnung:
    bx + 10h ergibt 0208h
    => aufgeteilt macht das bl=08h und bh=02h

    Haettest du die 10h jetzt nur zu bl addiert, haettest du in bx 0108h stehen und das CF gesetzt. Mit "adc bh, 0" wird nun noch eins zu bh dazuaddiert, womit du dann in bx auch 0208h stehen haettest.


Anmelden zum Antworten