GCC'nin satır içi birleştiricisini kullanarak kendimi x86 montajı ile tanıştırmaya çalışıyorum. İki sayıyı (a
ve b
) eklemeye çalışıyorum ve sonucu c
içinde saklıyorum. Dört tane farklı denemeye sahibim; son beklenen sonucu üretmiyor.İki sayı ekleme
İlk iki örnek bir ara kayıt kullanır ve bunlar her ikisi de iyi çalışır. Üçüncü ve dördüncü örnekler, iki değeri doğrudan ara kayıt olmaksızın eklemeyi dener, ancak sonuçlar, optimizasyon seviyesine ve girdi değerlerini eklediğim sıraya bağlı olarak değişir. Neyi yanlış anlayacağım?
Ortamı:
int a = 4;
int b = 7;
int c;
Örnek 1:
asm(" movl %1,%%eax;"
" addl %2,%%eax;"
" movl %%eax,%0;"
: "=r" (c)
: "r" (a), "r" (b)
: "%eax"
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output: a=4, b=7, c=11
Örnek 2:
aşağıdaki gibii686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
İlk olarak, değişkenler bildirilen
asm(" movl %2,%%eax;"
" addl %1,%%eax;"
" movl %%eax,%0;"
: "=r" (c)
: "r" (a), "r" (b)
: "%eax"
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output: a=4, b=7, c=11
Örnek 3:
asm(" movl %2,%0;"
" addl %1,%0;"
: "=r" (c)
: "r" (a), "r" (b)
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output with -O0: a=4, b=7, c=11
// output with -O3: a=4, b=7, c=14
Örnek 4:
// this one appears to calculate a+a instead of a+b
asm(" movl %1,%0;"
" addl %2,%0;"
: "=r" (c)
: "r" (a), "r" (b)
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output with -O0: a=4, b=7, c=8
// output with -O3: a=4, b=7, c=11
ÇÖZÜLECEK.Matthew Slattery's answer doğrudur. Önce, b
ve c
ikisi için eax
yeniden çalışıyordu: yerinde Matthew düzeltme önerisi ile
movl -4(%rbp), %edx
movl -8(%rbp), %eax
movl %edx, %eax
addl %eax, %eax
, şimdi ayrı ayrı c
tutmak için ecx
kullanır.
movl -4(%rbp), %edx
movl -8(%rbp), %eax
movl %edx, %ecx
addl %eax, %ecx
Optimizasyon etkin veya etkin olmadan benim için iyi çalışıyor. Derleme dili listesi almak için -S ile derlemeyi deneyin. Sonra hangi kayıtların kullanıldığını görebilirsiniz. – TonyK
Fark ettim ki, optimizasyon seviyesine bağlı olarak farklı sonuçlar elde ediyorum. Kod örnekleri yeni çıktıyla güncellendi. –
Peki montaj listesi size ne anlatıyor? – TonyK