0

好的,所以我正在尝试创建一个有趣的程序来计算数字中的位数

我想要什么:
正如我所说,一个计算给定数字中的位的程序。(例如 countsbits(1)=countbits(2)=countbits(4)=1)。

我得到了什么:
我得到了正确的输出,但现在我收到一条错误消息

“分段错误:11”。我运行了别人的程序,他们没有收到这个错误,所以很明显这是我的错误。我该如何修改它,以免出现分段错误?

我输入的命令是:

gcc -m32 -mstackrealign countbit.c countbits.s

该程序编译得很好,但是当我尝试运行程序生成的 a.out 时,我得到了错误。有任何想法吗?

我的代码: .text .data .globl _x

    .globl _countbits
_countbits:

    pushl %ebp
    movl %esp,%ebp
    pushl %ebx
    mov $0,%edx
    mov $0,%eax
    mov 8(%ebp),%ebx

LOOP:
    mov $1,%ecx
    and %ebx,%ecx
    add %ecx,%eax
    shrl $1,%ebx
    add $1,%edx
    cmp $32,%edx
    jle LOOP
    pop %ebx
    pop %ebp
    ret

以及从 C 调用它的代码:

#include <stdio.h>
int foo (int x){
  int p=countbits(x);
  printf("The count is: %d",p);
}

main(){
  int x=16;
  foo(16);
}
4

1 回答 1

0

如果不提及您正在谈论的处理器汇编代码类型,您就无法真正提出有关汇编代码的问题。例如,许多处理器都有专门的指令来计算所设置的位数。例如,参见POPCNT

于 2011-10-21T23:40:35.050 回答