2017-02-16 30 views
1
.global reverse 

.data 
start: .word 1 
end: .word 1 
loopcount: .word 0 

reverse:  
    ldr r3, =end 
    str r1, [r3]  

next: 
    ldr r3,=end 
    ldr r2,=start 
    ldr r3, [r3] 
    ldr r2, [r2] 

    cmp r2,r3 
    bgt done 
    cmp r2,r3 
    beq done 

    sub r3,r2 
    mov r2,#0 
    mov r1,#0 

loop: 
    cmp r2,r3 
    beq next2 

    add r2, r2, #1 
    add r1, r1, #4 
    b loop 

next2: 
    ldr r3, [r0] 
    add r0, r0, r1 
    ldr r2, [r0] 
    str r3, [r0] 
    sub r0, r0, r1 
    str r2, [r0] 

    add r0, r0, #4 
    ldr r3,=end 
    ldr r1, [r3] 
    sub r1, r1, #1 
    str r1, [r3] 
    ldr r3,=start 
    ldr r1, [r3] 
    add r1, r1, #1 
    str r1, [r3] 
    b next 


done: 
    bx lr 

Я пытаюсь изменить массив, и это моя обратная функция в сборке, функция обратная (int data *, size); data - массив, а размер - размер. Он работает с любым массивом размером 5, но для более длинных массивов, например размером 10, он будет игнорировать последние 2 и действовать так, как будто массив имеет размер 8 и свопит его все, как если бы последние 2 числа в массиве не есть, он вернется:Сборка, не могу сказать, что не так с моим кодом ARM-процессор

Array: 
1 2 3 4 5 6 7 8 9 10 
My Return: 
8 7 6 5 4 3 2 1 9 10 

Я не могу понять, в чем моя проблема.

+0

Я не могу найти, почему ваш код даже иногда работают, поскольку это выглядит очень сложным для меня, плюс все переменные памяти. Но отладчик может показать вам, что он делает. Я бы начал с массивов размером 0, 1, 2, ... Я думаю, что должно произойти что-то неожиданное раньше, чем в размере 10. (и не смотрите только на вывод, посмотрите на один шаг инструкции, что действительно происходит иногда. Вы можете получить корректный результат, даже если код не работает, когда вы его пишете, просто по счастливой случайности) – Ped7g

ответ

0

Ниже представлен грубый и, вероятно, неэффективный пример обратного копирования одного массива в другой; что может быть не обязательно, что вы хотите, но может способствовать некоторым идеям.

Оборудование: Marvell Armada 370/XP название модели: ARMv7 Processor оборотов 2 (v7l)

.bss 
     rArray: .zero 
.data 
     Array: .word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,32, 64, 128, 256, 512 
     .equ len.Array,.-Array 
.text 
     .global main 
main: 
     ldr r1,=Array     // Array 
     mov r2, #len.Array    // length of array 
     mov r3, #0      // zero init counter Array 

     ldr r4,=rArray     // rArray 
     sub r5,r2, #4     // rArray counter - 1 element 

     1: 
       ldr r10, [r1,r3]  // load word size element position x from Array 
       str r10, [r4,r5]  // store word size element position x from Array into word size position y in rArray 
     add r3, r3, #4     // inc Array counter by 4 since word size is 4 bytes 
     subs r5, r5, #4     // decement rArray counter by 4 & get status (s) 
     bpl 1b       // branch back to loop if positive or zero; i.e., N condition flag is clear 

Результаты использования GDB:

(gdb) x/21d $r1 
0x1102d:  1  2  3  4 
0x1103d:  5  6  7  8 
0x1104d:  9  10  11  12 
0x1105d:  13  14  15  16 
0x1106d:  32  64  128  256 
0x1107d:  512 
(gdb) x/21d $r4 
0x11082:  512  256  128  64 
0x11092:  32  16  15  14 
0x110a2:  13  12  11  10 
0x110b2:  9  8  7  6 
0x110c2:  5  4  3  2 
0x110d2:  1 

 Смежные вопросы

  • Нет связанных вопросов^_^