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