YASM et GCC sous Linux Debian AMD64 - pour info

YASM et GCC sous Linux Debian AMD64 - pour info - C - Programmation

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;
}
 

Reply

Marsh Posté le 02-12-2005 à 00:09:22   

Reply

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
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed