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