Вопрос

No comments
  • > Но ведь регистры не могут быть отрицательными ?!

    В регистр можно положить отрицательное число, оно будет преобразовано в двоичное представление в дополнительном коде (см. https://ru.wikipedia.org/wiki/Дополните ... ние_числа) ). В регистре реально не лежат числа, там находятся ячейки с высоким или низким электрическим уровнем, а проинтерпретировать их можно по-разному - в зависимости от контекста либо как беззнаковое число, либо знаковое число, либо вообще как 32 зажженные лампочки на каком-нибудь девайсе.
  • Форум съел ссылку, там была ссылка на статью "Дополнительный код (представление числа)" в Википедии
  • [quote="Ray"]omg...
    Товарищ Pathoswithin тебе дело говорит, незачем бомбить так. [/quote]
    Да меня ведь новичка тоже бомбят! :-) Я еще только лишь учусь, а мне говорять, - «так не делается», «сяк не делается», «говнокод», а по мне так, для начала пусть «оно» хоть как-то работает! Потом проще заново переписать, когда я пойму, что что-те неверно написано, т. е. когда «шишки на лбу» набью! Я же не на выставку свой код готовлю конце-концов, - зачем он мне или кому-то идеальным ?! Код нужен просто рабочим! Для начала!

    [quote="Ray"] Что ещё за call INT0X40 ? У тебя есть такая функция?[/quote]
    Ага, есть! Собственного «приготовления»!

    [quote="Ray"] Да в eax будет 0xffffffff, но зачем так писать? Чтобы ещё больше непонятно было? Читает человек твой "урок", а там какая то сис. функция с огромным номером, которой нет в документации.[/quote]
    Ну, что за народ, а ?! :-) Где ты видел у меня в вопросе слово «писать» ?! Я хотел лишь это для себя любимого узнать!
  • "Если на то пошло, то сначала надо стать хоть каким-то кодером, а уж потом неговнокодером."
    Это если получится потом переделать свои привычки. Тем более, у меня же получилось по-другому. Я освоил программировние самостоятельно, не учился в ВУЗе и ни один человек мне не помогал. При этом проблем у меня возникало, пожалуй, меньше чем у тебя. Читал один самоучитель, что-то не понял — почитал другой, потом уроки на wasm.ru, в итоге на практике я уже чётко понимал, что делаю. Участие в этом проекте — мой первый серьёзный опыт, и вроде никто не жаловался. Мне кажется, это потому, что я начал с теории, а не с практики.

    "Да и вообще, объясни мне пожалуйста, что ты считаешь говнокодом ?"
    Это код, в котором классические, проверенные подходы чудесным образом отказываются работать, из-за чего приходится искать обходные пути и городить "костыли". Такой код работает пока его не трогают, но если попытаться в нём что-либо изменить, он тут же рассыпается. Размер и скорость сейчас действительно не особо ценят, а вот расширяемость это современный тренд.

    "И вот объясни мне пожалуйста, что ты мне пытаешься доказать?!"
    Я приведу пример. Моя подруга пыталась учить python и попросила меня помочь ей с простенькой программой. Я с ним никогда дела не имел, но общие принципы высокоуровнего программирования знаю. Я потратил пол часа на изучение используемых в программе API и подправил общий подход. За это время подруга успела перепробовать несколько вариантов, ни один из них не работал как надо, а мой вариант заработал с первого раза. С тех пор я убеждён, что метод втыка в программировании не работает.

    "Нету там этих «прыжков», там всё заменено ссылками, да и вообще уже разобрались чёто там макросы балуются."
    Макросы всё правильно делают — код оптимизируют. А вот то, что он после этого не работает — неправильно. Все адреса должны быть относительными. Например, прыжки должны выглядеть так:
    jb some_name
    ...
    some_name:
  • [quote="Insolor"] В регистр можно положить отрицательное число, оно будет преобразовано в двоичное представление в дополнительном коде (см. https://ru.wikipedia.org/wiki/Дополните ... ние_числа) ). В регистре реально не лежат числа, там находятся ячейки с высоким или низким электрическим уровнем, а проинтерпретировать их можно по-разному - в зависимости от контекста либо как беззнаковое число, либо знаковое число, либо вообще как 32 зажженные лампочки на каком-нибудь девайсе.[/quote]
    Я понимаю что ты прав, да и я это знаю, но....
    В твоём предложении нужно выделить слова "МОЖНО" и "ПРЕОБРАЗОВАНО", т.е. до тех пор пока на регистр процессора или ячейку памяти, не "наложено" указания типа, оно всё таки рассматривается как целочисленное положительное от нуля (и выше). В доказательство этого, (системные) функции любой системы. Когда надо вызвать функцию, например нарисовать точку или прямоугольник или букву на экране, то числовое значение переданных в координат в функцию, рассматривается именно так как я написал выше.
  • > В твоём предложении нужно выделить слова "МОЖНО" и "ПРЕОБРАЗОВАНО"
    > В доказательство этого, (системные) функции любой системы. Когда надо вызвать функцию, например нарисовать точку или прямоугольник или букву на экране, то числовое значение переданных в координат в функцию, рассматривается именно так как я написал выше.

    Ты еще пропустил "в зависимости от контекста". В том то и дело, что в приведенном тобой примере функция интепретирует переданное числовое значение как беззнаковое (а другое ей и не нужно). Я могу привести контраргумент: операции (не функции, а операции микропроцессора) idiv и imul интерпретируют переданные им значения как знаковые числа, а div и mul - как беззнаковые. Все зависит от контекста, единого утвержденного способа инетрпретации просто нет.
  • [quote="Pathoswithin"]"Если на то пошло, то сначала надо стать хоть каким-то кодером, а уж потом неговнокодером."
    Это если получится потом переделать свои привычки. [/quote]
    Ну я думаю, что если захочу и посчитаю нужным, то получится, обязательно получится!

    [quote="Pathoswithin"]
    "Да и вообще, объясни мне пожалуйста, что ты считаешь говнокодом ?"
    Это код, в котором классические, проверенные подходы чудесным образом отказываются работать, из-за чего приходится искать обходные пути и городить "костыли". Такой код работает пока его не трогают, но если попытаться в нём что-либо изменить, он тут же рассыпается. Размер и скорость сейчас действительно не особо ценят, а вот расширяемость это современный тренд.
    [/quote]
    А теперь давай по существу, т.е. то, что касаемо меня.
    Я вырезаю скомпилированный код дельфи, который достаточно хорошо оптимизирован, - ЭТО НЕВЕРНО ? НАДО ОБЛОЖИТСЯ КНИГАМИ ПО АСМУ И ВНИКАТЬ В КАЖДУЮ КОМАНДУ И ЕЁ ВЛИЯНИЕ НА КАКОЙ-ТО ФЛАГ ПРОЦЕССОРА ? А вот я считаю, что пусть это дельфи делает за меня, а мне можно лишь понимать (иметь представление) достаточно поверхностно, т.е. понимать значение Push, Pop, Jb, Jmp, jz, jnz, dec, sub, Call, ret и т.д. И вот ты хоть убей меня, :-) но, если взять команды Jb, jz, jnz, знаю, что условные переходы, а вот какой из них при каких условиях, хрен сразу вспомню. Про влияние на флаги, я вообще молчу. Пока не понадобилось такого мне. И даже если мне понадобится знать это (условные переходы), то тогда когда мне это понадобится, тогда я впишу в дельфи условие и просмотрю скомпилированный код и узнаю!... что если в условии "равно нулю", то это jz ! Угадал?! :-) Если не угадал, то это значит, что команда jz мне еще достаточно не примелькалось! :-)
    Я ведь, просматриваю скомпилированные коды дельфи, "прокручивая" их пошагово, для того чтобы заменить "перескоки" , на переходы по меткам, думаю, со временем, хош-не-хош, а знать некоторые команды асма буду! Причём знать буду, в тот момент когда действительно нужно это знать!
    Ну чем не метод изучения асма?! Плохой, только потому, что он нестандартный ?!
    Понятное дело, что абсолютно без какой либо документации или справки не обойтись. Ну так, я не говорю, что не пользоваться справкой вообще. Заинтересовала было меня команда TEST eax, eax или что-то в этом роде, полез в гугл, узнал, что она делает, вот правда не очень-то понял... не очень-то понял нафига она и именно в том месте, можно было бы другую команду - ну значит еще не пришло время мне полностью понимать её значение! Придёт время разберусь. Понимаешь, в моем способе изучения, волей-не-волей изучаешь команды которые чаще всего "попадаются на глаза", а вот в книгах ведь, - всё как положено!, всё как по правилам (каким-то там)! Нафига мне нужно знать и держать в голове такие команды асма которые редко использует компилятор дельфи, при условии, что я работаю с компилированными дельфи кодами?! И т.д.

    [quote="Pathoswithin"]
    Макросы всё правильно делают — код оптимизируют. А вот то, что он после этого не работает — неправильно. Все адреса должны быть относительными. Например, прыжки должны выглядеть так:
    jb some_name
    ...
    some_name:[/quote]
    Pathoswithin, ну просмотри код для начала! Ну там так оно и есть!
    Это называется, обсуждать фильм которые никто не видел! :-) как при СССРе обсуждали фильм про агента 007. :-)
  • [quote="Insolor"] Ты еще пропустил "в зависимости от контекста". В том то и дело, что в приведенном тобой примере функция интепретирует переданное числовое значение как беззнаковое (а другое ей и не нужно). Я могу привести контраргумент: операции (не функции, а операции микропроцессора) idiv и imul интерпретируют переданные им значения как знаковые числа, а div и mul - как беззнаковые. Все зависит от контекста, единого утвержденного способа инетрпретации просто нет.[/quote]
    Ну это можно до бесконечности!... :-)
    Я тоже могу привести контраргумент:
    Давай у любого отвлечённого человека (не знающего про наш спор), но понимающего, что такое двоичная, десятичная, шестнадцатеричная системы исчисления, попросим
    перевести число $FFFFFFFF или 11111111111111111111111111111111 ?
    Кто нибудь его переведёт как (-1) "минус один"?
    :-)
  • Вопрос о локальных метках.
    Есть процедура
    Draw:
    ….......
    .m1:
    ….......
    .m2:
    ….......

    Draw2:
    ….......
    .m1:
    ….......
    .m2:
    ….......
    Вопросы: Правильно ли я указал локальные метки ? (через точку вначале метки)
    Переходить на локальные метки m1 и m2, нужно так Jmp .m1 (через точку вначале метки) ? Если нужно перейти на метку другой процедуры то надо писать полный путь т. е. например Jmp Draw2.m1 верно ?
  • нужно так Jmp .m1 (через точку вначале метки) -- нет, просто jmp m1
    P.S. мне интересно, почему ты захотел знать asm? Может твое это высокоуровневые языки? Просто поверхностно знать это для высок. уров. языков. А чтобы вникать - это именно для низких.
  • Всё правильно. Jmp .m1 или Jmp Draw.m1

    Команда jz это прыжок, если результат операции равен нулю. Если после sub eax, ebx будет выставлен флаг нуля, значит eax был равен ebx. Cmp eax, ebx делает то же самое, но не меняет eax. Аналогично, команды and и test производят побитовое умножение. Test eax, eax позволяет проверить равен ли eax нулю (вместо сmp eax, 0).

    А по поводу влияния команд на флаги, тут ты меня на мысль натолкнул. Похоже, некоторые макросы писал твой единомышленник...
  • [quote="pavelyakov"]P.S. мне интересно, почему ты захотел знать asm? [/quote]
    ну не знаю смогу ли я объяснить... :-)
    Асм... Колибри... захотелось попробовать написать, что нибудь асм.... захотелось попробовать написать, что нибудь для Колибри....
    вот так и связалось, - если писать для Колибри, то на асме.... если писать на асме, то для Колибри....
    да и просто, чтобы мозги не заплылись :-)
    Если у меня не отпадёт желание, то что нибудь когда нибудь напишу для Колибри на асме, и не такое оно уж будет плохое как кому-то думается и как хочется! :-) У меня уже была подобная ситуация в жизни, - когда ожидали говнокод, а получилось не такой уж и говнокод как кому-то хотелось! :-) Конечно, не факт, что и в этом так получится, как в том, но попытка не пытка! :-)
    Не мало, что зависит от поддержки, т.е. если я буду получать ответы на интересующие меня вопросы, рано или поздно чего нить напишу! Пусть это будет очередные "мины" (бомбочки), ну так и что ?! Для Колибри ОС, от этого хуже станет ?!... Что еще одна игрушка появится по КОС ?!... пусть даже очередная змейка или сокобан ?!
    Если у тебя есть какие-то лучше предложения, - я слушаю, внимательно!... Например, может можно для КОС прямо из виндовой дельфи клепать программы ?!... или еще что-то, Могу пересмотреть свои взгляды, это несложно. Или есть Дельфи (паскаль) который запускается из KlbrInWin ?! Что-то я вроде расматривал, типа ФриПаскаль что-ли... для КОС, но видимо не разобрался.... или не понравилось, не помню уже.
  • ДОП.
    pavelyakov, ну вот смотри еще такой вариант.
    Я напишу змейку, исходники процедур будут в Дельфи вариации и в асм вариации аналогичные, с "лёгким" пояснением (описанием) тех процедур. Основа процедур будет скомпилированный код Дельфи, говнокод будет в моментах вызова тех процедур, и приёма-передачи параметров тем процедурам. Т.е. говно кода будет не так уж много и будет понятно где он.
    И вот возникает вопрос: Неужели вам спецам, сложно будет скорректировать говнокод, если понятно где он и понятно, что его не так уж и много, для того чтобы дать жизнь очередной простейшей игрушки для КОС ?
    Или я чего-то не так понимаю?!
  • Вот напишу как я собираюсь состыковывать процедуры код которых состоит из скомпилированныго кода дельфи.
    Допустим код для передачи параметров в процедуру @DrawXLine (выданный дельфи)
    push $00ffffff //ColorLine -цвет
    push $03 //Thickness - Толщина
    push $00 // drawTypedraw - тип рисования рисовать от Posx,Posy вверх =0 рисовать вниз =1 (с уменьшением линий), вверх =2 рисовать вниз =3 без уменьшения линий
    mov ecx,$0000000a //lengthLine - длина линии
    mov edx,$0000000a // PosY- Левый верхний угол линии
    mov eax,$0000000a // PosX- Левый верхний угол линии
    call @DrawXLine


    Что-бы не сильно парится какие регистры используются вызывающей процедурой, а какие той, которую вызывают, «пушами», «попами» и прочими пока малопонятными мне дебрями, (исполнение которых я "не чувствую" как оно происходит, хотя и понимаю, вроде) я делаю следующее:
    Создаю общий кортеж переменных для приёма и передачи данных между процедурами, т. е. асме это вот так:
    Param1: rd 1
    Param2: rd 1
    Param3: rd 1
    Param4: rd 1
    Param5: rd 1
    Param6: rd 1
    Param7: rd 1

    Соотвественно заменяю (возможно напишу с ошибками, но смысл вы поймёте):
    DrawXLineParam:
    mov eax, Param1
    push eax //ColorLine -цвет
    mov eax, Param2
    push eax //Thickness - Толщина
    mov eax, Param3
    push eax // drawTypedraw - тип рисования рисовать от Posx,Posy вверх =0 рисовать вниз =1 (с уменьшением линий), вверх =2 рисовать вниз =3 без уменьшения линий
    mov ecx,Param4 //lengthLine - длина линии
    mov edx, Param5 // PosY- Левый верхний угол линии
    mov eax, Param6 // PosX- Левый верхний угол линии
    call @DrawXLine

    В вызывающей процедуре например DrawXYLine делаю следующее:

    DrawXYLine:
    ....
    mov Param1, ebx
    mov Param2, edx
    mov Param3, ecx
    mov Param4, eax
    mov Param5, 1
    mov Param5, 154
    call DrawXLineParam
    …...

    Как по мне, то я в этом вообще говнокода не вижу, но вас идеалистов кода, я конечно же не убежу в этом. Да и убеждать не собираюсь. И даже если это идеализировать, то это с такими мощностями как сейчас, заметно не будет, ни пользователю, ни процессору, ни системе.
  • Who is online

    Users browsing this forum: No registered users and 5 guests