spamsink: (Default)
[personal profile] spamsink
К программистской задаче про доллар.

Вызов puts($foo); компилируется, например, в pushl $$foo - синтаксис GNU ассемблера требует знака доллара перед абсолютными выражениями, и не требует знака подчеркивания перед именами переменных.

Оператор же присваивания $foo[12] = '!'; компилируется в movb  $33, $foo+12 с использованием перемещаемого выражения, которое распознается ассемблером как некорректное абсолютное.

Насколько я понимаю (хотя глубоко не копал), возможности заэкранировать символ доллара в имени переменной, чтобы можно было написать перемещаемое выражение, нет. Причину этого я вижу в том, что проект GCC и проект binutils, частью которого является GNU assembler - не связаны друг с другом.

Date: 2007-06-07 01:33 am (UTC)
From: [identity profile] rqk.livejournal.com
Положи вместо .data на стек/в регистры, типа:

#include
[Error: Irreparable invalid markup ('<stdio.h>') in entry. Owner must fix manually. Raw contents below.]

Положи вместо .data на стек/в регистры, типа:

#include <stdio.h>
main() {
char
$foo[] = "Hello, world?";
puts($foo);
$foo[12]="!";
}

и всё будет ок.

Ещё наверняка на старых не-ELF-овских системах (типа первого линуха, 15+летней давности) всё будет работать, там всегда к глобалам underscore приделывали.
Page generated Apr. 30th, 2026 01:29 am
Powered by Dreamwidth Studios