Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Sparc机器基本装配,计数位_Assembly_Counting_Sparc - Fatal编程技术网

Assembly Sparc机器基本装配,计数位

Assembly Sparc机器基本装配,计数位,assembly,counting,sparc,Assembly,Counting,Sparc,所以我需要在一个整数上计算位这是我的代码,但我不知道为什么不工作,我从c main发送了一个十六进制值,不知怎的,我必须移动它并屏蔽它。我有点迷路了,我想我得到了一个错误的答案,因为我不知道如何变换和掩盖,但我想我知道我在做什么循环和加法。同样,我需要数到32位,1不是零,但我得到了一个错误的答案,例如6110,它将是2位。这是一个家庭作业,所以我不能使用内置函数或任何东西哈哈 .global hi hi: save %sp,-1024,%sp clr %i0 clr %i1 clr

所以我需要在一个整数上计算位这是我的代码,但我不知道为什么不工作,我从c main发送了一个十六进制值,不知怎的,我必须移动它并屏蔽它。我有点迷路了,我想我得到了一个错误的答案,因为我不知道如何变换和掩盖,但我想我知道我在做什么循环和加法。同样,我需要数到32位,1不是零,但我得到了一个错误的答案,例如6110,它将是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因为我真的不知道,我正在看手册,没有看到任何可以帮助我的东西:/。

换档和添加也有错误

您的循环结构大致如下所示:

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;
}

这里说“ba”=分支总是(我的错误)-- 如果(temp==1)的比较是通过“be”或分支(如果相等)完成的,则相反
如果不相等,则为分支,或bne。因此,有条件的statament应为:

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

除非我误解了您的意图,否则SPARC V9有一个
POPC
指令正是为了这个目的。我想做的是计算6 110上的位,它将是2位。这是一个家庭作业,所以我不能使用内置函数或任何东西哈哈。我相信您知道如何添加和移位,但是您的控制结构有缺陷:您在找到第一位后立即退出函数。我如何在找到第一位后立即退出函数?你怎么知道的,因为这意味着我不明白这到底是怎么回事…全局hi hi hi:保存%sp,-1024,%sp clr%i0 clr%i1 clr%i2循环:cmp%i2,32 be,一个客场mov%l7,%i0 add 1,%i2,%i2和%i0,1,%l1 cmp%l1,1不算!srl%i0、%l2、%10!mov%l2,%i0!和%i0,1,%i0 srl%i0,1,%i0 ba循环nop!mov%l2,%i0计数:添加1,%l7,%l7远离:ret还原为什么还不起作用?我试着遵循c代码,但是,这不应该返回上的位数吗?例如,6应该返回2?在递增计数器后,仍然没有跳回循环。进一步:关于返回值应该放在哪个寄存器中,您的ABI参考手册有什么规定?你确定应该是%l7吗?[我不知道]它的%i0是返回值,那么这是做什么的?当它说ba循环不是应该回到循环吗?所以我不知道是否有很多问题要问,但是,你知道如何解决这个问题吗P