Attualmente sto imparando i linguaggi di assemblaggio e di programmazione C e ho un paio di domande a riguardo.Assieme al codice C
codice C
int arith(int x, int y, int z) {
int t1 = x + y;
int t2 = z*48;
int t3 = t1 & 0xFFFF;
int t4 = t2 * t3;
return t4;
}
codice Assembly
movl 16(%ebp),%eax z
leal (%eax,%eax,2), %eax z*3
sall $4,%eax t2 = z*48
movl 12(%ebp),%edx y
addl 8(%ebp),%edx t1 = x+y
andl $65535,%edx t3 = t1&0xFFFF
imull %edx,%eax Return t4 = t2*t3
Invece di usare Leal e poi spostando da 4 a moltiplicare z del 48, potrei semplicemente usare imull $ 48,% eax?
Inoltre, questo sta utilizzando il registro% edx più volte. Questo significa che t1 viene sovrascritto? In altre parole, sarei ancora in grado di recuperare t1 proprio prima di T4 se volessi?
Sì, No (La variabile 't1' è ottimizzata), e No. Per l'ultima domanda' x + y' è calcolata ma mai salvata. _EDX_ aveva il valore 'x + y' dopo' addl 8 (% ebp),% edx' ma l'istruzione 'andl $ 65535,% edx' lo distrugge. Se hai spostato _EDX_ in un registro come _ECX_ dopo 'addl 8 (% ebp),% edx', avresti comunque accesso alla parte x + y del calcolo. –
Freddo. Il codice C sarebbe davvero tradotto dietro le quinte in modo tale che non memorizzasse ogni variabile nel proprio registro? – Dylan
Non se non ce n'è bisogno. Questa è la potenza di un compilatore ottimizzante. – usr2564301