Ich versuche, einen einfachen Einfügesortieralgorithmus in Assembly zu übersetzen, aber etwas über diese bestimmte Konfiguration verursacht das Programm einen invalid pointer
Fehler zu erhalten.Ungültiger Zeiger Problem beim Einfügen sortieren in ARM-Assembly
Hier ist die C-Version, die ich verwende:
int n, array[100], c, d, t;
for (c = 1; c < n - 1; c++) {
d = c;
while (d > 0 && array[d] < array[d - 1]) {
t = array[d];
array[d] = array[d - 1];
array[d - 1] = t;
d--;
}
}
Dies ist eine C-Struktur, die verwendet wird:
typedef struct {
int *list;
int size;
int maxSize;
} list;
Hier ist meine Assembly-Datei:
.syntax unified
.text
.align 8
.global insert_ARM
.func insert_ARM, insert_ARM
.type insert_ARM, %function
insert_ARM:
push {r4-r11, ip, lr}
@ setup
ldr r4, [r0, #4]
sub r4, r4, 1 @ r4 = n-1
mov r5, #1 @ c=1
mov r6, #16 @ d=0, which starts at #16
mov r7, #0 @ t=0
for:
@ d = c ; needs these lines to do the assembly equivalent, which is * 4.
mov r6, r5 @ d = c
LSL r6, #2 @ uses logical shift left: multiplies r6 by 4 to get the correct index
add r6, r6, 16 @ add 16 because that's where the array starts
while:
@ condition 1: d > 0
cmp r6, #0 @ if d <= 0, get out of there
ble forLoopStatements
@ condition 2: array[d] < array[d-1]
@ first, I need to define array[d] and array[d-1]
@ r8 = array[d] and r9 = array[d-1]
sub r10, r6, #4 @ r10 = d-1
ldr r9, [r0, r10] @ r9 = array[d-1]
ldr r8, [r0, r6] @ r8 = array[d]
cmp r9, r8 @ comparing array[d-1] with array[d]
bge forLoopStatements @ if array[d] >= array[d-1], get out of there
@ while effects
@ note that r8 should still be array[d] here.
str r9, [r0, r6] @ array[d] = array[d-1]
str r8, [r0, r10] @ array[d-1] = t @ BUG HERE.
sub r6, r6, #4 @ d--; // does -4 for ARM
bal while @ repeat loop
forLoopStatements:
@ (c<n-1; c++)
add r5, r5, #1 @ c++
cmp r5, r4 @ compares c with n-1
blt for @ if c < n-1, loop again
end:
mov r0, r10
pop {r4-r11, ip, lr}
BX lr
.endfunc
.end
Es scheint
str r8, [r0, r10] @ array[d-1] = t
zu sein
, die an einem bestimmten Punkt eine Auslösung verursacht.
Edit: Ich fand heraus, dass r8-Zahlen in dieser Instruktion irgendwie falsch sind, sofort da etwas mit wie
mov r8, #4
vor dem Laden, um die Fehler verhindert (aber natürlich macht die Ergebnisse falsch).
Bei der Untersuchung des Inhalts von r0 kommt es vor, dass das Update den Bereich verlässt, weil andere Mitglieder der Struktur im Prozess geändert werden. Array-Index 0 ist bei +16.
Verwenden Sie einen Debugger, um den Wert von 'r0' und' r8' an diesem Punkt zu prüfen und festzustellen, was falsch ist. Dann finde heraus, wie es diesen Wert bekommen hat. Es ist unklar, was Ihre Struktur ist und wo 'r0' zeigt. Sie sagen, es enthält einen Zeiger auf ein Array, aber stattdessen hat es einen Index? – Jester
typedef struct {int * list; int Größe; int maxSize; } Liste; so * Liste ist in R0. Ich versuche, es mit dem Sortieralgorithmus zu ändern. – Rez
Dann fehlt die Ladung des 'listen' Mitglieds. Was ist 'sortedList_index_0' und warum hat es einen Offset von' 16'? – Jester