Assembly ARMv7模拟器的内部_重新定位错误
我正在尝试将下面的c代码翻译成程序集,以便分配任务Assembly ARMv7模拟器的内部_重新定位错误,assembly,arm,Assembly,Arm,我正在尝试将下面的c代码翻译成程序集,以便分配任务 int sqrtIter(int a, int xi, int cnt, int k, int t) { for (int i=0; i<cnt; i++) { int step = ((xi*xi-a)*xi)>>k; if (step > t) step = t; else if(step< -t) step
int sqrtIter(int a, int xi, int cnt, int k, int t)
{
for (int i=0; i<cnt; i++)
{
int step = ((xi*xi-a)*xi)>>k;
if (step > t)
step = t;
else if(step< -t)
step = -t;
xi = xi - step;
}
return xi;
}
int x = sqrtIter(168, 1, 100, 10, 2); // Output: 13
<代码> int qrrter(int a,int席,int cNint,int k,int t)
{
对于(int i=0;i>k;
如果(步骤>t)
阶跃=t;
否则如果(步骤<-t)
步骤=-t;
席=席步;
}
返回席;
}
intx=sqrtIter(168,1100,10,2);//输出:13
这是我的汇编代码
.global _start
a: .word 168
xi: .word 1
cnt: .word 100
k: .word 10
t: .word 2
x: .space 4
_start:
//use R0 for i set R0 to 0
MOV R0, #0
//load cnt into R1
LDR R1, =cnt
//use R2 for step int
LDR R2, #0
//load xi into R3
LDR R3, =xi
//load a into R4
LDR R4, =a
//load k into R5
LDR R5, =k
//load t into R6
LDR R6, =t
LOOP:
CMP R0, R1 //i-cnt
BGE END //branch to end if i>=n
//R7 for (xi*xi)(step is R7)
MUL R7, R3, R3
//reuse R7 to -a
SUB R7, R7, R4
//multiply by xi again
MUL R7, R7, R3
//right shift R7 by k
ASR R7, R7, R5
//if statement
CMP R7, R6
//if step >t step = t
MOVGT R7, R6
//else if step <-t step = -t
//R8 for negative t
MVN R8, R7
ADD R8, R8, #1
CMP R7, R8
MOVLT R7, R8
// xi = xi-step R3-R7
SUB R3, R3, R7
//i++
ADD R1, #1
B LOOP
END:
//store result to x
LDR R9, =x
STR R3, [R9]
.global\u开始
a:字168
十一:字一
cnt:.word 100
k:单词10
t:单词2
x:.空格4
_开始:
//将R0设置为0时使用R0
MOV R0,#0
//将cnt加载到R1中
LDR R1,=cnt
//将R2用于步骤int
LDR R2,#0
/加载席到R3
LDR R3,=xi
//将a加载到R4中
LDR R4,=a
//将k加载到R5中
LDR R5,=k
//将t加载到R6中
LDR R6,=t
循环:
CMP-R0,R1//i-cnt
BGE END//如果i>=n,则分支到端
//用于(xi*xi)的R7(步骤为R7)
MUL R7、R3、R3
//将R7重用到-a
子R7、R7、R4
/再次由席乘
MUL R7,R7,R3
//右移R7到k
ASR R7、R7、R5
//if语句
CMP R7,R6
//如果步骤>t步骤=t
MOVGT R7、R6
//否则,如果步骤我猜是ldrr2,#0
。您可能想要一个MOV
。哪一行是行#15?只需检查并修复代码行,将其保存到临时文件,错误消息会告诉您问题所在,错误消息的哪一部分您不明白?只需剪切并粘贴代码,然后自己运行汇编程序,就可以了默认的armv4t so.s:Assembler messages:so.s:34:Rd和Rm在mul so.s:15:Error:internal_relocation(type:OFFSET_IMM)not fixed up将其更改为较新的值,您只需获得ldr r2的修复,这有点明显。请尝试mov r2、#0或ldr r2,=0