【问题标题】:How many Instruction cycles will this instructions take?这条指令需要多少指令周期?
【发布时间】:2021-06-24 10:19:06
【问题描述】:

如果我没记错的话ldrb r3, [r1], #1 将需要 3 个指令周期,同样add r4, r1, #2 将需要 1 个指令周期这里不讨论互锁延迟,但我很困惑有多少个周期cmp r4, r3 会接受吗?

请注意:这是带有 ARM9TDMI 流水线时序的 ARM ASSEMBLY。

【问题讨论】:

  • 我个人认为这需要 2 个周期,1 个用于从 r3 获取数据,一个用于解码和比较 r4 和 r3,但这完全是一种盲目的看法,idk 很多,如果我是,请更正错了。
  • 您检查了哪些参考文献,这些参考文献以何种方式不完整/不清楚/模棱两可?
  • cmp r4,r3 是数据处理指令。就像sub r4,r3,但只影响标志。数据处理指令(非 PC/非移位)为 1 个周期 (1S/1I)。您必须查看指令序列以了解互锁和内存等待状态注意事项。即,如果没有内存互锁,add r4,r1,#2cmp r4,r3 的结论应该相同。 bxx 将花费额外的周期来处理cmp 设置的条件代码。流水线是流水线的,因此 (1S/1I) 与流水线中的其他指令一起发生;通常你只计算非我。
  • 谢谢@artlessnoise,但我已经阅读了你提到的参考手册,在第 7 章定义了指令周期,我没有阅读任何关于 CMP的指南> 指令,请您根据您的知识告诉总循环计数为以下代码:invert: ldrb r3, [r1], #1 eor r3, r3, r2 strb r3, [r0], #1 add r4, r4, #1 cmp r4, r3 bxge lr b invert
  • @artlessnoise - 我在上面评论中提到的代码,据我说,ldrb 指令三个周期,(由于加载指令,2 个周期互锁)一个周期 eor指令,strb指令1周期,add指令1周期,cmp指令2周期,1周期bxge 指令(停留在循环中的平均情况),b 指令三个周期。

标签: assembly arm cpu-architecture arm9


【解决方案1】:

你的问题类似,使用similar code as your classmate

循环核心是,

        ldrb    r3, [r1], #1    ; 3 cycles
        eor     r3, r3, r2      ; 1 cycle
        strb    r3, [r0], #1    ; 1 cycle
        cmp     ip, r0          ; 1 cycle
        bne     .L3             ; 3 cycles
  • ldrbeor r3,r3,r2 是类似于图 7.2 的联锁,需要两个联锁循环。
  • strcmp 是单周期。
  • bne 是三个周期。

有关流水线阶段的信息,请参见第 2.2 节。它大约需要九个周期。部分来自ARM9TDMI TRM


  ldmia  [r1], {r4,r5,r6,r7,r8,r9,r10,r11}  # 3 cycle
  eor    r4,r4,r2   # 1 cycle
  eor    r5,r5,r2   # 1 cycle
  eor    r6,r6,r2   # 1 cycle
  eor    r7,r7,r2   # 1 cycle
  eor    r8,r8,r2   # 1 cycle
  eor    r9,r9,r2   # 1 cycle
  eor    r10,r10,r2   # 1 cycle
  eor    r11,r11,r2   # 1 cycle
  stmia  [r0], {r4,r5,r6,r7,r8,r9,r10,r11}  # 1 cycle

对于 32 个字节的传输,这是 12 个周期,因此它的速度大约是 24 倍。如图 7-4 所示,首先使用 R4 是有益的。


这个备用循环需要更长的时间,需要 13 个周期。

invert:  
  ldrb r5, [r1], #1  ; 3 cycles
  eor r5, r5, r2     ; 1 cycle
  strb r5, [r0], #1  ; 1 cycle
  add r4, r4, #1     ; 1 cycle
  cmp r4, r3         ; 1 cycle
  bxge lr            ; 3 cycles
  b invert           ; 3 cycles

这个修改给了9个周期,和gcc一样,

invert:  
  ldrb r5, [r1], #1  ; 2 cycles
  add r4, r4, #1     ; 1 cycle
  eor r5, r5, r2     ; 1 cycle
  strb r5, [r0], #1  ; 1 cycle
  cmp r4, r3         ; 1 cycle
  blt invert         ; 3 cycles
  bx  lr             ; 0 cycles, not in loop

不过,这又是一条指令。

【讨论】:

  • 不,但我有不同的逻辑方法,我在增加 r4 后比较 r3 和 r4 会影响任何指令周期吗?
  • 您不能使用r3,因为ldrb 正在覆盖它。在另一个问题中,将 r3 添加到 r1 并放置在 ip 中。由于r1 是自动递增的,因此对最终指针进行测试就足够了。您要么需要将 r5 用于 ldrb r5, [r1],要么将 r3 移动到其他位置以用于比较。此外,采用循环分支然后将默认设置为bx 会更快。 bxge 在主循环中很少有用。更适合参数检查。
猜你喜欢
  • 2010-10-16
  • 2014-07-26
  • 2010-12-05
  • 1970-01-01
  • 2012-10-27
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多