我目前正在學習彙編和C編程語言,我有幾個關於它的問題。組裝與C代碼比較
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;
}
彙編代碼
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
而不是使用萊亞爾,然後由4移動由48乘Z,可我只是用imull $ 48,%EAX的?
此外,這是多次使用%edx寄存器。這是否意味着t1被覆蓋?換句話說,如果我願意,我還能在t4之前檢索t1嗎?
是,否(變量't1'被優化掉),並且編號。對於最後一個問題'x + y'是計算出來的,但是從未保存過。 _EDX_在'addl 8(%ebp),%edx'後面具有值'x + y',但是指令'andl $ 65535,%edx'破壞了它。如果您在'addl 8(%ebp),%edx'之後將_EDX_移動到像_ECX_這樣的寄存器,那麼您仍然可以訪問計算的x + y部分。 –
很酷。 C代碼是否真的會在幕後翻譯,以至於它不會將每個變量存儲到它自己的寄存器中? – Dylan
如果不需要它,則不需要。這是優化編譯器的功能。 – usr2564301