2010-08-20 5 views
0

Je suis en train de convertir un double en une chaîne sur la pile à partir du code d'assemblage x86_64:Comment puis-je appeler sprintf à partir de l'assemblage x86_64?

 bs.code += isa.movsd(registers.xmm0, MemRef(registers.rsp)) 
     bs.code += isa.pop(registers.rax) 

     bs.code += isa.push(registers.rbp) 
     bs.code += isa.mov(registers.rbp, registers.rsp) 

     bs.code += isa.sub(registers.rsp, 100) 
     bs.code += isa.and_(registers.rsp, -16) 

     bs.code += isa.mov(registers.rdi, registers.rsp) 
     bs.code += isa.mov(registers.rsi, <address of "%i\0">) 
     bs.code += isa.mov(registers.rax, <address of sprintf in libc>) 
     bs.code += isa.call(registers.rax) 

Les segfaults programme à call(rax) avec

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff6a2919b in *__GI___overflow (f=0x7fffffffb5d0, ch=9698128) at genops.c:248 
warning: Source file is more recent than executable. 
248 return _IO_OVERFLOW (f, ch); 

Je pense que sprintf doit être appelé spécialement parce qu'il utilise des arguments variables, donc quelqu'un peut-il conseiller sur la bonne façon de le faire à partir de l'assemblage?

Répondre

1

Serait-il utile si vous écrivez un simple appel à sprintf en C et utilisez gcc -s foo.c?

+0

J'ai essayé ceci mais j'ai dû faire -fno-stack-protector pour obtenir du code simple. –

Questions connexes