2017-02-16 36 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數據*,大小);數據是一個數組,大小是大小。它可以處理任何大小爲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的艦隊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 
相關問題