Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C, x86] Salvataggio registri

    Salve a tutti, mi è venuto un dubbio riguardo il salvataggio dei registri quando chiamo una funzione x86 da un programma C:
    Sintassi AT&T (GAS)
    codice:
    .section .text
    .globl foo
    
    foo:
          pushl %ebp
          movl %esp, %ebp
    # e fino a qui ci siamo, ma ora sorge il dubbio:
         pushl %ebx
         pushl %edi
         pushl %esi
    
    #.....
    
    end:
         popl %esi
         pool %edi
         popl %ebx
    
        movl %ebp, %esp
        popl %ebp
        ret

    Le push di %ebx %edi ed %esi vanno fatte per salvare qualcosa?Per evitare Problemi con ai registri?E gli altri registri? Non vanno fatte?
    Nel caso in cui la funzione chiamante fosse stata un'altra funzione assembly avrei fatto le push e le pop nella chiamante.

    Spero in un vostro aiuto :3
    Ciaoooo
    Ultima modifica di muletto99; 09-09-2016 a 10:15

  2. #2
    Le ABI normalmente specificano quali registri sono preservati dalle chiamate a funzione e quali possono essere sovrascritti; su Linux/x86 normalmente eax, edx e ecx sono considerati degli "scratch register" (ovvero, il compilatore assume che dopo una chiamata a funzione siano stati sovrascritti), mentre gli altri devono essere preservati. Per questo motivo tipicamente vedrai delle push eax/edx/ecx (e le relative pop) nel chiamante, ed eventualmente delle push di altri registri nel chiamato (o nessuna se riesce a cavarsela già solo con gli scratch register).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Grazie mille!

  4. #4
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.