0

我有一个任务需要用 armasm 编写的 Ln 算法。我决定使用 BKM 算法。该算法使用查找表。该作业还需要在 asm 中实现查找表。问题是我在编译时遇到了 immediateOutOfBounds 错误或garbageFollowingInstruction 错误,即使是像VMOV.f64 d2, #0.0这样的立即数。在我的其他 asm-Functions 这些操作工作正常

这是代码:

.global bkm_assembly

bkm_assembly:
    // r0 -> Adresse des Arguments dessen ln berechnet werden soll
    // r1 -> Adresse des LookUpTables
    // d0 -> e
    // d1 -> Argument
    // d2 -> Result
    // d3 -> Buffer for addition
    // r4 -> Buffer for LookupCalculation

    push {r4-r8, lr}
    b FillTablef

algorithm:
    VMOV.f64 d0, #2.718281828459045235360287471352662497757247093699959574966967627724076
    VLDR.f64 d1, [r0]
    VMOV.f64 d2, #0.0

algorithmArgBiggerE:
    //Divide Argument by e while Argument > e, add 1 each time
    VCMP.f64 d1, d0
    VMRS APSR_nzcv, FPSCR//get the Flags to be used by branch
    BLS algotithmArgSmallerEf
    VDIV.f64 d1, d1, d2
    VMOV.f64 d3, #1.0
    VADD.f64 d2, d2, d3
    B algorithmArgBiggerEb

algorithmArgSmallerE:
    //Main BKM Execution
    // d4 -> x
    // d5 -> s
    // d6 -> z
    // r2 -> k
    // r3 -> N

    MOV r3, #53
    VMOV.f64 d4, #1.0
    VMOV.f64 d5, #1.0
    MOV r2, #0

ForLoopBegin:
    CMP r3, r2
    BHS ForLoopEndf
    VMUL.f64 d6, d4, d5
    VADD.f64 d6, d6, d4
    //IF Condition
    VCMP.f64 d6, d1
    VMRS APSR_nzcv, FPSCR//get the Flags to be used by branch
    BLS EndIff
    VMOV.f64 d4, d6
    //clalculate LookUpAdress
    ADD r4, r1, r2, LSL #2
    VLDR.f64 d3, [r4]
    VADD.f64 d2, d2, d3
EndIf:
    VMOV.f64 d3, #2.0
    VDIV.f64 d5, d5, d3
    B ForLoopBeginb

ForLoopEnd:
    B EXITf






FillTable:
    // d2 -> Aktueller Wert zum befüllen des Lookups
    //Fill the Lookuptable
    LDR R1, =LookUp
    VMOV.f64 d2, #0.693147180559945297099404706000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.405465108108164392935428259000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.223143551314209769962616701000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.117783035656383447138088388000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.060624621816434840186291518000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.030771658666753686222134530000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.015504186535965253358272343000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.007782140442054949100825041000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.003898640415657322636221046000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.001951220131261749216850870000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000976085973055458892686544000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000488162079501351186957460000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000244110827527362687853374000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000122062862525677363338881000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000061033293680638525913091000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000030517112473186377476993000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000015258672648362398138404000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000007629365427567572417821000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000003814689989685889381171000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000001907346813825409407938000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000953673861659188260005000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000476837044516323000000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000238418550679858000000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000119209282445354000000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000059604642999033900000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000029802321943606100000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000014901161082825400000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000007450580569168250000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000003725290291523020000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000001862645147496230000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000931322574181798000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000465661287199319000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000232830643626765000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000116415321820159000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000058207660911773300000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000029103830456310200000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000014551915228261000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000007275957614156960000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000003637978807085100000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000001818989403544200000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000909494701772515000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000454747350886361000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000227373675443206000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000113686837721610000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000056843418860806400
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000028421709430403600
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000014210854715201900
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000007105427357600980
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000003552713678800490
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000001776356839400250
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000888178419700125
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000444089209850063
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000222044604925031
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000111022302462516
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000055511151231258
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000027755575615629
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000013877787807815
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000006938893903907
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000003469446951954
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000001734723475977
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000000867361737988
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000000433680868994
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000000216840434497
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000000108420217249
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000000054210108624
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000000027105054312
    VSTR.f64 d2, [r1]
    B   algorithmb


EXIT:
    pop {r4-r8, pc}




.data
.balign 4
LookUp:     .skip   528 //Array for the lookuptable

提前致谢

4

0 回答 0