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 приделывали.

Date: 2007-06-07 01:35 am (UTC)
From: [identity profile] spamsink.livejournal.com
К сожалению, это автоматически генерируемый код, глобала там не избежать. Мне проще самому подчерк приписывать в таких случаях, что я уже и сделал.

Profile

spamsink: (Default)
spamsink

May 2025

S M T W T F S
     123
4 567 8910
11121314151617
18 19 2021222324
252627282930 31

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 1st, 2025 06:24 am
Powered by Dreamwidth Studios
OSZAR »