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
Wie erweitere ich einen Eintaktprozessor richtig?

Gehen wir davon aus, dass wir einen Eintaktprozessor haben. Nun soll der Eintaktprozessor so erweitert werden, dass er nach der Erweiterung auch einen neuen bestimmten Befehl ebenfalls ausführen kann. Dafür muss ich verstehen, wie all diese Komponenten zusammenhängen, um genau zu wissen, wo ich meinen neuen "Baustein" für den neuen Befehl hinzufügen kann.

Zum Beispiel kann dieser Eintaktprozessor die "add"-Operation ausführen, da er über Register-Dateien, einen Addierer, eine ALU, einen Multiplexer usw. verfügt. Da der Datenpfad für die "add"-Operation, die Operanden von den Registern zum Addierer leitet, das Ergebnis durch die ALU berechnet, und schließlich das Ergebnis in das Zielregister zurückführt...

Nun habe ich eine Beispiel-Aufgabe mit einer Lösung, bin mir aber unsicher, wie man zu dieser Lösung gelangt. Könnte mir jemand das erklären?

In dieser Aufgabe sollen Sie den dargestellten MIPS-Eintaktprozessor erweitern, sodass der neue Befehl Read Word Until Zero (rwuz) unterstützt wird. Der abgebildete Prozessor unterscheidet sich leicht von dem Ihnen bekannten Eintaktprozessor.
rwuz unterscheidet sich von anderen MIPS-Befehlen dadurch, dass er von dem Prozessor automatisch mehrfach ausgeführt werden soll, solange das gelesene Datenwort nicht null war.
rwuz soll ein Befehl im I-Format sein.
Für rwuz soll der Opcode 0x11 verwendet werden.
Der Direktoperand (immediate) soll zu dem rs-Register hinzuaddiert werden. Das Ergebnis dieser Operation soll im rt-Register gespeichert werden.
Das rt-Register soll gleichzeitig als Adresse für einen Lesezugriff auf den Datenspeicher verwendet werden.
Solange der gelesene Wert aus dem Speicher nicht null ist, soll der selbe rwuz-Befehl im nächsten Taktzyklus erneut ausgeführt werden (PC bleibt gleich). Falls der gelesene Datenwert null ist, soll die nächste Instruktion ausgeführt werden (PC um 4 erhöhen).
Das aus dem Speicher gelesene Datenwort soll nicht in einem Register abgelegt werden.
Tipp: Das Signal rZero zeigt an, ob das aus dem Speicher gelesene Datenwort null ist

Selbst wenn niemand in der Lage ist, mir dies genau zu erklären, kann mir jemand Quellen, Videos oder Bücher empfehlen, damit ich ein besseres Verständnis dafür entwickeln kann?

Bild zum Beitrag
CPU, Prozessor, Hardware, Assembler, Informatik, Universität, Rechnerarchitektur
Eigenes OS programmieren

Moin moin,

ich möchte mir ein eigenes OS programmieren! Bevor Bevor nun gleich irgendein Gemecker kommt will ich erstmal behaupten das es nicht viel können soll, fürs erste ein Kernel mit einer einfachen Textausgabefunktion. Ich habe Vorkenntnisse in C und C++ (ein paar Jahre), welche wahrscheinlich nicht schlecht sein werden. Nun will ich als Bootloader GRUB benutzen, zumindest fürs erste und der Kernel soll in Assembler geschrieben werden. Hab im Internet jede Menge darüber gefunden Kernel in C und so weiter aber ich denke in Assembler macht das ganze am meisten Sinn. Dazu muss ich wohl leider sagen das ich so gut wie gar keine Erfahrung mit Assembler habe und die meisten Tutorials die man dazu findet behandel gleich irgendwelche Windows Programmierungssachen welche mich ja nun nicht interessieren. Daher wäre meine ersten Frage ob mir jemand ein paar Assembler Tutorials zeigen die mir weiterhelfen... Die zweite Frage gilt allen anderen Tutorials, möglicherweise sogar ( ich weiß das klingt bescheuert ) einer Schriott für Schritt Erklärung über einen so einfachen Kernel. Ich kann mir nicht vorstellen das da so sonderlich viel Code hinter steckt.

Vielleicht gibt es ja auch noch andere Leute, die sich damit gerne mal ausseinander setzen wollen und genauso wenig Ahnung wie ich haben dann könnte man sich vllt mal über ICQ, Facebook oder sonstwas unterhalten ;)

Ich bin dankbar für jede Antwort!

MfG Inv151673 ;)

Betriebssystem, programmieren, selber, Assembler, CPP, OS, Bootloader, kernel
Über "Internet" auf PC zugreifen (nicht TeamViewer usw)?

Hallo, ich wünsche euch einen wunderschönen Tag. Meine Frage wäre: Wie kann ich auf einen PC der nicht im Netzwerk ist zugreifen? Also ich sag es mal detaillierter: Ein Computer hat doch eine IP im Netzwerk aber auch außerhalb. Wenn er z.b. auf eine Website zugreift dann mit einer IP (ist klar das das nicht die vom Netzwerk ist). Aber wo würde ich diese IP sehen. Ich meine jetzt: Wenn das mein PC ist der nicht im Netzwerk ist, und ein anderer PC ist in einem Netzwerk. Wie kann ich die "Internet-IP" herausfinden wenn der PC mir gehört. Also über cmd oder ähnliches?! Wenn ich diese "herausgefunden" habe, wie kann ich dann auf diese IP zugreifen? Also das ich dann z.b. zum Anmelde Screen komme wie z.b. bei ssh nur das 1 PC nicht im Netzwerk ist aber ich die "öffentliche" Ip weiß. Wie kann ich auf diese Ip zugreifen?

PS: Ich denke mir grade so, dass man mit der Öffentlichen IP vom Router zugreift oder? Aber das müsste doch heißen, z.b. wenn ich eine "illegale" Website öffne und mein Bruder mit einem anderen PC auf z.b. Facebook zugreift. Wird dann die gleiche IP verwendet. Wenn JA wie soll man dann wissen welcher PC auf welche Website zugegriffen hat? Und wenn das die IP vom Router ist, kann man auf diese zugreifen und irgendwie dann die IP's von den verbundenen PC bekommen? (Wissenswertes)

Danke schon mal und sorry das es so viel ist

PC, Computer, Internet, Windows, Linux, Netzwerk, Assembler, Zugriff
Was ist Assembler ?

Ich wollte mich mal ein bisschen über die Programmiersprache Assembler informieren.

Erstens würde ich gerne Wissen was es mit diesen verschiedenen Arten auf sich hat von Assemblersprachen. Irgendwie gibt es da wohl tausende für verschiedenste Systeme(?) und ist dann da immer die Syntax komplett anders oder was? Oder gibt es da nur für verschiedene Sachen (z.B. Hello World) verschiedene Methoden und trotzdem die gleiche Syntax? Also ich habe mir NASM als Übersetzer, Assembler, Kompilierer(?) geholt und kann Assembler Geschreibel in richtige Dateien umwandeln. Doch nun kommt es: In diesen Dateien wenn ich sie mit einem Editor öffne sind gar keine Nullen und Einsen (Wie ich es erwartet hätte bei Assembler weil es ja auch bei Wiki und so steht) sondern irgendein normales, wirres .exe-Gedöns: "ê| ú¸ ŽÐ¼ û¸ ŽÀŽØˆ)|è) ¸ ŽÀŽØê " was ich halt echt nicht verstehe. Denn das ist doch das was Assembler so geil macht. Aber vor allem konnte ich bisher kein einziges Assembler Programm z.B. in der Terminal ausführen. Ob ich es jetzt zu .bin oder .exe oder so gemacht hab. Aber man kann ja diese komische "Programmiersprache", Assembler auch nicht irgendwie installieren dass es da bestimmte Datei-Endungen gibt und so.

Bitte erklärt mir das und sagt mir wie ich AS-Syntax zu 01110100 fuchteln kann und ausführen kann. Wiederum nicht dass ganze Gejammer dass Assembler eine schwere Sprache ist und und und. Ich will ja nur Wissen wie das alles aufgebaut ist.

Danke.

Computer, Programm, Sprache, programmieren, System, Assembler
Division in Assembly. Zeichen sind in ASCII gespeichert?
section .text
global main

main:
  mov esi, 10           ; ESI holds current number
  mov eax, 0           ; EAX holds sum of numbers
  push 10             ; Line feed for end of line (Stack is first in, last out -> Line feed will be last char)
  mov edi, 10           ; Divisor of 10 for seperating digits of number (used in divisionLoop)



; Sum numbers 1 through 10
sumLoop:
  add eax, esi          ; Add number to sum
  dec esi             ; Next number
  jnz sumLoop           ; Loop until 0



; Seperate eax into its digits, by dividing by 10 multiple times,
; where in each division the remainder will be a single digit 
; and the quotient will be the remaining digits used as dividend in next loop run
divisionLoop:
  mov edx, 0           ; Make sure edx is empty, as it is used as upper half of dividend
  div edi             ; Divide eax by edi (= 10) => quotient is in eax (= Rest of digits for next loop), remainder in edx (= Single digit)
  add edx, 48           ; Make edx (digit) a char representing its value by adding '0' to it
  push edx            ; Push char to stack for usage in print later

  cmp eax, 0           ; Loop until quotient is 0 (=> no more digits left)
  jne divisionLoop



; Print digits from Stack one by one
printLoop:
  mov eax, 4
  mov ebx, 1
  mov ecx, esp          ; Print top of stack (esp always points to top of stack)
  mov edx, 1           ; Length of 1 byte (= 1 char)
  int 80h

  pop esi             ; Remove top of stack
  cmp esi, 10           ; Loop until Line feed is reached
  jne printLoop


exit:
  mov eax, 1
  mov ebx, 0           ; Exit code 0
  int 80h

Hallo,

hier steht ein Programm in Assembler, dass die Zahlen von 1 bis 10 addiert.

Die 55 durch 10 teilt und die Reste der Division dann in einem Stack speichert.

push....

Am Ende wird alles über den Standardkanal ausgegeben auf der Konsole.

Wenn ich 55 / 10 teile ergibt das Quotient 5 steht in Register eax und der Rest hier auch 5 in edx Register. Bevor ich jetzt den Rest auf den Stack lege wird die Zahl mit 48 addiert. ergbit 53 ist das char Zeichen 5 im ASCII Code.

Heißt das jetzt, dass die Ergebnisse bei einer ganzzahligen Division im Assembler-Code immer in ASCII-Zeichen gespeichert sind?

Computer, Mathematik, Java, Assembler, Informatik, Programmiersprache, Assembly
Programm dass Subtrahieren soll durch Addition?

Hallo Leute heute eine etwas untypische Aufgabe:

Wir schreiben das Jahr 2042. Nach einer extremen Verschärfung der Finanzkrise können die Universitäten nur noch sehr preiswerte Rechner anschaffen. Zum Glück hat der führende Prozessorhersteller Inrola gerade einen neuen Chip namens Untium auf den Markt gebracht. Dieser Chip ist so preiswert, weil er nur noch genau eine Instruktion hat nämlich „subtract-and-branch-on-less-zero“. Dieser Befehl hat vier Parameter, Quelle 1 (Q1), Quelle 2 (Q2), Zielregister (ZR) und Sprungadresse (SA). Wird der Befehl aufgerufen, berechnet er Q1 − Q2, schreibt das Ergebnis in ZR und springt dann nach SA, wenn das Ergebnis, das er in ZR geschrieben hat, kleiner als 0 ist (sonst folgt die Bearbeitung des Befehls in der folgenden Zeile). Der Untium-Prozessor verfügt über 6 Ganzzahlregister, $1 bis $6. Als Quelle kann entweder ein Register oder eine ganzzahlige Konstante angegeben werden, ZR ist immer ein Register. SA gibt die Nummer des Befehls an, zu dem eventuell gesprungen werden soll.Als Studierende kommt Ihnen die Ehre zuteil, den ersten Rechner dieses Typs, den SPOZ-I zu testen. Da zu einem so frühen Zeitpunkt noch keine Compiler zur Verfügung stehen, müssen sie den 1-Befehl-Assembler benutzen. Ein Assemblerprogramm besteht aus Zeilen der Form:

Q1, Q2, ZR, SA // optional kann hier ein Kommentar stehen

Ich soll jetzt herausfinden, sie eine wie eine Addition durchgeführt werden kann. Dabei seien die Sum-

manden in den Registern $1 und $2 vorgegeben. Die Summe soll nach der Berechnung in $3 stehen. Ich bin da leider nicht gehirntechnisch in der Lage, die Aufgabe zu lProgramm dass Subtrahieren soll durch Additionösen...

Programm, Assembler, Register