User Tag List

Показано с 1 по 10 из 907

Тема: Мощная среда ZXDev для разработки НА ПЯТИ ЯЗЫКАХ для ZX готова к тестированию

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от newart Посмотреть сообщение
    Можно поподробнее? А то разговоров на эту тему много, а примеры встретишь редко.
    Ну вот например, шлю тестовую программу на си и результат ее компиляции в асм. Программа состоит из двух простых функций: gcd для поиска наибольшего общего делителя; и recupow для возведения в степень с помощью рекурсии (хотел посмотреть, как компилируется рекурсия).

    Замечания следующие:
    1) Генерируется код для инициализации глобальных переменных (строки 47-65 асм-файла). Вместо этого можно было бы иметь сегмент инициализированных данных, эта концепция поддерживается многими компоновщиками.

    2) Код инициализации данных чрезвычайно неэффективный:
    LD IY, adr
    LD (IY),data

    3) Для сравнения двух однобайтовых переменных (строки 84-87 асм-файла) используется команда SUB, а не CP. В результате портится значение аккумулятора, которое далее по тексту программы приходится восстанавливать.

    4) Весь цикл функции gcd (строки 84-104 асм-файла) реализован без использования регистров для локальных переменных, все данные сохраняются в памяти посредством индексной адресации. Мне удалось разместить переменные на регистрах только если объявить их локальными, скопировать в них значения аргументов функции, а в цикле работать с локальными переменными. Что ж - спасибо и на этом, хотя с семантической точки зрения разницы быть не должно, и оптимизатор, в идеале, должен генерировать одинаковый код в обоих случаях.

    5) Для функции recupow, сравнение одного и того же числа с разными значениями, строки 121, 129 асм-файла. Во-первых, выполнение OR A не портит значение аккумулятора, поэтому восстанавливается он без необходимости. Во-вторых, сравнение с единицей командой SUB 1. Почему не CP? Почему не DEC? Тем более что далее по тексту программы значение аккумулятора снова восстанавливается из памяти (строка 136) и снова уменьшается на единицу, на этот раз командой DEC.

    Засылка однобайтового числа на стек обычно выполняется командами PUSH AF / INC SP. Этим экономится 1 байт на стеке за счет потери тактов на команду INC SP и, возможно, DEC SP при удалении со стека аргументов после возврата функции, если их число было нечетным.

    Однако в строках 138-140 асм-файла аргумент засылается на стек почему-то посредством LD D,A / PUSH DE / INC SP. Я не нашел этому разумного объяснения.

    Путем некоторых шаманских действий с программами - таких как перемена местами операндов при сравнении на неравенство (!) - мне удавалось иногда повысить эффективность генерируемого кода. Но если писать на Си или другом языке высокого уровня, изначально учитывая особенности оптимизатора - то проще уж сразу на ассемблере писать программы.
    Вложения Вложения

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. мощная игрушка
    от ZEman в разделе Игры
    Ответов: 128
    Последнее: 23.03.2024, 17:05
  2. Ответов: 5
    Последнее: 20.06.2011, 03:18
  3. Видеоконтроллер из пяти микросхем
    от zx-kit в разделе Изображение
    Ответов: 20
    Последнее: 31.03.2011, 14:48

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •