装配对数基数2

时间:2016-06-24 03:39:40

标签: arrays assembly logarithm princeton-ias

我在IAS程序集中实现了解决此问题的代码:

我有一个整数数组A=[a1,a2,...,an],我必须计算B=[|log2 a1|,|log2 a2|,...,|log2 an|],其中||是向下舍入到最接近的整数的floor函数。

我尝试执行以下步骤:

  1. 首先创建|log2 x|并验证它是否适用于正整数
  2. 运行1)在数组A的每个数字中计算数组B
  3. 我写了这个,但它没有用:

    loop:   S(x)->Ac+ n ;load n in AC
            Cc->S(x) log ;if AC >= 0 jump to log
            halt            ; else end the program
            .empty
    
    log:   S(x)->R resm  ;copy number 2 to AR
           S(x)*R->A two ;multiply 2*2 
           At->S(x) resm ;save in resm
           S(x)->Ah+ one ;+1 counter
           At->S(x) cont ;save the counter
           S(x)->Ac+ n ;load n in AC
           S(x)->Ah-  one;decrease n in 1
           At->S(x)   n ;save n 
           Cu->S(x)   loop; jump to beggining to make all again
    
      n:    .data 4 ;number to calculate log
      two:  .data 2 ;base of the logarithm
      one:  .data 1 ;for increase the counter
      resm: .data 2 ;for save the result of the multiplication
      cont: .data 0 ;save the result of the logarithm
    

    IAS是一种教学教学语言,在a simulator中实施。该页面还记录了指令集。

1 个答案:

答案 0 :(得分:0)

由于指令集没有do this without looping的lzcnt / bsr类型的指令,通常的方法是计算移出所有位所需的右移位数。

floor(log2(x))与查找最重要位的位置相同:

e.g。 floor(log2(17)) = floor(log2(16)) = 4floor(log2(15)) = 3 17和16都有5个二进制数字,但15只是0b1111(4个二进制数字)。

由于log2(0)是-Infinity,如果输入为零,则函数定义不明确。不幸的是,在这种情况下,即使x86's bsr instruction也未定义结果。

我认为你试图通过将1向左移动直到它大于或等于x来进行循环,基于乘以two。那可行。 (左移是乘以2)。

你的评论说的是2 * 2,这很奇怪。

我不知道IAS,你没有说明你的代码如何不起作用。所以问题的一部分仍然取决于你,直到你更新问题,询问任何具体的指令没有做你期望的事情或什么。