Вопрос

No comments
  • Решил просмотреть дамп
    И вот что я увидел:
    ИЗ КОМПИЛИРОВАННОГО КОДА FASM (файл Lesson.bin )
    ...............
    8Bh, 45h, 08h,
    48h,
    72h, 0Ah,
    ...............

    А вот какой код в этом промежутке в дельфи:
    ......................
    00403957 8B4508 mov eax,[ebp+$08]
    0040395A 83E801 sub eax,$01
    0040395D 720A jb +$0a
    ......................

    Проверил на всякий случай в Main.asm
    ..........................
    ;//EL_indicator.dpr.24: case drawType of
    mov eax,[ebp+$08]
    sub eax,$01
    jb @STR25;//jb +$0a
    .....................................


    МНЕ КТО НИБУДЬ МОЖЕ ОБЪЯСНИТЬ ЧТО ЭТО ВСЁ ЗНАЧИТ И КАК ЭТО ВСЁ ПОНИМАТЬ ?!
    FASM МОЖЕ КОМПИЛИРОВАТЬ НЕВЕРНО ? ЧТО С ЭТИМ ДЕЛАТЬ И КАК С ЭТИМ БОРОТЬСЯ ?
  • Мама мия! :-) вручную заменил в FASMе команду "sub eax,$01" на "db $83, $E8, $01" такую как предложил дельфи и всё заработало как надо!
    .................
    ;//EL_indicator.dpr.24: case drawType of
    mov eax,[ebp+$08]
    db $83, $E8, $01 ; sub eax,$01
    jb @STR25;//jb +$0a
    ............................
    ВЫВОД ФАСМ КОМПИЛИРУЕТ С ОШИБКАМИ!
    Правда мне от этого не легче! Можно ли какой-нить другой асм использовать, который может компилировать для КОС ?
  • ALEXS1983 писал(а):
    > ВЫВОД ФАСМ КОМПИЛИРУЕТ С ОШИБКАМИ!
    Мне удалось разобраться в чем проблема. Сделал файл asm с текстом:
    sub eax,1
    после компиляции мне выдало 4 байта
    66 83 e8 01
    потом пришла в голову мысль добавить вначале файла строку
    use32
    и потом получилось 3 байта
    83 e8 01
    Вывод: фасм по умолчанию делает код для 64 битных процессоров. Если ему указать use32 все работает нормально.
  • Точнее, фасм по умолчанию делает 16 битный код, на что указывает префикс 66h.
  • Ребята, я ведь про конкретный пример, про который я писал здесь viewtopic.php?f=10&t=370&start=60#p63188
    и если вы посмотрите его, то увидите, что первая строка файла Main.asm, -
    "use32 ; включить 32-битный режим ассемблера"
    а вы мне про что?! :-)
  • Code: Select all

    purge add,sub
    после macros.inc. И вместо копипаста кода, выданного Delphi, думать, что происходит. И нет, это не глюк ни fasm, ни KlbrInWin.
    Сделаем мир лучше!
  • [quote="CleverMouse"][code]purge add,sub[/code]
    после macros.inc. И вместо копипаста кода, выданного Delphi, думать, что происходит. И нет, это не глюк ни fasm, ни KlbrInWin.[/quote]
    Я конечно извиняюсь, несколько раз прочитал, но ничего не понял из написанного ?!
  • А если MACROS.INC вообще не подключать, так как его не понимаю (возможно пока) можно ли без него "прожить" ? Или там что-то есть существенное ? Ну "mcall" естественно я заменю на нормальный код.
  • purge это директива отменяющая действие последнего указанного в ней макроса. В macros.inc есть макрос для команды sub, который отменяется директивой purge, которая идет после.
    ALEXS1983 писал(а):
    > а вы мне про что?! :-)
    код действительно не смотрел, но скорее всего там purge или вообще не нужно, или ставить его надо перед подключением macros.inc
  • [quote="IgorA"]purge это директива отменяющая действие последнего указанного в ней макроса. В macros.inc есть макрос для команды sub, который отменяется директивой purge, которая идет после.
    ALEXS1983 писал(а):
    > а вы мне про что?! :-)
    код действительно не смотрел, но скорее всего там purge или вообще не нужно, или ставить его надо перед подключением macros.inc[/quote]
    Я понял! У меня теперь сейчас стоит вопрос в том, чтобы macros.inc вообще отключить (не подключать к проектам) мало ли что еще там окажется, стоит ли это делать ?
  • Если не хочешь стать говнокодером, надо всегда находить причину, а не устранять последствия. И mov [@esp_], esp и отказ от macros.inc — очень плохие идеи. Я тоже не смотрел код, так как cloud.mail.ru послал меня обновить браузер, а я послал его в другое место. Но здесь всё просто, вместо прыжков на метку у тебя прыжки на конкретное расстояние jb +$0a. Макрос заменил sub eax,1 на dec eax, код стал на 2 байта короче, расстояние стало неправильным.
  • [quote="Pathoswithin"]Если не хочешь стать говнокодером, надо всегда находить причину, а не устранять последствия. И mov [@esp_], esp и отказ от macros.inc — очень плохие идеи.[/quote]
    Если на то пошло, то сначала надо стать хоть каким-то кодером, а уж потом неговнокодером. И поэтому считаю своё поведение вполне логичным, т.е. применяю, то что работает в общем-то нормально и без сбоев. А вот когда решу "палировать" своё совершенство (хотя я может быть такого и не решу, посчитаю, что нафиг оно надо, мол я достаточно понял того что мне нужно!... скорее всего так оно и будет!), тогда буду идеализировать свой код и свои действия. Но до этого пока мне далеко! А "топтаться на месте", мусоля над "цепочкой" в несколько асм-команд, думая над тем, являются ли они говнокодом или нет, а также, что с ними делать если, они всё таки, (та "цепочка" команд асма) не являются идеальным кодом или даже говнокодом я не собираюсь! Главное, что-бы оно работало! И работало правильно!
    Да и вообще, объясни мне пожалуйста, что ты считаешь говнокодом ? Сейчас мощь аппаратуры по количеству памяти, и быстродействию, а также "вырезанный" мной код из дельфи, который оптимизирован, которого будет не менее 99% от всего кода - это всё вполне покроет мои небольшие и редко встречающиеся "грешки" подобные mov [@esp_], esp. Причём покроет с лихвой! Мои "грешки" будут как капля в море, а может и того меньше.
    И вот объясни мне пожалуйста, что ты мне пытаешься доказать?! То, что я не програмлю так как ты и это уже является неправильным и говнокодом?! Так тебя понимать?! Ну так я никогда и не буду програмить так как ты! Значит, согласно твоей логике, какой бы не была бы мной написана программа (процедура), то она будет являться говнокодом, так как, видишли ты в ней сможешь найди не идеальную часть кода, которую можно оптимизировать. А ты оптимизацией кода, после компиляции такими средами программирования, как например, Дельфи не хочешь заняться ? :-) И критиковать их ? :-) Наверняка там найдутся участки кода которые ты явно считаешь говнокодом.
    Короче говоря :-), в моём понимании говнокод, это такой код, который очень сложно назвать работоспособным и неторможенным, т. е. если написан обычный калькулятор «вес» которого 1,5 гига, да еще и при этом он сильно тормозит и глючит, «жрёт» ресурсы процессора и системы, да еще и ко всему работает не всегда правильно, - вот это, да, явный говнокод! А то, что я, например, напишу программу(процедуру) «весом», 1500 байт, и длительностью работы 2/10 сек. , а ты такую напишешь в 900 байт, с длительностью работы 9/100 сек, я думаю, что это не актуально и никого ты этим не удивишь и нечего не никому не докажешь! И это даже мало кто заметит!
    Ради чего так «париться» ?

    [quote="Pathoswithin"] Я тоже не смотрел код, так как cloud.mail.ru послал меня обновить браузер, а я послал его в другое место. [/quote]
    Если есть какие-то предложения и мысли куда заливать, - пиши, рассмотрю.

    [quote="Pathoswithin"] Но здесь всё просто, вместо прыжков на метку у тебя прыжки на конкретное расстояние jb +$0a. Макрос заменил sub eax,1 на dec eax, код стал на 2 байта короче, расстояние стало неправильным.[/quote]
    Ну вот плохо, что ты кода не видел! Нету там этих «прыжков», там всё заменено ссылками, да и вообще уже разобрались ( надо purge add,sub вставить, после include 'macros.inc', ) чёто там макросы балуются. Ну главное, что решилось!... макросы я пока «отцепляю», что-бы чего-то другого не коснулось и в следующий раз голова не пухла :) Я всё равно в них ничерта не разбираюсь. В дельфе есть такая директива как Inline, (я правда ей никогда не пользовался), если её написать после процедуры, например Procedure A; Inline; , то процедура вставляется в код, от куда её вызывают, т.е. процедура становиться макросом. Есть ли такое в FASMe ? Думаю, удобная вещь.

    З.Ы. Надеюсь, на твоё правильное понимание мной написанного! :-) В том смысле, что в написанном мной, не преследовалось каких-то оскорблений или унижений собеседника и его мнения! :-)
    Еще вопрос возник, если знаешь подскажи плиз, - см. след сообщение
  • Вопрос.
    mcall -1 (конец программы) это, я так понял, когда без макроса то вот так:
    mov eax,-1
    call INT0x40;
    Но ведь регистры не могут быть отрицательными ?! Какое реальное число eax ?
    $FFFFFFFF ? Так ?
    Т.е. Вместо mov eax,-1 можно вполне вписывать mov eax,$FFFFFFFF ?
  • omg...
    Товарищ Pathoswithin тебе дело говорит, незачем бомбить так. Надо научиться анализироваьь проблему, находить причину и способы её исправления, а не сразу кричать, что аиговат эмулятор, ассемблер и т.д. не разобравшись. Говнокод, по сути получается в результате а)либо лени опытного разработчика прорабатывать полноценное решение для одноразового кода, который после проверки идеи будет выкинут и заменен полноценным аналогом или просто выкинут; б) либо в результате непонимания неопытного разработчика языка, инструментов, методов построения систем, алгоритмов, теории и т.д. и т.д.
    Причем второй вариант в природе встречается гораздо чаще. В этом случае совет от более опытного товарища лучше не воспринимать в штыки, а попытаться понять и применить, если конечно есть желание расти над собой.

    Что ещё за call INT0X40 ? У тебя есть такая функция? Вообще в fasm будет int 0x40
    Да в eax будет 0xffffffff, но зачем так писать? Чтобы ещё больше непонятно было? Читает человек твой "урок", а там какая то сис. функция с огромным номером, которой нет в документации.
  • Who is online

    Users browsing this forum: No registered users and 1 guest