我目前正在解决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并且是正确的。