На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Scratch registers в asm-вставке GCC
    Как я это всё понимаю?

    В блоке asm есть:
    • выражение на ассемблере (собственно, код на ассемблере),
    • параметры inputs и outputs (каждый из которых состоит из связки (регистр, память и пр. – сущность, которая обозначена строкой, именуемой в доке словом constraints) и аргумента),
    • параметры clobbers (содержащие только связки, но обозначаемые несколько иначе, чем в inputs и outputs).
    • GotoLabels, хотя они нас не очень интересуют.

    Как это работает?

    Компилятор:
    1. Заносит input-аргументы в input-связки, т.е. если указано "c"(x), то делает mov ecx,x; а если "r"(x), то mov ЛюбойСвободныйРегистр,x (либо ничего не делает, если x уже есть в каком-то регистре). И разумеется, запоминает, что аргумент теперь в этой связке (например, значение x в регистре ecx).
    2. Заменяет в выражении на ассемблере выражения %0, %1, %2 на input-связки.
    3. Заменяет в выражении на ассемблере %l-выражения с метками, указанными в GotoLabels, на правильные имена меток.
    4. Вставляет выражение на ассемблере в код.
    5. Заносит output-связки в output-аргументы, т.е. если указано "=a"(z), то делает mov z,eax. Либо ничего не делает (если z, скажем, не volatile), а просто запоминает, что значение z хранится в eax, запишет, когда (и если) посчитает это нужным.
    6. Все параметры, указанные в clobbers, объявляет неопределённым (для себя самого), т.е. отвязывает все эти параметры от каких-либо значений, ячеек памяти и т.д. Т.о., отныне он не может опираться на то, что там хранятся какие-либо известные ему данные и понимает, что там теперь может быть всё, что угодно.

    Соответственно, если в inputs указано "c"(x), а в outputs и в clobbers нет "c"/"ecx", значит компилятор полагает, что в ecx по прежнему лежит x. Иначе не полагает. Вот и вся логика.

    Ещё раз про clobbers

    К примеру, если мы указали в clobbers параметр "eax", а перед вставкой выражения на ассемблере в код компилятор занёс туда x, то при чтении значения из x после выражения на ассемблере он не может теперь использовать регистр eax, т.к. там уже может быть не x, а всё, что угодно. Если мы указали "memory", а перед вставкой выражения на ассемблере в код он занёс в eax значение x, то он опять не может использовать eax при чтении значения из x, т.к. значение x могло измениться, и в eax теперь будет устаревшее значение x, а не актуальное.


    Вот, собственно, и всё. К чему выдумывать какие-то дополнительные ограничения?
    Каждый блок параметров обрабатывается отдельно и причин, почему одна и та же связка не может быть и в inputs, и в clobbers, я не вижу.
    Возможно, это немного упрощённое описание, но сути оно не меняет.

    Если у меня где-то ошибка в логике, прошу указать где, в чём и почему :)
      Jin X, тебе осталось совсем немного. К примеру, на
      Цитата Jin X @
      Я не знаю, в чём тут прикол, но вероятно, раньше такое делать можно было, но потом (зачем-то) убрали. Мне хочется понять: ЗАЧЕМ?
      ты можешь дать ответ, если подумаешь и свяжешь воедино мои и свои слова.

      P.S. Впрочем, это не отменяет того факта, что всё это домыслы. Однако выглядят в целом логично, потому отвергать их нет нужды.
      Сообщение отредактировано: Qraizer -
        Цитата Qraizer @
        ты можешь дать ответ, если подумаешь и свяжешь воедино мои и свои слова.
        Я всё равно не нахожу ответа и логики в этом.
        Ты сравниваешь это с макросами и со связыванием двух сущностей (регистра и переменной, к примеру). Я не вижу причин, почему такая связь не может рушиться на выходе из asm-блока. Ведь clobbers рушат другие связи (указанный регистр с ранее связанной переменной, ещё до asm-блока, которая не фигурирует ни в inputs, ни в outputs).

        Ещё раз:
        Цитата Jin X @
        Ведь если регистр указан и в inputs, и в outputs, то эта логика нарушается, ибо как можно связать регистр сразу с двумя аргументами? А если можно, значит в какой-то момент регистр отвязывается от input-аргумента, а в какой-то привязывается к output-аргументу. Почему же нельзя отвязать и не привязывать ни к чему?
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0245 ]   [ 16 queries used ]   [ Generated: 1.08.21, 17:59 GMT ]