Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly ARMv7模拟器的内部_重新定位错误_Assembly_Arm - Fatal编程技术网

Assembly ARMv7模拟器的内部_重新定位错误

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

我正在尝试将下面的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 = -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