0

所以我需要计算一个整数上的位数,这是我的代码,但我不知道为什么不起作用,我从 c main 发送了一个十六进制值,我必须以某种方式对其进行移位并屏蔽它。我有点迷茫,我想我得到了一个错误的答案,因为我不知道如何转移和掩盖,但我想我有点知道我在用循环和添加做什么。我再次需要数到 32 位不是 0 的 1 位,但我得到了错误的答案,例如 6 110 它将是 2 位。这是一个家庭作业,所以我不能使用内置功能或其他任何东西哈哈。

   .global hi
hi:

save %sp,-1024,%sp

clr %i0
clr %i1
clr %i2

loop:  

       cmp %i2,32
       be,a away
    mov %l7,%i0
    add 1,%i2,%i2

    and %i0,1,%l1


    cmp %l1,1
    be count
       nop
    !srl %i0,%l2,%10
    !mov %l2,%i0


    !and %i0,1,%i0
    srl %i0,1,%i0

    ba loop
    nop
    !mov %l2,%i0

count:
    add 1,%l7,%l7

away:
    ret
    restore

为什么这还不起作用?我遵循了它的c实现,但仍然没有返回位数:/。返回值为 %i0 ,我不知道如何在递增计数器后跳回循环。

那么这是在做什么呢?当它说ba循环时,它不应该回到循环吗?

所以我不知道是否有太多要问的问题,但是你知道如何解决这个问题吗?:p 因为我真的不知道,我正在查看手册,但没有看到任何可以帮助我的东西:/。

4

1 回答 1

0

移位和添加也有故障...

您的循环结构大致如下:

int count(int data) {
loop_entry:
        if (loop_counter == 32) goto out;      // this is basically ok
        loop_counter++;            

        if (some_math_expression) goto count;  // the math expression is ok

        temporary_variable>>=1;   // this is not ok -- you should be shifting l2 

        if (something_else) goto loop_entry;   // what actually is the 'something_else'?

count:
        data++;    // this is not ok: you are incrementing i0 instead of l2
                   // this is not ok: fall through instead of jumping back to loop

out:
        return result;

}

最接近您在 C 中实现的正确结构是

int count (int data)
{
     int result=0;
     int temp=0;
     int loop_counter = 0;
     while (loop_counter++ != 32) {  // conditionally jump out of the loop
         temp = data & 1;
         if (temp == 1) {   // Q: how to perform this in assembler? 
            result++;       // A: negate the condition and jump over the result++
         }                  // statement
         data>>=1;
     }                      // (unconditionally? Jump to beginning of loop)
     return result;
}

http://www.cs.northwestern.edu/~agupta/_projects/sparc_simulator/SPARC%20INSTRUCTION%20SET-1.htm

这里它说 'ba' = branch always (我的错误)——如果 (temp == 1) 的比较是由 'be' 或 branch 如果相等,那么与之相反
的是 branch if not equal 或 bne . 因此,条件陈述将是:

cmp %temp, %one          # I'm using temp & one to "alias" the registers
bne skip                 # that contain these variables or constants
nop    ; // delay slot
add %count, 1, %count
skip:

// there's however a trick to do that without jumping (see the link about 'carry'-bit)
add %data,%data,%data    # "multiply" data by two, which may produce carry
addx %count,%zero,%count # count = count + 0 + carry_produced_by_previous_instruction

使用进位位和溢出位的原因

于 2012-10-08T05:38:46.843 回答