'daki deyimine devam etmek üzere derlemenin oluşturulmasına eşdeğerdir C kodunda bir döngü içinde bir devam ifadesi kullanıldığında, GCC, döngü bloğunun sonundan hemen önce nop komutuyla yeni bir etiket oluşturur ve atlamak yerine atlar. döngü bloğunun sonuna kadar. Örneğin,GCC, C
for (i=0; i<10; i++) {
puts("blah\n");
if (i < 10) continue;
puts("This shouldn't be printed.\n");
}
aşağıdaki ASM eşdeğer üreten aşağıdaki C kodu için (gcc -S kullanılarak):
movl $0, 28(%esp)
jmp L2
L5:
movl $LC0, (%esp)
call _puts
cmpl $9, 28(%esp)
jle L7
L3:
movl $LC1, (%esp)
call _puts
jmp L4
L7:
nop
L4:
incl 28(%esp)
L2:
cmpl $9, 28(%esp)
jle L5
(if (i derleyici kokan böylece 10) bir parçası sokulur < t "devam" ifadesini takip eden her şeyi kaldırarak bölümü "optimize et")
Soruma göre, neden doğrudan L4'e atlamıyorum? IMO, L4'e atlayabileceğimiz bir şey mi eksik?
Hızlı cevap için teşekkürler! -O1 hile yaptı, ancak optimizasyondan sonra program akışı biraz daha az sezgisel gibi gözüküyor - yanılmadıkça, döngü şimdi kısmen açık görünüyor. Şimdi nop talimatı ile etiket oluşturma konusunda herhangi bir teşvik olup olmadığını merak ediyorum. Bu yaklaşımın, doğrudan L4'e sıçraması halinde gerçekleşecek bir şeyi önleyeceği bir durum var mı? – susmits
Hata ayıklama amacıyla, L7 etiketinde bir kesme noktası belirtebilirsiniz - orada olmadığında devam durumunda kırılması zor olurdu. – nos
Susmits: -O1 ile montaj daha az ayrıntılıdır, ancak döngü açılmamış (-O3 ile açılmamış sürümü görebilirsiniz - i <10 kontrolünü veya 2. adımı() içeremez) . Genel olarak, etiket oluşturmak ve bu tür optimizasyonları gerçekleştirmemek hata ayıklamada çok yardımcı olur. –