Hallo,
Ich bin ein absoluter Neuling in Assembler und versuche die folgende Aufgabe zu verstehen:
Übersetzen Sie die beiden folgenden C-artigen Programmausschnitte in NASM-artige Pseudocodes:
collatz ( n ) {
k = 0;
while ( n > 1) {
if ( n % 2 == 0) { // n is even
n = n / 2;
} else { // n i odd
n = n * 3;
n = n + 1;
}
k = k + 1;
}
return k ;
}
Nun die Lösung und wie ich versuch habe es zu verstehen:
global collatz
collatz:
mov rax , 0
mov r9 , 0 ; k = 0
; wie ich verstehe werden rax und r9 gleich 0 gesetzt, warum?
while: ; While Condtion ist in collatz:
cmp rdi , 1
jle end ; Benden der schleife wenn bedingung nicht mehr stimmt
; nun werden rdi und 1 miteinander verglichen, warum?
if:
mov rax , rdi ; kopiere rdi (n) in rax
mov rsi , 2 ; kopiere die 2 in rsi
div rsi ; teile rax/rdi
mod: ; ausfuehrung von mod bedingung
mov rax , rdi ; kopiere eingabe von rdi in rax
mov rsi , 2 ; kopiere die 2 in rsi
div rsi ; rax/ rsi
mov rdi , rax ; kopiere eingabe von rax in rdi
add r9, 1
jmp while
else: ; n= n *3 und n = n + 1
mov r10, rdi ; kopiere eingabe von rdi in r10
imul r10, 3 ; n = n * 3
add r10, 1 ; n = n + 1
mov rdi, r10 ; kopiere eingabe von rax in rdi
add r9 , 1 ; k = k + 1
jmp while
end:
mov rax , r9 ;
ret ; benden der funktion
Auf eine Beantwortung der Fragen und eine Schritt für Schritt Erklärung, warum es so gemacht wurde, würde ich mich sehr freuen.