Vorbei?

Vorbei oder nicht vorbei …

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.

Vorbei?
Und, wie ist die Stimmungslage? Die Klausur war sicherlich machbar. Ein wenig wenig Zeit, aber das war uns wohl schon vorher klar.

odd:
popl %eax
andl $1, %eax
ret


ja gut war dass es kleine aufgaben waren, da kann man sich irgendwie punkte zusammenschnorren und gut war die letzte aufgabe (falls meine vor Redundanz strotzende Volladdierer Variante durchgeht :smiley: )… aber war schon ganz OK …

das sind aber 4 Zeilen es soll doch in 3 gehen :smiley: :smiley:


Und was genau soll das machen? Die Rücksprungadresse mit 1 verunden? :wink:

Ich fände besser:

movl 4(%esp), %eax
andl $1, %eax
ret

Ansonsten, was mir noch im Gedächtnis geblieben ist:

struct foo {
   unsigned char c;
   short int i;
   long n;
}

Little-Endian

mov $L1, %sp
jmp L10
L1: .word L2
L2: …
L10: ret
Über den Kontrukt wird die Rücksprungadresse so verändert, dass ein Ausführen von Code im Datensegment (Flash-Speicher?) möglich wird (beim ret wird der Code, der als Daten vorliegt ausgeführt). Da das normalerweise (mit nem Call beispielsweise) zu nem Segfault führen würde, wird dieses Konstrukt verwendet.

Das sind mal ein paar Brocken, obs stimmt weiß ich nicht.

Allgemein fand ich die Klausur ganz fair, vor allem der Inkrementierer am Schluss - das waren wirklich geschenkte 10 Punkte, wenn man sich mal die alten Klausuren bzw. Übungen angeschaut hat. :smiley:

Ich hoffe, es hat sich niemand an ner Aufgabe festgebissen, wie ich in SP2… :frowning:


Ich auch.

Hast du dir die 4711 auch mal angeschaut? Das letzte war ein short int. (IIRC, welcher Indian kann ich mich jetzt aber auch nicht mehr erinnern.)

Wieso werden da Daten ausgeführt? Wo sind die denn? Und zur BIOS-Zeit gibt’s sehr wahrscheinlich noch keinen segfault… Außer du hast ein Multi-Tasking-Fähiges BIOS. :cool:

Den hab ich vor seinen Augen von meinem Blatt abgemalt… :smiley:


stimmung: eher schlecht, ich idiot hab natürlich nur ganz wenig doku dabei und prompt fragt er den endian mist ab.

die is_big_endian war doch eine nullstellige funktion?
movl $1, %eax
xorw %ah, %ah
ich hoffe des geht so … :rolleyes:


popl macht doch genau das … oder nicht?

Den Inkrementierer habe auch abgemalt … :slight_smile:

Wieviele Bytes brauch eurer ergänztes Assemblerprogramm? Ich werfe mal spontan die Zahl “30” in den Raum. Ich glaube mittlerweile aber, dass es deutlich mehr sind.

Und was ist die Bedeutung von 0x0fffffff ???

Bei dem Bioscode ist auf jeden Fall klar, dass man da eine Adresse auf den Stack legt die dann durch ret angesprungen wird … ich würde einfach nur sagen, dass das ein “erweitertes call” ist mit angabe der Adresse wohin zurückgesprungen werden soll …


sorry, ich hab odd mit is_big_endian verwechselt. :grummel:


32, bin mir aber nicht sicher, da ich die genaue Kodierung nicht kenne.

Du meinst sicher 0x7FFFFFFF, oder? Das ist halt 2^31 - 1. Weiß auch net. Hab’s aber falsch hingeschrieben… Wie so viele scheinbar…


geil find ich auch, dass ich nen ausgedruckten 4bit inkrementierer dabeihatte :smiley:


Ich fand die Klausur recht dumm.
Gut, das Schaltnetz war geschenkt, aber bei der Mehrheit der anderen Fragen hab ich dumm rumgeraten.

Haette ich OTRS4 doch auch vorgezogen… die frueheren Klausuren lagen mir definitiv eher.


Es ist zwar jetzt irrelevant, aber
:finger: :finger: :finger: :finger: :finger:

das mit dem 0x7ff… würde ich sagen ist die grösste darstellbare positive Zahl (wenn man mit signed ints rechnet).

Bei dieser is_endian Aufgabe würde ich folgendes vorschlagen:

movl $1,%eax
pushl %eax
xorl %eax,%eax
movb 4(%esp),%al
pop %ebx
ret

man beachte das movb. Damit hol ich mir das einzelne Byte an dieser Adresse. wenn man da ein movl mach, dreht einem der Prozessor die bytes ja wieder richig hin, oder?
Das pop ist nur der vollständigkeit halber um den stack aufzuräumen, den wert selbst brauch ich nicht, also ab damit nach ebx


was ist denn ein unsigned char? du meinst sicher 'nen short, gell?

@sebbi:
der letzte Wert auf dem Stack nach einem Programmaufruf ist die Rücksprungadresse, die du dir in deinem Bsp durch das popl geholt hast - und beim ret springt er dann an die Adresse die den Wert der zu überprüfenden Zahl hat :o)


char: -128 … 127
uchar: 0 … 255
short: -32768 … 32767
ushort: 0 … 65535


aba aba is ein char nich so für Buchstabseln gedacht oder so?
was solln denn da die negativen Werte?!? verwirrt_sei


Hattest du kein SysProg1?


Hmmm - wieso short? Stand da nicht 67 12 00 00? Das sieht doch wie ein Long aus? Woran erkennt man das denn? Nur rein interesse halber… :rolleyes:

@Yves:
Danke für die Erklärung der anderen Datentypen :smiley:

Short schon mal gar nicht, weil da stand ja neben dem 40H noch ein 64H - ein Füllbyte zwecks Alignment :wink:


[quote=Silent_Wa]
Hmmm - wieso short? Stand da nicht 67 12 00 00? Das sieht doch wie ein Long aus? Woran erkennt man das denn? Nur rein interesse halber… [/quote]

Danke für die genaue Zahl, jetzt kann ich’s ausrechnen.

Annahme: (long) 67 12 00 00 (h)

BE: 1729232896
LE: 4711

Annahme: (short) 67 12 (h)

BE: 26386
LE: 4711

Womit bewiesen wäre, dass ich mich eben irgendwo verrechnet hab zwischen Big und Little Indian. :-/

Naja, aber wer sagt, dass das 00 00 noch dazugehört? :smiley: short ist jedenfalls nicht falsch.


huch … hieß es nicht
movl $0, %eax
notl %eax
shrl $1, %eax

Wie kommt man dann auf 0x7fffffff???

0x0000000 bitweise negiert is doch 0xffffffff und dann noch eins nach rechts geschoben … nunja … [HA … ok, ich editiere mir mal die Antwort auf meine Dumme Annahme gleich selbst hinein: natürlich ist das 0x7fffffff … damnit, Anfängerfehler]

Bei der Struktur:
dort stand imho: 40 64 ff ff 67 12 00 00 , oder? …
Wo stand, dass es da irgendein Alignment gibt? …


movL ist 32bit, und das heißt 32 Nullen, nicht nur 8. [ok, hast schon geschrieben]

genau da hab ich mich aber auch vertan:
[m]movl $0: 0000 0000 (implied: hex)
notl : 1111 1111 (forgotten: hex; implied: binary)
shrl $1: 0111 1111 (… naja)[/m]

Alignment wird vorausgesetzt, war bis jetzt überall so. Ach ja, die Bedeutung war angegeben, und die 64h stand nirgendwo dabei.
a = 64;
b = -1;
c = 4711; (alles dezimal)