Ich versuche, eine einfache Prozedur in x86-64 Assembly schreiben, die einfach die Länge eines Array von Ints zurückgibt. Das letzte Element im Array ist eine 0, die nicht gezählt werden sollte. Das Array wird als int * vom C-Code übergeben.Array-Element Vergleich in x86-64 Assembly (AT & T-Syntax)
Mein Assembler-Code ist wie folgt:
f1:
movq $0, %rax # zero out %rax
jmp test # jump to test
body:
incq %rax # increment %rax, which is counter and array index
test:
cmpq $0, (%rdi,%rax,4) # compare (rdi + (rax * 4)) to 0
jne body # jump if zero flag is not set
ret
Wenn diese läuft, bekomme ich ein Ergebnis, das nicht richtig, aber nicht wild falsch entweder, also statt 11 (Größe des Arrays bestanden minus endet 0) Ich bekomme 38. Was ich denke ist, dass meine Vergleichsaussage falsch ist. Mein Denken war, dass, da Cmpq führt (dest - src), ohne die Register zu ändern, wenn der Array-Index 0 ist, würde 0-0 eine Null ergeben, so dass die Null-Flag gesetzt wäre, aber das scheint nicht zu passieren.
Ich kann willkürlich jedes Element des Arrays in% rax laden, die den richtigen Wert zurückgibt:
movq (%rdi,%rax,4), %rax # %rax initially 0, so first element loaded into %rax
Jede Hilfe wäre sehr dankbar!
Gut gemacht, deinen Code sehr kurz haltend, nur der Teil, der nicht tut, was du denkst, dass es sollte, und um zu erklären, was du denkst, sollte passieren, also war es einfach, genau das zu erklären Thing. –