2017-02-16 16 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 

私は配列を逆にしようとしています。これはアセンブリーの逆関数です。関数はreverse(int data *、size)です。データは配列で、サイズはサイズです。これはサイズ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よりも早く予期せぬことが起こるはずです。(また、出力だけを見ないで、1つの命令ステップごとに見てください。本当に何ですか?起こっています。あなたがそれを書いているときにコードがうまく動作しなくても、ちょうど幸運な事故によって正しい出力を得ることができます) – Ped7g

答えて

0

以下は、1つのアレイの別のアレイへの逆コピーの粗い、おそらく非効率的な例です。必ずしもあなたが望むものではないかもしれないが、いくつかのアイデアを育てるかもしれない。

ハードウェア

:マーベルアルマダ370/XP モデル名:のARMv7プロセッサREV 2(v7l)GDBを使用して

.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) 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 
関連する問題