Ошибка шины 10 с кодом сборки + общие вопросы - PullRequest
0 голосов
/ 22 октября 2011

Хорошо, поэтому я пытаюсь создать программу для развлечения, которая подсчитывает биты в числе

Что я хочу:
Как я уже сказал, программа, которая считаетбиты в данном числе.(например counttsbits (1) = countbits (2) = countbits (4) = 1).

Что я получаю:
Я получаю правильный вывод, но теперь я получаюсообщение об ошибке

«Ошибка сегментации: 11».Я запустил чужую программу, и они не получили эту ошибку, так что, очевидно, это мой проступок.Как я могу изменить это, чтобы я не получил ошибку сегментации?

Вводимая мной команда:

gcc -m32 -mstackrealign countbit.c countbits.s

Программа компилируется просто отлично, но когда я пытаюсь запустить a.сгенерированный программой я получаю ошибку.Есть идеи?

Мой код: .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);
}

1 Ответ

0 голосов
/ 22 октября 2011

Вы не можете задать вопрос о коде ассемблера, не упоминая, о каком коде ассемблера процессора вы говорите. Например, у многих процессоров есть специальная инструкция для подсчета количества установленных битов. Например, см. POPCNT

...