Assembler – die besten Beiträge

Wie sind die Registerkonvention im Assembler zu verstehen?

Guten Morgen,
ich bin Schülerstudentin und sitze seit ca 1 Woche an einer Aufgabe in Mips, die wir nun endlich fertig haben. Nun sind wir allerdings auf ein Problem gestoßen und zwar wissen wir nicht wie wir mit den Registerkonventionen umzugehen haben.

Ich zähle nun einmal die Regeln zu einer Funktion mit Funktionsaufrufen (nicht Blattfunktion auf), darunter (in dick) befinden sich meine Fragen und Kommentare.

Konventionen:

– Sichere $ra auf dem Stack!

Ist für uns klar, denn die Returnadresse geht sonst nach einem Funktionsaufruf verloren und es kommt zu einer Endlosschleife.

– Weise Variablen, die nach einem Aufruf benötigt werden, an

einen $si Register zu und sichere zuvor $si auf dem Stack.

– weise Variablen, die nach einem Aufruf nicht länger benötigt

werden, an einen $ti Register zu

Ich nehme diese zwei Punkte einmal zusammen, denn hier beginnt das böse Übel.
Wie ist das denn eigentlich gemeint ? Ich persönlich verstehe es so, dass die $si Register vor dem Aufruf in den Stack geladen werden müssen, wenn sie in der aufzurufenden Funktion auch vorhanden sind. Und durch das Speichern wird der Wert nicht überschrieben. Die Frage wäre nun, wenn ich ein Register (z.b für einen Counter) benötige, dass nicht in der aufzurufenden Funktion vorkommt, ich es auch auf den Stack speichern muss, oder ob es dann ein t Register wird, statt ein s?

Man sagt ja, dass die t-Register sind für die Haltung kurzlebiger (temporärere) Variablen bestimmt sind. Nur was ist damit genau gemeint?

– kopiere Argumente ($ai) , die nach einem Aufruf benötigt

werden, in ein $si-Register und sichere zuvor $si auf dem

Keller

Was meint man hiermit genau.

Es wäre sehr nett, wenn ihr konkret werden würdet, denn ich verstehe das meiste im Internet schon nicht.

Vielen Dank im Voraus

Luisa

Computer, Mathematik, CPU, programmieren, Assembler, Informatik, Programmiersprache, Register

Speicherzugriffsfehler in Assembler?

Hey ich habe folgenden rekursiven Fibonacci Code geschrieben. Ich erhalte beim ausführen immer einen Speicherzugriffsfehler

Pastebin-Link: https://pastebin.com/qNWcyBa5

.intel_syntax noprefix

.section .data

n: .quad 10 # define the fibonacci number that should be calculated

.section .text

.global _start

_start:

# call Fibonacci function f(n)

push [n] # parameter: fibonacci number to calculate

call f # call function

add rsp, 8 # remove parameter from stack

# print calculated Fibonacci number on stdout

#call printnumber

# exit process with exit code 0

mov rax, 1

mov rbx, 0

int 0x80

# f: Calculates a Fibonacci number

#  f(n) = {n, if n<=1; f(n-1)+f(n-2), else}.

#  Parameter: Integer n >= 0, passed on stack

#  Returns:  Fibonacci number f(n), returned in rax

.type f, @function

f:

push rbp # basepointer auf stack pushen

mov rbp, rsp # basepointer bekommt Wert des stackpointers

add rbp, 8 # 1.Parameter

mov rbx, [rbp] # rbx= 1.Paramter

cmp rbx, 0 # wenn n=0 passiert nichts, jmp zu end

je end

cmp rbx, 1 # wenn n=1 jmp zu baseone

je baseone

dec rbx # n-1

push [rbx] # push n-1

call f # call f(n-1)

dec rbx # n-2

push [rbx] # push n-2

call f # call f(n-2)

baseone: add rdi, 1 # rdi = rdi + 1

end: pop rbp # basepointer wieder vom Stack entfernen

ret

weiß auch nicht warum gf hier so viele Leerzeichen reinmacht. Naja hab das meiste kommentiert. Also wenn jemand einen Tipp hat wäre ich sehr dankbar.

Wer es kompilieren will.

as --gstabs -o Dateiname.o Dateiname.asm

ld -m elf-x86-64 -o Name Dateiname.o

./Name

Lg Tischtennisftw

programmieren, Assembler, Informatik, Fibonacci

Meistgelesene Beiträge zum Thema Assembler