Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Mal in alten Klausuren nachschauen…
Leute, ich würd mich gleich besser fühlen,wenn mich jemand bei meiner lösungen korriegieren würde…
Klausur vom 28.03.2006: falsch oder richtig?
32-Bit-Register können sowohl Signed- als auch Unsigned-Integer-Zahlen speichern.
Mit dem gleichen Addierwerk können sowohl Signed- als auch Unsigned-Integer-Zahlen addiert werden.
Mit dem gleichen Addierwerk können sowohl Integer- als auch Fließkommazahlen addiert werden.
Alle Kontrollstrukturen können auf if-then goto-Befehle abgebildet werden.
Computer mit Big-Endian-Format sind schneller als Rechner mit Little-Endian-Format.
Computer mit Big-Endian-Format brauchen mehr Speicher als Rechner mit Little-Endian-Format.
Beim Übertragen von Daten von einem Computer mit Big-Endian-Format auf einen Computer mit Little-Endian-Format sind alle Daten zu konvertieren.
Beim Übertragen von Daten von einem Computer mit Big-Endian- Format auf einen Computer mit Little-Endian-Format sind 16- und 32-Bit-Werte zu konvertieren.
Und noch was:
Für welche der nachfolgenden Konstrukte in einem Programm erzeugt ein
Compiler ausführbaren Code?
Typ-Definition
Definition einer globalen Variablen
Definition mehrerer lokaler Variablen
Konstanten-Definition
Initialisierung einer lokalen Variablen
Kommentar
Variablen-Zuweisung
for-Schleife
Ich bin der Meinung dass bei der Übertragung von big auf Little Endian (oder umgekehrt) alles konvertiert werden muss…völlig egal was für Werte.Die Byte-order ist bei beiden verschieden,egal was übertragen wird.
Deshalb denke ich das erste ist auch richtig.
Zum 2. Teil: Was genau versteht man unter ausführbarem Code?
Heißt das anders formuliert „für was erzeugt der compiler Assembler-befehle?“
[i]Zitat von Comrade [/i]
Ja, ich glaub genau das wird darunter gemeint.
Typ-Definition
Definition einer globalen Variablen
Definition mehrerer lokaler Variablen
Konstanten-Definition
Initialisierung einer lokalen Variablen
Bei den obigen bin ich momentan gar nicht sicher…einiges davon steht auf jeden Fall im Datensegment,je nachdem entweder im heap,stack oder initialized data segment…was dann nicht ausführbarer Code wäre?
Der is nämlich alles im Textsegment,denke ich.Also die ersten vier möglichkeiten “nein” und “initialisierung der lokalen variablen” “ja”.
Denn bei der Initialisierung wird ein Wert zugewiesen…also z.b. etwas à la “movl $0, (…)”.Oder?
Kommentar
Variablen-Zuweisung
for-Schleife
Bei der For-schleife wird definitiv ausführaber Code erzeugt.Beim kommentar und der Variablen-zuweisung stimme ich dir allerdings zu.
Die Byte-Order spielt meiner Meinung nach nur dann eine Rolle, wenn man auch mehrere Bytes “zusammen” (und auf Prozessorebene) betrachtet → bei einem Ansi-String z.B. vermutlich nicht.
Ansonsten wären das meine Antworten, aber ich komm grad aus der Stadt und sollt vielleicht eigentlich nimmer TI machen… g:
Typ-Definition
Ist ja im Prinzip nur eine Vorlage, die dann beim Instanziieren benutzt wird. Bei Klassen stimmt so dann zwar nicht mehr ganz, aber…
Definition einer globalen Variablen
Taucht zwar natürlich in der Datei auf, aber im Datensegment → ausführbaren Code gibt’s erst, wenn darauf zugegriffen werden soll.
Definition mehrerer lokaler Variablen
Stack → Ja.
Konstante = [m]#define xyz abc[/m] oder [m]const char* szFoo = …[/m] ?!
Ich würde mal auf den ersten Fall tippen, weil man im zweiten wohl wieder lokal und global unterscheiden müsste, und #1 überlebt dann bei C nicht mal den Präprozessor.
Initialisierung einer lokalen Variablen
Kommentar
Variablen-Zuweisung
for-Schleife
Warum nicht? Nicht direkt natürlich, sondern mit Compare und Jumps, aber so hätte ich die Frage eigentlich nicht verstanden…
ok. Ich glaub da hast du voll recht! erst beim Initialisieren und Zuweisung kann ja ausführbare Code erzeugt werden. ja, das scheint richtig zu sein. :rolleyes:
Man kann auch sagen, dass die Antwort falsch ist, weil dort beim Uebertragen steht. Network Byte Order ist Big Endian, also wird der uebertragende Computer nix konvertieren, lediglich der Empfaenger muss gucken, dass ers von Network Byte Order in die fuer seine Architektur passende Reihenfolge bringt.
Ist es denn so richtig?
Variablen können im Speicher oder in Registern liegen.
Register können Variablen mit und ohne Vorzeichen aufnehmen.
Es können Variablen mit und ohne Vorzeichen mit „add“ addiert werden.
Alle Rückkehradressen von Unterprogrammen werden in Registern gespeichert.
Mit „add“ können beliebig große Variablen addiert werden.
Auf einigen Architekturen brauchen „int“- und „float“-Werte genauso viel Platz im Speicher.
Mit „add“ können sowohl „int“- als auch „float“-Werte addiert werden.
Die Fließkomma-Division ist u.U. schneller als die Integer-Division.
Und was genau bedeutet Rückkehradresse?
Wer weiss es?
An welchen Stellen im Betriebsssytem ist es sinnvoll, die Interrupts kurzfristig abzuschalten?
Alle Rückkehradressen von Unterprogrammen werden in Registern gespeichert.
Die Rückkehradressen liegen praktisch immer auf dem Stack (-> call/ret)
Die Fließkomma-Division ist u.U. schneller als die Integer-Division.
Gleitkomma-Division kann tatsächlich schneller sein (–> Tabelle; http://www.d6.com/users/checker/pdfs/gdmfp.pdf)
Edit:
A ja, und zum Thema Unterprogramme/Rücksprungadresse gibt’s eigentlich ein ganzes Kapitel im “Skriptum”, genau wie über die Interrupts (Folie 8!)…
Attachment:
tabelle.gif: https://fsi.cs.fau.de/unb-attachments/post_35979/tabelle.gif
ich würd da einfach schreiben, Zeitkritische Bereiche, Nebenläufigkeitskritische Bereiche…
In der Aufgabe:
Folgendes Intel-386-Assemblerprogramm laufe im Rechner ab:
movl $0x10000, %esp
movl $32, %eax
movl $16, %ebx
pushl %eax
movl %ebx, 4(%esp)
movb %eax, 36(%eax, %ebx, 2)
Hinweise (Intel-386):
-Verwendet wird das Little-Endian-Format.
-Der Stack-Pointer zeigt auf das zuletzt abgelegte Datum.
-Der Stack wächst von oben nach unten.
habe ich Probeleme unter b) "Welche Bytes im Speicher wurden beschrieben? Nennen sie ihre Adressen und ihren Inhalt nach
der Ausführung des Code-Stückes! " und genau bei der "movb %eax, 36(%eax, %ebx, 2)
" zeile der programms.
Auch in der Frage würd ich gerne von jemandem beraten:
Welche Adressierungsart muß ein Prozessor unbedingt beherrschen, um Operanden zu laden,
deren Adressen erst zur Laufzeit berechnet werden?
wie ihr nur um solche uhrzeiten auf solche fragen kommt… ich hau mich etz ma ins bett, und hab keine ahnung, versteh auch kein wort der frage leider … egal … gn8
Ich versuche mal, die einzelnen Bytes aufzulisten:
(32=0x20, 16=0x10, 100=0x64)
0xFFFC: 20
0xFFFD: 0
0xFFFE: 0
0xFFFF: 0
0x10000: 10
0x10001: 0
0x10002: 0
0x10003: 0
0x64: 20
und zur zweiten Frage- ich vermute mal, man braucht register indirect (in irgendeiner seiner Formen), oder memory indirect.
he-he, zwischen 12 und 6 morgens hatte ich früher meine produktive Phase leider musste ich mich umstellen, nachdem wir gezwungen wurden, um 7:30 TI1 zu schreiben und ich nicht mal annäherungsweise fit war
Öhm… vielleicht steh ich grad komplett auf der Leitung, aber…
Bei [m]movb %eax, 36(%eax, %ebx, 2)[/m] habe ich als Quelle ein 32-Bit-Register, benutze aber einen 8-Bit-Befehl… Geht das?!
Und auch wenn, wäre doch ein [m]movb %al, 36(%eax, %ebx, 2)[/m] zumindest ein ganzes Stück schöner…
hab grad reingetippt- kompillieren tut er nicht mit %eax…
Interessante Aufgabe…