2013-08-12 13 views
9

Ich habe mich gefragt, was ist der Unterschied zwischen Stack in C und Stack in Assembler für Prozessoren wie RISC oder ARM?Stapel in Assembly vs Stapel in c?

Proffesor sagte, seien Sie vorsichtig, Stapel ist anders als stapeln Sie haben auf anderen Thema (Algorithmen und Strukturen, in denen wir über C lernen) gelernt über

Soweit ich mich erinnern kann, sind beide nur Daten gespeichert im Speicher funktionieren beide im LastInFirstOut-Schema, beide müssen nach der Verwendung bereinigt werden.

Ich meine, sie können nicht die gleichen sein, weil sie in zwei verschiedenen "Welten" sind, aber fehlt mir etwas wichtiges, das sie unterscheidet? Vielleicht ist es das, aber es nervt mich seitdem.

Vielen Dank

+2

meinst du C oder C#? – Liam

+7

_ "Prozessoren wie RISC oder ARM" _. RISC ist nur ein Konzept, während ARM ein konkretes Design einer RISC-Architektur ist. – Michael

+0

Prof. bedeutet wahrscheinlich, dass es anders ist, weil der Call/Return-Stack (teilweise) in Hardware verwaltet wird. –

Antwort

9

Die Stapel sind genau gleich. Man kann ein Programm Mixed Assembly/C schreiben und sie verwenden den gleichen Stapel.

Der C-Compiler verwendet einige Konventionen für die Verwendung des Stapels: ein wohlgeformter Stapelrahmen wird bei jedem Funktionseintrag ausgefüllt; und aufgeräumt beim Verlassen der Funktion. Es gibt Compiler-Anweisungen, die spezifisch für das Ändern der Stapelverwaltung sind. Zum Beispiel: gcc stack checking

Einige Referenzen im Web: google : c stack frame

In Assembly hat der Stapel verwaltet durch den Programmierer vollständig sein. Es ist eine gute Praxis zu haben Regeln, wie der Stapel zu verwalten (und imitieren C-Regeln zum Beispiel)

Die Stack-Management Anweisungen sind auch sehr abhängig Prozessor (Anweisungen wie push und pop auf x86 oder stmia/ldmfd auf ARM In ähnlicher. haben einige Prozessoren gewidmet Register für Stapelzeiger (esp auf x86), für einige andere es nur üblich ist (r13 auf ARM7.)

ein guter Weg, auf Stack-Management lernen ist es, einen Debugger zu verwenden, und einige zu tun Rückverfolgung, um den Rahmeninhalt zu sehen

Für ag Ich würde empfehlen, this Wikipedia article und this one for stack frames

+1

Großartig. Das hat mein Problem gelöst! Aber jetzt habe ich noch eine Frage, etwas muss dann anders sein. :) Was ist mit dem Heap c/Assembly? –

+4

Sie sollten dies als eine andere Frage stellen. Heap ist eine libc-spezifische Sache und es gibt kein Äquivalent in der Assembly (kein 'malloc' /' free'). Aber Sie können libc immer noch aus Assembly aufrufen und dann Zugriff auf den Heap erhalten, obwohl es sich um Expertenprogrammierung handelt. –

2

Ich habe Compiler gesehen, die ein overlay Modell anstelle eines Stack-Modells für ihre automatischen Variablen verwenden. Während die Sprache die Zuweisung und Freigabe von automatischen Variablen als Stack darstellt, muss die zugrundeliegende Implementierung nicht so sein.

Bei einigen Compilern existiert der C-Stack, ist jedoch vom Hardwarestapel getrennt.

Dann gibt es Konzepte wie register-windows.

Die Liste geht weiter, aber ich konnte nicht garantieren, dass irgendwas von dem, was Ihr Professor meinte, oder sogar dass ich auf dem richtigen Weg bin. Es gibt nur eine Person, die das zuverlässig beantworten kann.

Die meisten dieser Varianten sind weitgehend konzeptionell konsistent mit Stacks, aber die Implementierungsdetails müssen Sie beachten, wenn Sie mit beiden Sprachen arbeiten.

1

Eine Sache, die beim konzeptionellen Stack gegenüber einem x86-Stack (und möglicherweise anderen Architekturen) anders ist, ist die Richtung, in der der Stack wächst.Es ist üblich, dem Stack beizubringen, wie er wächst, wenn er (abhängig von der Architektur) tatsächlich down im Speicher wächst.