[ASM] différence 64 et 32 bits

différence 64 et 32 bits [ASM] - ASM - Programmation

Marsh Posté le 13-01-2010 à 10:46:30    

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?

Reply

Marsh Posté le 13-01-2010 à 10:46:30   

Reply

Marsh Posté le 13-01-2010 à 12:52:00    

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

Reply

Marsh Posté le 13-01-2010 à 16:04:33    

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?

Reply

Marsh Posté le 13-01-2010 à 16:16:25    

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
Reply

Marsh Posté le 13-01-2010 à 16:19:34    

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
Reply

Marsh Posté le 15-01-2010 à 16:23:47    

up

Reply

Marsh Posté le 19-01-2010 à 10:04:45    

bump for great justice

Reply

Marsh Posté le 19-01-2010 à 10:33:37    

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)
Reply

Marsh Posté le 09-02-2010 à 14:50:29    

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:  

Reply

Marsh Posté le 11-04-2010 à 00:27:00    

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.
Reply

Sujets relatifs:

Leave a Replay

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