YASM et GCC sous Linux Debian AMD64 - pour info - C - Programmation
Marsh Posté le 02-12-2005 à 09:59:15
nicolas_9 a écrit : (Je crois qu'il faut être root pour faire make install) |
Impératif parce que cela va copier des fichiers dans des répertoires (comme "/usr" ) où seul "root" a accès
Marsh Posté le 02-12-2005 à 00:09:22
Bonjour à tous,
Je trouve régulièrement de très bonnes infos sur ce site. Aussi, je voudrais aussi contribuer à l'enrichir.
Depuis quelques temps, j'ai un PC AMD64 et j'ai installé Linux Debian AMD64.
Et voilà comment on peut écrire des routines en assembleur AMD64 et les linker avec du C :
Chargement de YASM :
http://www.tortall.net/projects/yasm/wiki/Download
Installation de YASM en exécutant les commandes suivantes après décompression :
./configure
make
make install
(Je crois qu'il faut être root pour faire make install)
// Aide sur yasm
man yasm
man yasm_arch
// Assemblage du fichier assembleur :
yasm -m amd64 -f elf addtwo.asm
// Compilation et link avec le fichier principal en C :
gcc hello.c addtwo.o -o hello
// Exécution :
./hello
Hello, bonjour
Bonne fête à tous les Eloi, en ce 1er décembre !
a = 4049535127765279684
b = addone(a) = 4049535127765279685
c = addtwo(a) = 4049535127765279686
// Merci aux contributeurs de ce topic
http://forum.hardware.fr/hardwaref [...] 3241-1.htm
// Infos sur les instructions AMD64 pour YASM :
http://www.tortall.net/projects/yasm/wiki/AMD64
Bon courage à tous.
Nicolas
Annexe : Les fichiers addtwo.asm et hello.c :
addtwo.asm :
BITS 64
GLOBAL addtwo
SECTION .text
addtwo
mov rax,rdi
inc rax
inc rax
ret
hello.c :
// Compilation :
// normal : gcc hello.c -o hello
// debug : gcc -ggdb3 hello.c -o hellodbg
// gdb hellodbg
// break main
// run
// next
// (entrée : répète dernière commande)
// help
// help running
// quit
//
// break addone
// run
// disassemble
// Dump of assembler code for function addone:
// 0x000000000040057e <addone+0>: push %rbp
// 0x000000000040057f <addone+1>: mov %rsp,%rbp
// 0x0000000000400582 <addone+4>: mov %rdi,0xfffffffffffffff8(%rbp)
// 0x0000000000400586 <addone+8>: mov 0xfffffffffffffff8(%rbp),%rax
// 0x000000000040058a <addone+12>: inc %rax
// 0x000000000040058d <addone+15>: leaveq
// 0x000000000040058e <addone+16>: retq
// Conclusion : Le paramètre est passé dans rdi
// La valeur de retour de la fonction est placée dans rax (registre 64 bits)
#include <stdio.h>
extern long addone(long a);
extern long addtwo(long a);
int main(int argc, char** argv)
{
long a = 2012345678;
a *= a; // Pour obtenir un nombre sur 62 bits
long b;
long c;
printf("Hello, bonjour\n" );
printf("Bonne fête à tous les Eloi, en ce 1er décembre !\n" );
printf("\n" );
printf("a = %ld\n",a);
b = addone(a);
printf("b = addone(a) = %ld\n",b);
// Mettre en commentaire les deux lignes suivantes et compiler par les commandes situées en tête
// de fichier pour optenir les traces ci-dessus avec gdb
c = addtwo(a);
printf("c = addtwo(a) = %ld\n",c);
}
long addone(long a)
{
return a + 1;
}