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
Memory 访问数组中的第n个元素_Memory_Assembly_Arm - Fatal编程技术网

Memory 访问数组中的第n个元素

Memory 访问数组中的第n个元素,memory,assembly,arm,Memory,Assembly,Arm,我在翻译伪代码 for(i=1; i<MAX; i++) if(split[j] = 1) for(j=i*3; j<MAX; j=j+i) split[j]=0 for(i=1;i我在代码中发现的一个错误是在寄存器中存储零,而不是它指向的地址 ldr R2, [R1, R0] mov R2, #0 ; This is wrong. You are zeroing a register and not the address to

我在翻译伪代码

for(i=1; i<MAX; i++)
    if(split[j] = 1)
        for(j=i*3; j<MAX; j=j+i)
            split[j]=0

for(i=1;i我在代码中发现的一个错误是在寄存器中存储零,而不是它指向的地址

ldr R2, [R1, R0]
mov R2, #0 ; This is wrong. You are zeroing a register and not the address to 
           ; which it points to 
下面是程序集的等效程序集,带有注释

for(i=1; i<MAX; i++)
    for(j=i*3; j<MAX; j=j+i)
        split[j]=0

           ldr r0,=split
           ldr r4, =MAX
           xor r5,r5  ; this is the zero we shall store into split[j]  

           mov r2, #1 ; i
outer_loop cmp r2,r4 ; i<MAX
           bge end_loop1
           add r1, r2, r2, lsl #1 ; j=i*2+i
inner_loop cmp r1, r4 ; j<MAX
           bge end_loop2
           str r5,[r0], r1, lsl #2 ;split[j]=0
           add r1,r1,r2 ; j=j+i
           b inner_loop
end_loop2  add r2,r2,#1 ; i++
           b outer_loop

end_loop1  end

用于(i=1;iIt取决于
split
的类型。它是一个字节数组吗?int?Longs?Chars?因为您使用的是
ldr
,所以我假设它是一个字。为了绝对确定,我会使用调试器检查内存。此外,您不需要加载到R2中,然后立即将其设置为0:只需将其设置为0并存储。在数据部分中,split是声明为“.skip”,后跟一个计算值为400的表达式。如果这不是你要问的,我不清楚?他问的是你在数组中存储了什么。从你的示例中可以是:字节、单词、双单词、双单词、指针等。在编写汇编时,知道这一点很重要。嗯,你的循环对我来说没有意义。“for”是什么(j=i*3至10)当i>3时该怎么办?@Sparafusile好吧,我猜它应该是int,但我不知道在汇编级别应用了这样的类型。主要的一点是,它并没有真正回答最初的问题。而且代码是错误的和低效的。你可以按字节推进,但按字存储。另外,r5可以在外循环之前设置一次。mov+mult可以被更高效的加法r1,r2,r2,lsl#1所取代,但这仍然不是使用ARM ISA解决此类问题的方法。我同意代码效率很低,因为我编写它只是为了说明。但我不认为这是错误的。我假设
split
是一个整数数组,因为OP没有提到它。这就是这就是为什么我要存储一个单词。除此之外,我不明白你说的“按字节推进,但按单词存储”是什么意思。我甚至提到了OPs方法中的错误。你的代码没有考虑int的存储大小。你只是往上数(r1=r1+r2)无需调整拆分和整数数组。因此,内部循环的第一个存储将写入内存位置3,4,5,6(i=1 j=i*3),下一个将写入4,5,6,7(j=i*3+i)依此类推。你要写的是12,13,14,15和16,17,18,19。我希望这能解释它。根据实际的ARM架构版本,未对齐地址的单词存储也会导致数据中止。@Masta79谢谢你的输入。我看不到整数调整。我现在已经更正了。如果你想添加更多或更多内容,请随意编辑纠正其他事情