Faute de Segmentation en Langage d'Assemblage

Je suis à l'apprentissage de AT&T x86 langage d'assemblage. Je suis en train d'écrire un programme d'assemblée, qui prend un entier n, puis retourner le résultat (n/2+n/3+n/4). Voici ce que j'ai fait:

.text
.global _start
_start:
    pushl $24
    call profit
    movl %eax, %ebx
    movl $1, %eax
    int $0x80

profit:
    popl %ebx
    popl %eax
    mov $0, %esi
    movl $4, %ebp
    div %ebp
    addl %eax, %esi
    movl %ecx, %eax
    movl $3, %ebp
    div %ebp
    addl %eax, %esi
    movl %ecx, %eax
    movl $2, %ebp
    div %ebp
    addl %eax, %esi
    movl %esi, %eax
    cmpl %ecx, %esi
    jg end
    pushl %ebx
    ret

end:
    mov %ecx, %eax
    ret

Le problème est que je suis faute de segmentation. Où est le problème?

  • Ne vous essayez pas à pas dans le code avec un débogueur pour voir ce qui se passe ?
  • AT&T ramifiée dans les processeurs? (-:
  • tripleee: "AT&T syntaxe" se réfère à l'assembleur de syntaxe ci-dessus, utilisée à l'origine dans SysV Unix. Il met l'opérande de taille sur l'instruction comme un suffixe, utilise un "%" à la balise enregistrer des noms, et met le registre de destination à la fin de la liste. C'est la syntaxe prise en charge par l'assembleur GNU linux. Il est tout à fait différent de "Intel" syntaxe plus couramment utilisés dans l'industrie du PC.
  • Si vous allez en apprendre de langage assembleur Intel, utilisez Intel syntaxe. Dans un décent monde, cette abomination que vous appelez AT&T syntaxe n'aurait jamais existé.
InformationsquelleAutor user1700688 | 2012-09-26