我有一个任务需要用 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
提前致谢