Читатель ждет уж рифмы 2
Jun. 6th, 2007 02:47 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
К программистской задаче про доллар.
Вызов puts($foo); компилируется, например, в pushl $$foo - синтаксис GNU ассемблера требует знака доллара перед абсолютными выражениями, и не требует знака подчеркивания перед именами переменных.
Оператор же присваивания $foo[12] = '!'; компилируется в movb $33, $foo+12 с использованием перемещаемого выражения, которое распознается ассемблером как некорректное абсолютное.
Насколько я понимаю (хотя глубоко не копал), возможности заэкранировать символ доллара в имени переменной, чтобы можно было написать перемещаемое выражение, нет. Причину этого я вижу в том, что проект GCC и проект binutils, частью которого является GNU assembler - не связаны друг с другом.
Вызов puts($foo); компилируется, например, в pushl $$foo - синтаксис GNU ассемблера требует знака доллара перед абсолютными выражениями, и не требует знака подчеркивания перед именами переменных.
Оператор же присваивания $foo[12] = '!'; компилируется в movb $33, $foo+12 с использованием перемещаемого выражения, которое распознается ассемблером как некорректное абсолютное.
Насколько я понимаю (хотя глубоко не копал), возможности заэкранировать символ доллара в имени переменной, чтобы можно было написать перемещаемое выражение, нет. Причину этого я вижу в том, что проект GCC и проект binutils, частью которого является GNU assembler - не связаны друг с другом.
no subject
Date: 2007-06-07 01:33 am (UTC)#include
#include <stdio.h>
main() {
char
$foo[] = "Hello, world?";
puts($foo);
$foo[12]="!";
}
и всё будет ок.
Ещё наверняка на старых не-ELF-овских системах (типа первого линуха, 15+летней давности) всё будет работать, там всегда к глобалам underscore приделывали.
no subject
Date: 2007-06-07 01:35 am (UTC)