dumme fragen..aber please help me...
-
hi,
also ich bin grad dabei asm zulernen und weil ich es nicht mag, etwas einfach zulesen ohne es zu verstehen habe ich mal paar (dumme) fragen an euch...wenn ihr diese beantworten könnt, versucht es so einfach wie möglich zu machen...1. in meinem buch steht was über die wertigkeit der bits...was soll das bedeuten...dann steht da z.b. "wenn man die wertigkeit von den 5 bit wissen will, muss man 2 hoch 5 rechnen", also es ist ja klar das ein bit 2 zustände kennt 1 und 0, aber was habe ich davon dieses auszurechnen, was repräsentiert das ergebniss ?
2. dort steht das jeder 8086 eine 20 breite leitung hat, diese kann je 1 bit transportieren...ok, also habe ich 20 bits, die ich übertragen kann, jetzt steht da, aber das sind 2 hoch 20 byte und gleich ein mb, häh ? sind net 20 bits / 8 = byte ?....oder hat dieses beispiel(2 hoch 20) it der wertigkeit was zutun ?)
3. das größte problem für mich, also das mit dem problem, das man eigentlich ein, 20 bit grossen zeiger brauchte, aber nur ein 16 bit register hat...also wie es sich mit dem speicher aufsich hat etc... wie das mit den 65536 Paragraphen etc....und wird der komplette speicher..sprich ram aufgeteilt oder wie...könnte mir das mal einer genau und einfach erklären....thankz..
das war alles.......erstmal ^_~
-
Hi
zu 1)
Dürfte wohl so gemeint sein:
Wenn du eine Binärzahl hast, kannst du diese in eine Dezimalzahl umrechnen.
Bsp:
10010 -> 18Das passiert wie folgt:
von rechts:
1. Stelle: 2^0
2. Stelle: 2^1
3. Stelle: 2^2
usw.überall wo eine 1 steht, nimmst du den zugehörigen Stellenwert und zählst alles zusamen: 2^1 + 2^4 = 2 + 16 = 18
zu 2)
Wenn du 20 Bits zur Verfügung hast, ist es mit ein bisschen Kombinatorik (ist es das überhaupt ?) relativ leicht auszurechnen, wieviele verschiedene Zustände es gibt:
jede Stelle hat genau 2 mögliche Zustände (0,1)
=> bei 20 Stellen: 2^20 = 1.048.576
Da jeder Zustand für ein anderes Byte im Speicher steht, kannst du also genau 1.048.576 Bytes ansprechen. Dies entspricht exakt einem Megabyte ( 1MB = 1024 KB; 1KB = 1024 Byte)zu 3)
Wie du bereits bemerkt hast, braucht man einen "Zeiger" mit 20 Bit.
Da die Register nur 16 Bit gross sind, bedient man sich einem einfachen Trick:
man verwendet einfach 2 Register
Dadurch wird der Speicher in sog. Segmente aufgeteilt, wobei ein Segment genau 65.536 Byte (= 64KB) gross ist, jedoch alle 16 Byte ein neues Segment beginnt.
Innerhalb eines Segments wird dann eine Speicherstelle über ihren Offset angesprochen.
Die physikalische Adresse wird wie folgt berechnet:
Segmentwert * 16 + OffsetAuf diese Weise kann jedoch eine Speicherstelle auf vielen verschiedenen Wegen angesprochen werden
Kleines Beispiel:
Der Code in von deinem Prog liegt im sog. Code-Segment.
Der Segmentwert steht dabei im CS-Register.
Der zugehörige Offset-Wert befindet sich in IP.
Zusammen bilden sie die Adresse für den nächsten Befehlansonsten:
schau vielleicht auch noch mal hier:
http://www.c-plusplus.net/forum/viewtopic.php?t=39778
und hier:
http://members.aon.at/wirthi/coding/asm00de.htmmfg
Martin
-
noch ne kleine frage dazu, also dort stehtr der gesamt speicher wird in 65535 paras aufgeteilt...meint er damit meinen gesamten ram oder nu 1 mb ? und hat man nur 1 mb zu adressierung zuverfügung oder wie ?
-
Nur die 1MB. Dein Buch scheint nur den 8086/88 zu besprechen ... das Teil ist ca. 25 Jahre alt, aber heutige Pentiums können den immer noch emulieren (im sog. Real-Mode), also ist es nicht ganz verkehrt, damit anzufangen.
Und der 8086 hatte nunmal nur 20 Bit Adressbus, d.h. er konnte nur 1 MB adressieren. Intern passierte die Adressbildung durch Zusammenrechnung von Segment und Offset (beide 16 Bit). Da ein 16-Bit-Register 65536 verschiedene Werte annehmen kann, gibt es logischerweise auch 65536 verschiedene Segmente. Der Abstand zwischen zwei möglichen Segmentanfängen wird als Paragraph bezeichnet, und beträgt 16 Byte.
-
mhh...meib buch ist von 2002 also das von rohde, was immer empfholen wird...aber danke für deine antwort...