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, ""puffer STRUC
max db 10
anz db ?
txt db 13 DUP(?)
puffer ENDSbuffer puffer<>
.CODE
Start : mov ax, @data
mov ds, axmov dx, OFFSET msg
mov ah, 09h
int 21hmov dx, OFFSET buffer
mov ah, 0Ah
int 21hmov bx, dx ;HIER KRIEGT JA BX DIE OFFSET ADRESSE VON "buffer"
mov dx, OFFSET ccl
mov ah, 09h
int 21hadd 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 21hmov ah, 4Ch
int 21h
END Startmeine 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=02hHaettest 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.