【问题标题】:How does this algorithm know when to stop?该算法如何知道何时停止?
【发布时间】:2014-08-25 21:47:15
【问题描述】:

任何人都可以理解这段代码吗?不知道这个算法如何知道何时停止。

例如,当数字是 144 时——它如何知道停止除以二?为什么它停在12而不是6?

 .ent isqrt
  isqrt:
  //v0 - return / root
  //t0 - bit
  //t1 - num
  //t2,t3 - temps

  //Store parameter
  sw a0, 0(fp)

  //Make stack frame for output_string
  addiu sp, sp, -32
  sw ra, 28(sp)
  sw fp, 24(sp)
  move fp, sp

  move  v0, zero        //initalize return
  move  t1, a0          //move a0 to t1

  addi  t0, zero, 1

  sll   t0, t0, 30

isqrt_bit:
  slt   t2, t1, t0     //num < bit
  beq   t2, zero, isqrt_loop
  nop

  srl   t0, t0, 1       //Divide by 4

  j     isqrt_bit
  nop

isqrt_loop:
  beq   t0, zero, isqrt_return
  nop

  add   t3, v0, t0     //t3 = return + bit

  slt   t2, t1, t3
  beq   t2, zero, isqrt_else
  nop

  srl   v0, v0, 1       //Divide by two

  j     isqrt_loop_end
  nop

isqrt_else:
  sub   t1, t1, t3     //num -= return + bit
  srl   v0, v0, 1       //Divide by two
  add   v0, v0, t0     //return + bit

 isqrt_loop_end:
      srl   t0, t0, 2       //Divide by 4
      j     isqrt_loop
      nop

  isqrt_return:

    move sp, fp
    lw ra, 28(fp)
    lw fp, 24(fp)
    addiu sp, sp, 32

  jr  ra
  nop

.end isqrt

【问题讨论】:

  • 该代码似乎生成了不正确的结果,所以我不会太担心理解它。它得到了一些正确的答案,但是例如对于 144 的输入,我得到了 16 的结果。

标签: assembly mips


【解决方案1】:

beq 指令退出循环

在这个答案中它是从 C 编译的:finding square root of an integer on mips assembly

【讨论】:

  • 是的,但为什么代码将 t0 除以 4?我只是不明白这个算法是如何工作的。
  • 学习C代码更容易——这个asm中有不正确的cmets。 srl .., 1 右移 1(C 中为 >> 1),但此处注释为除以 4
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 2011-12-03
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多