GCC generuje błędny asm
Bartosz Świątek
shadzik at gmail.com
Wed Mar 28 15:36:47 CEST 2012
Cześć,
taki oto najprostszy program:
int $12 = 0;
int main() {
return $12;
}
mam kaprys nazwać sobie zmienną $12, bo niby czemu nie.
Kompilacja zwraca:
$ gcc test.c
/home/users/shadzik/tmp/ccFZKf57.s: Assembler messages:
/home/users/shadzik/tmp/ccFZKf57.s:20: Error: junk `(%rip)' after expression
Ojej, no to sprawdźmy co to za brzydki asm z tego wyszedł (gcc -S test.c):
W test.s takie bzdury:
(...)
.globl $12
.bss
.align 4
.type $12, @object
.size $12, 4
$12:
.zero 4
.text
(...)
movl $12(%rip), %eax
To nie ma prawa się skompilować, ponieważ $ oznacza adres immediate w
asm intelowskim. Poprawne byłoby dodanie przed $12 '_' czyli _$12, by
wszystko działało jak powinno.
Ba, okazuje się, że z niektórymi przełącznikami w gcc, ten kod się
kompiluje ale wartość returna to 12, ponieważ inteligentnie sobie
robi: movl $12, %eax :)
Kto poprawi? Bo inaczej ftp move wywali nam gcc i czym potem se
pajtona skompilujemy?
Pozdrawiam,
b
--
"I'm living proof if you do one thing right in your career, you can
coast for a long time. A LOOOOONG time." -Guy Kawasaki
More information about the pld-devel-pl
mailing list