2010-04-22 2 views
5

J'écris un compilateur et j'ai parcouru toutes les étapes (tokenizing, parsing, syntaxe tree structures, etc.) qu'ils vous montrent dans tous les livres du compilateur. (S'il vous plaît ne pas commenter avec le lien vers la "Ressources pour écrire un compilateur" question!).Choisir le bon et apprendre l'assembleur pour l'écriture du compilateur

J'ai choisi d'utiliser NASM avec alink comme mon backend.

Maintenant, mon problème est: Je ne trouve tout simplement pas de bonnes ressources pour apprendre les MSNA et l'assemblage en général. Le wikibook (allemand) sur l'assemblage x86 est horrible. Ils n'expliquent même pas le code qu'ils y écrivent, je ne peux même pas obtenir des choses simples comme l'ajout de 1 à 2 et la sortie du résultat. Où puis-je apprendre l'assemblage NASM x86?

+2

Il n'y a aucune raison qu'un compilateur doit sortir l'assembleur. Faites-lui sortir un langage qui vous est familier, tel que C, puis utilisez le compilateur C (ou autre) pour produire l'exécutable final. –

+0

votre question est plus comme "Où puis-je apprendre l'assemblage NASM x86?" comme vous l'avez dit. S'il vous plaît choisir un meilleur sujet, car il n'a rien à voir avec les compilateurs du tout. Avez-vous pensé à llvm? – topskip

+1

Pour les points bonus, entrez votre code dans la même langue que celle qui est en train d'être compilée. Puis compiler cela. –

Répondre

1

Eh bien, si vous acceptez un livre comme référence. Mon auteur préféré des jours où j'ai appris Pascal dans les années 80 était Jeff Duntemann. Son dernier livre d'assemblage couvre NASM. http://www.duntemann.com/assembly.htm

Je ne sais pas quel OS vous ciblez, mais le fait que le livre ci-dessus est Ciblage Linux devrait être pas être un problème, les constructions d'assemblage sont ce qui vous intéresse.

Pour être honnête, la assemblage réel pour la génération de code n'est pas la partie la plus difficile, à mon humble avis, je pense que la gestion du registre est où le véritable apprentissage est.

Bonne chance!

1

Sauf si vous avez vérifié dehors, manuel MSNA est tout à fait bonne ressource pour l'apprentissage de MSNA: http://www.nasm.us/doc/

Comparaison des MSNA et GAS aide aussi un peu: http://www.ibm.com/developerworks/linux/library/l-gas-nasm.html

canal irC#asm à Freenode se (r) ver fournit ces liens:

J'ai aussi consacré un peu de temps pour écraser un petit monde de bonjour pour vous:

bits 32 
section .data 
    greeting db "hello world", 10 
section .text 
global _start 
_start: 
    mov eax, 4 ; sys_write 
    mov ebx, 1 ; stdout 
    mov ecx, greeting 
    mov edx, 12 ; greeting.length 
    int 0x80 ; system call interrupt 

    mov eax, 1 ; sys_exit 
    mov ebx, 0 
    int 0x80 

Assemblez cela avec:

nasm -f elf -o example.o example.asm 
ld -o example example.o -melf_i386 

Je me suis écrit un petit générateur de code en python. Bien que j'ai laissé cette chose au milieu tout à l'heure. Récemment, j'ai écrit un outil un peu différent qui pourrait devenir utile pour quiconque s'attaquer à l'assemblage. En ce moment je demande aussi de l'aide ..Sauf semble que je doive faire un peu d'auto-assistance là-bas: x86 instruction encoding tables

L'ancien morceau de générateur de code que j'ai est dans http://bitbucket.org/cheery/g386/ jusqu'à ce que je vais mettre en place mon nouveau générateur de code basé sur la table.

Questions connexes