寄存器能够保存32位值吗?

时间:2019-06-01 04:09:32

标签: assembly arm

我目前正在解决ARM装配中Euler项目的问题1。当输入值设置为较小的数字时,该代码可以正常工作。当我将其提高到1000时,它溢出并给我一个不正确的值。

.global _start     // required

_start:
    MOV r0, #0     // var r0 = 0
    MOV r1, #10    // var r1 = 10

loop:
    ADD r0, r0, #1 // r0++
    CMP r0, r1     // compare r0 and r1
    BEQ done       // if (r0 == r1) goto done
    MOV r2, r0     // var r2 = r0
    MOV r3, #0x3   // var r3 = 3
    MOV r4, #0x0   // var r4 = 0
    CMP r0, r3     // compare r0 and 3
    BLT loop       // if (r0 < 3) goto loop

int_div:
    CMP r2, r3     // compare r2 and r3
    BLT loop2      // if (r2 < r3) goto loop2
    ADD r4, r4, #1 // r4++
    SUB r2, r2, r3 // r2 -= r3
    B int_div      // goto int_div

loop2:
    CMP r2, #0     // compare r2 and 0
    BEQ add        // if (r2 == 0) goto add
    CMP r0, #5     // compare r0 and 5
    BLT loop       // if (r0 < 5) goto loop
    CMP r3, #5     // compare r3 and 5
    BEQ loop       // if (r3 = 5) goto loop
    MOV r2, r0     // r2 = r0
    MOV r3, #5     // r3 = 5
    MOV r4, #0x0   // r4 = 0    
    B int_div      // goto loop

add:
    ADD r5, r5, r0 // r5 += r0
    B loop         // goto loop

done:
    MOV r0, r5     // output value
    MOV r7, #1     // required
    SWI 0          // required

r1 = 1000时的输出应该是233168。它给出174。r1 = 10时的输出是23并且是正确的。

0 个答案:

没有答案