Io sono d'accordo con il signor Rilassatevi di answer, ma fino a un certo estendere questo modo può essere utile a voi:
nome del file x.c
:
int main(){
register int i=0;
i++;
printf("%d",i);
}
Assemblare codice:
~$ gcc x.c -S
il nome del file di output è x.s
.
Nel mio caso viene utilizzato il registro ebx
, che può essere la differenza in diversi tempi di compilazione.
~$ cat x.s
.file "x.c"
.section .rodata
.LC0:
.string "%d"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
pushl %ebx
subl $28, %esp
movl $0, %ebx
addl $1, %ebx // because i++
movl $.LC0, %eax
movl %ebx, 4(%esp)
movl %eax, (%esp)
call printf
addl $28, %esp
popl %ebx
movl %ebp, %esp
popl %ebp
ret
È possibile anche smontare l'eseguibile utilizzando objdunp
:
$ gcc x.c -o x
$ objdump x -d
uscita assemblaggio parziale utilizzando objdump
comando:
080483c4 <main>:
80483c4: 55 push %ebp
80483c5: 89 e5 mov %esp,%ebp
80483c7: 83 e4 f0 and $0xfffffff0,%esp
80483ca: 53 push %ebx
80483cb: 83 ec 1c sub $0x1c,%esp
80483ce: bb 00 00 00 00 mov $0x0,%ebx
80483d3: 83 c3 01 add $0x1,%ebx //due to i++
80483d6: b8 b0 84 04 08 mov $0x80484b0,%eax
80483db: 89 5c 24 04 mov %ebx,0x4(%esp)
80483df: 89 04 24 mov %eax,(%esp)
80483e2: e8 0d ff ff ff call 80482f4 <[email protected]>
80483e7: 83 c4 1c add $0x1c,%esp
80483ea: 5b pop %ebx
80483eb: 89 ec mov %ebp,%esp
80483ed: 5d pop %ebp
80483ee: c3 ret
80483ef: 90 nop
%ebx
registro riservato per le variabili registro.
Il l'unico modo per sapere con certezza è di esaminare l'output in linguaggio assembly dal tuo compilatore. –
le ipotesi sono sbagliate e l'ultima domanda non può essere risolta poiché non hai controllo diretto in questo. – user1824407
@GregHewgill non proprio, anche ci sono variabili come la quantità di cache dipendente dall'hardware e non è possibile prevedere la quantità di cache della CPU. puoi leggere la tua assemblea: qual è il punto? – user1824407