Sintaxis de ASM at & t

Así que tengo un problema con este código. Este es un progtwig para convertir de números binarios a números deximal.

#include  #include  #include  char s[100]; int length; int a; int main(int argc, char *argv[]) { system("cls"); printf("\n\n Vvedite stroky iz 0 i 1 (do 8 delementov) > "); gets(s); asm("leal s,%esi"); asm("movl 8,%ecx"); asm("movl 0,%edx"); asm("repeat:"); asm("movl 1,%eax"); asm("dec %ecx"); asm("rol %cl,%eax"); asm("cmpb 31,%esi"); asm("jnz x"); asm("add %eax,%edx"); asm("x: inc %esi"); asm("cmpb 0,$esi"); asm("jnz repeat"); asm("movl %edx,a"); printf("4islo %d",a); return EXIT_SUCCESS; } 

Me da: “Fallo de segmentación (núcleo volcado)”

Por favor ayuda con esta parte de ASM. Creo que el problema en el operador de CMPB.

Hay algunos problemas con ese código: en mi sistema, ni siquiera se ejecutó a través del comstackdor / ensamblador. El problema principal es que debe prefijar todos los literales con $ , de lo contrario el ensamblador asume un acceso de memoria:

 asm("movl 8,%ecx"); // tries to access memory at address 8 => Segmentation fault 

Esto necesita ser

 asm("movl $8,%ecx"); // Moves literal 8 into ecx 

Ajuste todas las demás instrucciones en consecuencia.

Otro tema es la siguiente instrucción:

 asm("cmpb 0,$esi"); // $esi is not a literal nor a register name 

Esto necesita ser

 asm("cmpb $0,(%esi)"); // compare value at address stored in %esi with literal 0 (end of string) 

Le sugiero que compile el código con información de depuración, como

 $ g++ -g -o sample sample.c 

Entonces es bastante fácil depurar el progtwig:

 $ gdb sample (gdb) run Starting program: sample sh: cls: command not found Vvedite stroky iz 0 i 1 (do 8 delementov) > 10101010 Program received signal SIGSEGV, Segmentation fault. main (argc=1, argv=0x7fffffffe238) at sample.c:18 18 asm("movl 8,%ecx"); // current bit position 

Como puede ver, el depurador le muestra las instrucciones que causaron la falla de segmentación.

Actualizar

El código de ensamblaje que funcionó para mí, usando una sola statement asm como lo sugiere @Brett:

 asm("leal s, %esi \n\t" // s => %esi "movl $8, %ecx \n\t" // current bit position (+1) "movl $0, %edx \n" // initialize result "repeat: \n\t" "movl $1, %eax \n\t" // Create bit mask in %eax "dec %ecx \n\t" // Decrement rotation counter to shift mask bit to proper position "rol %cl, %eax \n\t" // calculate value of current binary digit "cmpb $0x31, (%esi) \n\t" // current digit == 1? "jnz x \n\t" // no, skip "add %eax, %edx \n" // add current value to %edx "x: \n\t" "inc %esi \n\t" // next address in input string "cmpb $0, (%esi) \n\t" // end of string reached? "jnz repeat \n\t" // no, continue "movl %edx,a \n"); // store result in a variable 
 $ ./sample Vvedite stroky iz 0 i 1 (do 8 delementov) > 10101010 4islo 170