Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1171 connectés 

  FORUM HardWare.fr
  Programmation
  ASM

  [ASM] différence 64 et 32 bits

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ASM] différence 64 et 32 bits

n°1957427
fontam
Posté le 13-01-2010 à 10:46:30  profilanswer
 

Bonjour les gens,
 
En essayant de vieux TD d'asm, je tombe sur ce code:

Code :
  1. text
  2. message :
  3. .ascii "hello world ! \0"
  4. .align 4
  5. .global main
  6. main :
  7. pushl %ebp
  8. movl %esp,%ebp
  9. pushl $message
  10. call puts
  11. addl $4,%esp
  12. movl %ebp,%esp
  13. popl %ebp
  14. ret


jusqu' ici tout va bien, mais depuis mes années iut, nos braves machines ont 'achement évoluées et sont notamment passées en 64 bits
j'ai donc voulu adapter le code au 64 bits. après moulte recherche je pond ça:

Code :
  1. .text
  2. message :
  3. .ascii "hello world ! \0"
  4. .align 4
  5. .global main
  6. main :
  7. pushq %rbp
  8. movq %rsp,%rbp
  9. pushq $message
  10. call puts
  11. addq $4,%rsp
  12. movq %rbp,%rsp
  13. popq %rbp
  14. ret


et là paf pastèque ça plante, seg fault, alim qui crame, chinois du fbi qui débarque.
Je me démonte pas, je paye un café au chinois, change d'alim, décompile un prog c, et arrive à ça:

Code :
  1. .text
  2. message :
  3. .string " hello world ! \0 "
  4. .align 8
  5. .global main
  6. main :
  7. pushq %rbp
  8. movq %rsp,%rbp
  9. movl $message, %edi
  10. call puts
  11. movq %rbp,%rsp
  12. popq %rbp
  13. ret


et là ça marche.
Vous allez me dire: "bin du coup pourquoi tu viens nous faire ch***".
Bin le problème c'est que je vois pas pourquoi le pushq $message ne marche plus. des idées?

mood
Publicité
Posté le 13-01-2010 à 10:46:30  profilanswer
 

n°1957495
Joel F
Real men use unique_ptr
Posté le 13-01-2010 à 12:52:00  profilanswer
 

l'alignement qui dois passer de 4 à 8 :o ?

n°1957579
fontam
Posté le 13-01-2010 à 16:04:33  profilanswer
 

nop, tried, my bad. et je ne suis pas sur que l'alignement change grand chose dans ce cas précis. une autre idée?

n°1957586
olivthill
Posté le 13-01-2010 à 16:16:25  profilanswer
 

Edit : Je me suis complétement trompé. Je retire ce que j'ai dit, et je renvoie juste vers une page qui explique un peu la programmation assembleur pour 64 bit : http://www.x86-64.org/documentation/assembly.html
Edit Edit : (Je suis tombé sur la même page que fontam dans Google).


Message édité par olivthill le 13-01-2010 à 16:20:42
n°1957587
fontam
Posté le 13-01-2010 à 16:19:34  profilanswer
 

nop, les instructions de pile ne supporte apparemment que le suffixe q en 64 bits: http://www.x86-64.org/documentation/assembly.html

Citation :


Exceptions from this rule are instructions manipulating the stack (push, pop, call, ret, enter and leave) which are implicitly 64-bit and their 32-bit counterparts are not available anymore, yet their 16-bit counterparts are. So:

Code :
  1. pushl %eax  # Illegal instruction
  2.   pushq %rax  # 1 byte instruction encoded as pushl %eax in 32 bits
  3.   pushq %r10  # 2 byte instruction encoded as pushl preceeded by REX.


 


Message édité par fontam le 13-01-2010 à 16:20:41
n°1958252
fontam
Posté le 15-01-2010 à 16:23:47  profilanswer
 

up

n°1958675
fontam
Posté le 19-01-2010 à 10:04:45  profilanswer
 

bump for great justice

n°1958682
Un Program​meur
Posté le 19-01-2010 à 10:33:37  profilanswer
 

Visiblement, l'ABI 32 bits prend les parametres sur la pile, l'ABI 64 bits prend ses premiers parametres dans des registres.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1964182
__tomjost
c'est un pseudo !
Posté le 09-02-2010 à 14:50:29  profilanswer
 

addq $8,%rsp  pas  addq $4,%rsp  , ..  
 
pour les passage de params en register ca se fait au 32 comme 64
suivant un call-type , ou par optimization libre.
 
 :hello:  

n°1982871
_iOn_
Substrat pensant
Posté le 11-04-2010 à 00:27:00  profilanswer
 

Oui c'est sûrement le addq $4,%rsp qui corrompt la pile, mais même si le dernier morceau de code marche il n'est pas correct. En x64 l'alignement de la pile est de 16 octets, pas 8, et certaines librairies mettent le feu à ta maison et tuent tous les gens qui tu aimes si tu leur passes une pile non alignée.


---------------
Any sufficiently complex bug is indistinguishable from magic.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

  [ASM] différence 64 et 32 bits

 

Sujets relatifs
Différence entre deux requêtesDifférence comportement entre firefox et ie
Différence entre deux Requêtesada différence fonction, procédure
Difference entre 2 commandesDifference Online / Offline (player music)
[C++] Extraction des bits d'un nombreASM(masm32) ou C++ ?
difference entre int et long[C/C++] Difference entre pointeur et double pointeur ?
Plus de sujets relatifs à : [ASM] différence 64 et 32 bits


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR