【问题标题】:accessing nth element in array访问数组中的第 n 个元素
【发布时间】:2012-04-16 23:52:31
【问题描述】:

我正在翻译伪代码

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

进入 ARM 程序集。老实说,我不知道该怎么做,展示我的尝试会浪费时间。

【问题讨论】:

  • 这取决于split的类型。它是一个字节数组吗?整数?多头?字符?由于您使用的是ldr,因此我认为这是一个词。可以肯定的是,我会使用调试器检查内存。此外,您不需要加载到 R2 中然后立即将其设置为 0:只需将其设置为 0 并存储即可。
  • 在数据部分中,拆分被声明为“.skip”,后跟一个计算结果为 400 的表达式。如果这不是你要问的,我不清楚?
  • 他在问你在数组中存储了什么。在您的示例中,它可能是:字节、字、双字、双精度、指针等。在编写汇编时知道这一点很重要。
  • 嗯,你的循环对我来说也没有意义。当 i>3 时,“for(j=i*3 to 10)”应该做什么?
  • @Sparafusile 好吧,我猜它是 int 但我不知道在程序集级别应用这种类型

标签: memory assembly arm


【解决方案1】:

我在您的代码中发现的一个错误是您将零存储在寄存器中,而不是存储到它指向的地址。

ldr R2, [R1, R0]
mov R2, #0 ; This is wrong. You are zeroing a register and not the address to 
           ; which it points to 

这里是您使用 cmets 的程序集的等效程序集

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

【讨论】:

  • 重点是,它并没有真正回答原始问题。此外,代码错误且效率低下。您按字节前进,但按字存储。 r5 也可以在 outer_loop 之前设置一次。 mov+mult 可以替换为更有效的 add 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 感谢您的意见。我看不到整数调整。我现在已经更正了。如果您想添加更多内容或更正其他内容,请随时编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2020-09-06
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多