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 に答える