Вопрос

No comments
  • А есть ли какие нибудь примеры (уроки) использования сис.функций КОС ?... ну кроме стандартного EXAMPLE.ASM ? Где их можно взять то ? :-)
  • [quote="Pathoswithin"] через указатель на структуру. [/quote]
    Можешь выложить часть кода, т.е. пример передачи параметров через указатель? В чём там преимущество не пойму ? Если параметров надо передавать 10, то ведь всё равно будет 10 присваиваний до вызова процедуры, а в процедуре все равно будет 10 "изъятий" этих параметров в процедуру. В чём соль то ?
  • f70struct rd 6

    mov [f70struct], param1
    mov [f70struct + 4], param2
    mov [f70struct + 8], param3
    mov [f70struct + 12], param4
    mov [f70struct + 16], param5
    mov [f70struct + 20], param6
    mov eax, 70
    mov ebx, f70struct
    int 40h

    Преимущество в том, что структура находится с этой стороны, а не с той. У каждой программы структура собственная. Если программа многопоточная, то каждый поток тоже динамически выделяет память под личную структуру. Таким образом несколько вызовов могут происходить паралельно. В ядре параметры выгружаются так:

    mov eax, [ebx]
    mov edx, [ebx+4]
    mov ecx, [ebx+8]
  • Pathoswithin, в принципе понял. Но мне до многопоточности еще далеко, может быть позже учту это всё.
  • ALEXS1983 wrote:Вот выложу тебе процедуру написанную на дельфи и её асм-аналог созданый дельфи после компиляции. Определи пожалуйста процент говнокода, уж очень интересно мне
    Процентов 100. Начиная прямо с обращения к локальной переменной, копия которой уже есть в регистре.
    ALEXS1983 wrote:Дорогой Pathoswithin, я всё таки не на "прямую" в фасме пишу, а видишь как делаю, и надо чтобы это всё происходило максимально корректно, быстро, эфективно и работало к тому же.А "палировкой" можно заняться позже и то если оно нужно будет. Скачай пожалуйста урок5, прежде чем критиковать setEDX_ и прочее, расмотри, представть как оно всё происходит, а лучше сам попробуй сделать как я делал.
    ALEXS1983 wrote:Вот уже мысля появилась, что почему бы всю программу не написать на делфи и перекинуть её целиком и полностью, а не попроцедурно, вот тогда там "танцев с бубном" точно не будет, ну между процедурами это уж точно, дак как всё будет сделано дельфи и вызов из процедуры процедуру тоже! А уж вызов int 40, можно будет скорректировать, ну или оставить "танці с бубном", :-) фиг с ним, пойдёт работать ведь будет, вреда наносить никому и ничему не будет! :-)
    Вместо того, что ты пытаешься сделать, изучи Си. Я серьёзно. Visual Studio, в отличие от Delphi, бесплатна, генератор позволяет сделать проект, в котором Студия компилирует итоговый Колибри-бинарник сама, без необходимости переписывания ассемблерных листингов. Причём итоговый код будет значительно лучше скопипащенного из листингов Delphi - Delphi никогда не отличалась хорошей оптимизацией. "Знания" ассемблера уровня, который демонстрирует эта тема, бесполезны, а знание Си в жизни пригодится.
    Сделаем мир лучше!
  • Pathoswithin, знаешь, насчёт структур, - ты прав! Надо к каждой процедуре СВОЮ(!) структуру данных. При кортеже который общий, возникает путаница когда вызываешь из процедуры процедура, а та в свою очередь еще вызывает процедуру....
    переменные param1, ... param10 то общие, вызывая из одной другую процедуру, надо передавать параметры param1 = param3, param4 = param5, param5=param1 запутаться можно последовательностью передачи параметров что-бы не запортить тот который еще не передавался и т.д.
    Просто интересный момент:
    Если без всяких примудростей к каждой процедуре "привязывать" структуру, путём "f70struct rd 6", то при написании 100 процедур под параметры уже будет зарезервировано 24*100=2400 байтов, независимо используются ли процедуры они или нет.
    Или ну и фиг с ними? Пускай себе при каждой процедуре зарезервированные для неё параметры ?!
  • нафлудили тут, пока всё прочитаешь...
    ALEXS1983 wrote:ВО ЕЩЕ: В дедьфи в помощи (о Cardinal 0..4294967295 unsigned 32-bit )написано следующее:
    An integer type represents a subset of the whole numbers. The generic integer types are Integer and Cardinal; use these whenever possible, since they result in the best performance for the underlying CPU and operating system. The table below gives their ranges and storage formats for the current 32-bit Delphi compiler.

    Тупой перевод:
    Тип целого представляет подмножество целых чисел. Типы общего целого - Целое и Кардинал; используйте их там, где возможно, поскольку они заканчиваются наилучшим показателем для основной CPU и операционной системы. Таблица ниже дает их области и память форматируется для текущего 32-битового компилятора Delphi.

    Т.е. другими словами в асме можно (и даже так лучше) использовать ГДЕ ЭТО ВОЗМНОЖНО регистры "целиком" (eax), а не их "половинки" (AX) или "четвертинки (AH, AL ) ? Или всё таки арифметичекские действия с "половинками" и "четвертинками будут происходить быстрее ?
    Процессору совершенно безразлично, складывать ли 32-, 16- или 8-битные операнды. Рекомендация везде использовать Integer или Cardinal происходит из-за того, что переменных в программе, как правило, больше одной, а если в операции участвуют переменные разной разрядности, то появляется дополнительное действие по преобразованию разрядности. Операция обращения к элементу массива по индексу на уровне процессора требует 32-битного индекса, большинство системных функций на 32-битной системе требуют 32-битных аргументов, отсюда и рекомендация 32-битных типов. Для простой арифметики использование al/ah/ax вместо eax не медленнее, но и не быстрее.
    ALEXS1983 wrote:Заинтересовала было меня команда TEST eax, eax или что-то в этом роде, полез в гугл, узнал, что она делает, вот правда не очень-то понял... не очень-то понял нафига она и именно в том месте, можно было бы другую команду
    Если ты про тот же фрагмент кода, то всё в порядке, она там и правда совершенно не нужна, jb после test никогда не делает переход. Это к вопросу об "оптимизациях" Delphi. Для справки: она происходит из оператора for и пытается проверить, что верхняя граница цикла Thickness-1 больше или равна нижней границе цикла 0. Тип Cardinal, как очевидно по коду, компилятор считает беззнаковым, а любое беззнаковое число больше или равно нулю - даже если передать функции Thickness=0, при вычислении Thickness-1 произойдёт переполнение и цикл будет выполнен 4294967295+1=4294967296 раз.
    Сделаем мир лучше!
  • ALEXS1983 wrote:вот так и связалось, - если писать для Колибри, то на асме.... если писать на асме, то для Колибри....
    В Колибри уже очень давно есть не только программы на асме, но и на C/C++.
    ALEXS1983 wrote:Если у тебя есть какие-то лучше предложения, - я слушаю, внимательно!... Например, может можно для КОС прямо из виндовой дельфи клепать программы ?!... или еще что-то, Могу пересмотреть свои взгляды, это несложно. Или есть Дельфи (паскаль) который запускается из KlbrInWin ?! Что-то я вроде расматривал, типа ФриПаскаль что-ли... для КОС, но видимо не разобрался.... или не понравилось, не помню уже.
    Я ещё раз настоятельно рекомендую Visual Studio. Прямо из которой можно "клепать программы".
    Сделаем мир лучше!
  • Ну вот наконец-то кто-то внес рациальное предложение тут. Насчет VS для Алекса плюсую.
  • ALEXS1983
    И вот тут мы пришли к тому, почему параметры передаются через стек, я и сам не смог так хорошо объяснить. Причём, это ещё и удобно, когда пишешь под fasm с использованием макросов stdcall, invoke, proc endp.
  • Я конечно обмозгую хорошенько всё что тут было написано, но позже. Хотя видимо я не некоторые вещи не понимаю, не хочу понять, да и врядли захочу!

    «Процентов 100. Начиная прямо с обращения к локальной переменной, копия которой уже есть в регистре.»
    «Спотыкаться» каждый раз об байтики при наличии мегабайтов и гигабайтов у меня нет желания! Программа оптимизуруется только тогда, когда есть в этом какой-то смыл и необходимость. Я не думаю, что писаки игрушек которые по 4 гига и более, пишут их с таким же подходом как вы мне тут предлагаете! Да и мусора в тех игрушках, наверняка сотни мегабайт, но никого это особо не печалит! Поэтому понять мне вас очень сложно, особенно если учитывать, то, что это всё таки не системное (или как правильно?!) программирование, а прикладное!
    То что КОС очень маленьким размером это прекрасно, и как говорится респект разработчикам КОС, но тогда возникает вопрос, - а остальное (пространство, ресурсы) для чего и для кого и ради чего ?! Если я, как новичок, пытаюсь чего-то писать и создать, но вы меня критикуете по коду, который в моём понимании всего лишь должен быть просто работоспособен, ну и конечно без особых крайностей по «сжиранию» ресурсов и размеру самой программы.
    Вы мне давали советы которые сводились к тому как правильно писать программы, чтобы не получался говнокод. Но в вашем понимании говнокод уже считается «Начиная прямо с обращения к локальной переменной, копия которой уже есть в регистре.». Ну уж извините! По-моему это уж слишком!
    А можно мне вам совет дат? А почему бы вам не написать систему так, чтобы любой код (говнокод) был для неё ка «семечки», - всё переварит?! Вот тогда уж точно цены не будет системе и ей разработчикам в базарный день! :-)
    Вспомнил случай, когда хвастаются автомобилями, а потом говорят, что мол для такого автомобиля и бензин хороший нужен и масло дорогое, а я им в ответ: Вот если бы та сказал, что в мою машину заливай что хочешь, она на всём работать будет и всё переварит, вот тогда бы меня это удивило бы! Вот и тут вроде похожий случай.
    В общем, как я уже писал в начале сообщения, я конечно обмозгую хорошенько всё что тут было написано, может и вправду как мне выразились это не твоё и не для меня!
    Всех благ! :-)
  • ALEXS1983 wrote:Хотя видимо я не некоторые вещи не понимаю, не хочу понять, да и врядли захочу!
    Не задавай вопросов, на которые не хочешь услышать ответ. Я дала свою экспертную оценку в ответ на твои слова "Определи пожалуйста процент говнокода, уж очень интересно мне", пусть и не ко мне лично обращённые. Люди интерпретируют твои вопросы по коду как "помогите сделать код лучше" и, соответственно, дают советы, как сделать код лучше.
    ALEXS1983 wrote:«Спотыкаться» каждый раз об байтики при наличии мегабайтов и гигабайтов у меня нет желания! Программа оптимизуруется только тогда, когда есть в этом какой-то смыл и необходимость. Я не думаю, что писаки игрушек которые по 4 гига и более, пишут их с таким же подходом как вы мне тут предлагаете! Да и мусора в тех игрушках, наверняка сотни мегабайт, но никого это особо не печалит! Поэтому понять мне вас очень сложно, особенно если учитывать, то, что это всё таки не системное (или как правильно?!) программирование, а прикладное!
    То что КОС очень маленьким размером это прекрасно, и как говорится респект разработчикам КОС, но тогда возникает вопрос, - а остальное (пространство, ресурсы) для чего и для кого и ради чего ?! Если я, как новичок, пытаюсь чего-то писать и создать, но вы меня критикуете по коду, который в моём понимании всего лишь должен быть просто работоспособен, ну и конечно без особых крайностей по «сжиранию» ресурсов и размеру самой программы.
    Вы мне давали советы которые сводились к тому как правильно писать программы, чтобы не получался говнокод. Но в вашем понимании говнокод уже считается «Начиная прямо с обращения к локальной переменной, копия которой уже есть в регистре.». Ну уж извините! По-моему это уж слишком!
    Такой подход имеет право на жизнь. Но тогда не надо гордиться таким кодом и, тем более, не надо учить других таким кодом и призывать "спецов" ковыряться в полученном. Можно, например, всё-таки сделать какую-нибудь программу и гордиться уже ей, в подфоруме "Программы" на качество кода смотрят в последнюю очередь, если вообще смотрят.
    Сделаем мир лучше!
  • "А что это вы мне говорите не лить соляру в феррари? У нас в деревне все трактора на ней ездят и ничего!"
  • Pathoswithin,
    Попробовал передачу данных в процедуру через структуру....
    ну ты знаешь, интересненько так получается :-)
    ссылку на структуру указываешь (редактируешь в коде ) вего один раз,
    скомпилированный код получается размером на 1/3 меньше, аккуратный и компактный, видимо и выполняться будет быстрее
    есть конечно и недостатки, - в дельфи в асм вставках процедуру уже не «прокрутишь», либо я пока не знаю как её «прокручивать», дело в том что в дельфи в асм вставках понятия указателя, (ссылки на переменную) похоже не существует, т.е.
    mov eax, Registers аналогично mov eax, [Registers] в любом случае присваивается значение переменной а не ёе адреса! Если указывать жёсткую привязка к адресу : mov eax,[$004040ac] mov [eax],$00000026 понятное дело, что тоже такие «номера» не проходят, ошибку выдаёт.

    Pathoswithin,
    Спасибо за мысль о передаче параметров через структуру. Даже если у меня конце-концов ничего не получится, с тем что я задумал, то буду знать, что в Дельфи, при передачи переменных процедуре через структуру код отпимальней. Такое может однажды понадобится.
  • Who is online

    Users browsing this forum: No registered users and 5 guests