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谢谢你的输入。我看不到整数调整。我现在已经更正了。如果你想添加更多或更多内容,请随意编辑纠正其他事情