Ich mache ein Klassenprojekt, das ich C-Code nehmen soll, drehe es in x86-64 Assembly und ändere es dann zu Y86. An dieser Stelle soll ich die Summe der Elemente in einer verketteten Liste an Rax zurückgeben. Wenn ich jedoch versuche, den y86-Compiler zu verwenden, wird er nicht angezeigt. Die Y86 Ich machte sah wie folgt aus:Y86 Code - gibt nicht zurück oder zeigt rax
.pos 0
irmovq Stack,%rsp
irmovq Stack,%rbp
jmp Main
Main:
irmovq ele1,%rax
pushq %rax
call sum_list
halt
sum_list:
pushq %rbp
rrmovq %rsp,%rbp
irmovq $24,%rdx
subq %rdx,%rsp
irmovq $0,%rdx
rmmovq %rdx,-8(%rbp)
jmp L2
L3:
mrmovq 24(%rbp),%rax
mrmovq (%rax),%rax
mrmovq -8(%rbp),%rdx
addq %rax,%rdx
rmmovq %rdx,-8(%rbp)
mrmovq 24(%rbp),%rax
mrmovq -8(%rax),%rax
rmmovq %rax,24(%rbp)
L2:
irmovq $0,%rcx
mrmovq 24(%rbp),%rdx
subq %rcx,%rdx
jne L3
mrmovq -8(%rbp),%rax
rrmovq %rbp,%rsp
popq %rbp
ret
#linked-list
.align 8
ele1:
.quad 0x00d
.quad ele2
ele2:
.quad 0x0e0
.quad ele3
ele3:
.quad 0xf00
.quad 0
.pos 0x500
Stack:
Und so rax
0xfed haben sollte, aber in meinem Ergebnis, aber es passiert nichts.
Dies ist der C-Code ich es von bekam:
typedef struct ELE{
long val;
struct ELE *next;
} *list_ptr
long sum_list(list_ptr ls){
long val = 0;
while(ls){
val += ls->val;
ls = ls->next;
}
return val;
}
Niemand möchte diese unproduktive Compiler-Ausgabe lesen, die nach jeder Anweisung alles auf dem Stack speichert. Und was meinst du mit "nichts erscheint"? Ein Register hat immer einen Wert, auch wenn es Null ist. Sind Sie sicher, dass Sie das Ergebnis richtig gedruckt haben? Haben Sie sich RAX mit einem Debugger angesehen? –
BTW, normaler Stil in C wäre, eine typedef für die Struktur (kein Zeiger auf die Struktur) zu machen, und dann schreiben Sie "const list_elem * p". Dies macht es offensichtlich, dass es ein Zeiger ist, bevor der Name gelesen wird. Wenn ich 'long sum_list (list_ptr ls)' betrachte, ist mein erster Eindruck, dass es eine Funktion ist, die etwas wertschätzt. (Was technisch stimmt, ein Zeiger hat einen Wert.) –
@PeterCordes Ich benutze yas und yis, um meine Dateien zu kompilieren und auszuführen. Und es zeigt an, wenn Register geändert werden. Es zeigt jedoch nichts über% rax –