Linux Assembly Tutorial Zustände:Assembly: Warum verursacht das Springen zu einem Label, das über ret zurückkehrt, einen Segmentierungsfehler?
gibt es eine sehr wichtige Sache zu erinnern: Wenn Sie von einer Prozedur (mit dem RET-Befehl) zurückzukehren planen, nicht springen zu ihm! Wie in "nie!" Das wird einen Segmentierungsfehler auf Linux verursachen (was OK ist - alles, was Ihr Programm tut, wird beendet), aber in DOS kann es in verschiedenen Graden des Schreckens in Ihrem Gesicht explodieren.
Aber ich kann nicht verstehen, warum es einen Segmentierungsfehler nicht verursacht. Es klingt wie eine Rückkehr von einer Funktion.
Ich habe eine Situation, in der ich die Logik implementieren muss "Wenn X passiert, rufen Sie Prozedur A auf. Andernfalls rufen Sie Prozedur B." Gibt es einen anderen Weg als herumzuspringen wie ein Känguru-Spaghetti-Code?
Nur eine Anmerkung: Es gibt nichts, was Sie daran hindert, dies zu tun, aber was es tut, ist für neue Assembler-Programmierer nicht immer offensichtlich. Der häufigste Fall wird als "Tail Call" bezeichnet und ist in funktionalen Sprachen üblich. Der Effekt besteht darin, zum Aufrufer der Funktion zurückzukehren, die den Sprung enthält (den Rest dieser Funktion zu umgehen), * wenn * Sie Ihren kleinen Teil des Stapels bereinigt haben. Wenn nicht, dann sehen Sie segfaults. – cHao
Stellen Sie sicher, dass Sie den Unterschied von 'jmp' und' call' verstehen. – hirschhornsalz