Вопрос

No comments
  • ALEXS1983 wrote:дело в том что в дельфи в асм вставках понятия указателя, (ссылки на переменную) похоже не существует, т.е.
    mov eax, Registers аналогично mov eax, [Registers] в любом случае присваивается значение переменной а не ёе адреса! Если указывать жёсткую привязка к адресу : mov eax,[$004040ac] mov [eax],$00000026 понятное дело, что тоже такие «номера» не проходят, ошибку выдаёт.
    Это одно из принципиальных отличий между fasm и tasm/masm. В fasm квадратные скобки всегда означают значение переменной, отсутствие скобок всегда означает адрес. Встроенный ассемблер Delphi ближе к tasm/masm, там нужно явно указывать offset Registers для получения указателя на глобальную переменную. Для указателя на локальную переменную - которая на самом деле представляет из себя что-то вроде ebp-8, а в x86 нет форм для mov вида eax, ebp-8 - есть инструкция lea: lea eax, [var].
    Сделаем мир лучше!
  • ДЛЯ Artyom :

    DrawXLine: ;//DrawXLine
    ;//EL_indicator.dpr.20: begin
    push ebp
    mov ebp,esp
    add esp,-$08
    push ebx
    push esi
    push edi
    mov esi,edx
    mov [ebp-$04],eax
    ;//EL_indicator.dpr.21: x1:=posx+lengthLine;
    add ecx,[ebp-$04]
    mov [ebp-$08],ecx
    ;//EL_indicator.dpr.22: For f:=0 to (Thickness-1) do begin
    mov ebx,[ebp+$0c]
    dec ebx
    test ebx,ebx
    jb @STR37 ; //jb +$64
    inc ebx
    xor edi,edi
    ;//EL_indicator.dpr.23: If f<>0 then begin
    @STR23:
    test edi,edi
    JZ @STR31; //jz +$28
    ;//EL_indicator.dpr.24: case drawType of
    mov eax,[ebp+$08]
    ; ВОТ ЗДЕСЬ ЭТО!
    sub eax,$01
    jb @STR25;//jb +$0a
    jz @STR26 ;// jz +$11
    dec eax
    jz @STR27 ;// jz +$17
    dec eax
    jz @STR28 ;// jz +$17
    jmp @STR31;// jmp +$16
    ;//EL_indicator.dpr.25: 0:begin posy:=posy-1;x1:=x1-1;posx:=posx+1; end;
    @STR25: dec esi
    dec dword [ebp-$08]
    inc dword [ebp-$04]
    jmp @STR31;// jmp +$0d
    ;//EL_indicator.dpr.26: 1:begin posy:=posy+1;x1:=x1-1;posx:=posx+1; end;
    @STR26: inc esi
    dec dword [ebp-$08]
    inc dword [ebp-$04]
    jmp @STR31 ; // jmp +$04
    ;//EL_indicator.dpr.27: 2:begin posy:=posy-1;end;
    @STR27: dec esi
    jmp @STR31 ;// jmp +$01
    ;//EL_indicator.dpr.28: 3:begin posy:=posy+1;end;
    @STR28: inc esi
    ;//EL_indicator.dpr.31: setEBX_(((x1)*65536)+(posx));
    @STR31:
    mov eax,[ebp-$08]
    shl eax,$10
    add eax,[ebp-$04]
    call setEBX_
    ;//EL_indicator.dpr.32: setECX_((posy*65536)+posy);
    mov eax,esi
    shl eax,$10
    add eax,esi
    call setECX_
    ;//EL_indicator.dpr.33: setEDX_(ColorLine);
    mov eax,[ebp+$10]
    call setEDX_
    ;//EL_indicator.dpr.34: setEAX_(38);
    mov eax,$00000026
    call setEAX_
    ;//EL_indicator.dpr.35: INT0x40D;
    call INT0x40D
    ;//EL_indicator.dpr.36: end;
    inc edi
    ;//EL_indicator.dpr.22: For f:=0 to (Thickness-1) do begin
    dec ebx
    jnz @STR23 ; // jnz -$61
    ;//EL_indicator.dpr.37: end;
    @STR37:
    pop edi
    pop esi
    pop ebx
    pop ecx
    pop ecx
    pop ebp
    ret $000c
    ;//
  • ALEXS1983, я так понял, что вы написали свой код на Delphi, скомпилировали его,
    вывели ассемблерный листинг вашей программы и решили напрямую перенести данный код,
    без какой бы то коррекции, в FASM. Так делать не следует, лучше научится писать на
    чистом FASM'е, чем постоянно ходить по граблям :)
  • [quote="Artyom"]ALEXS1983, я так понял, что вы написали свой код на Delphi, скомпилировали его,вывели ассемблерный листинг вашей программы и решили напрямую перенести данный код без какой бы то коррекции, в FASM. Так делать не следует, лучше научится писать на
    чистом FASM'е, чем постоянно ходить по граблям :)[/quote]

    Без подобных моих деяний считаю, что научится на АСМу попросту вообще невозможно! Во всяком случае мне! Я не готов перечитывать толмуды страниц книг дожидаясь прочитать то, что мне ДЕЙСТВИТЕЛЬНО нужно и всё равно никак не дождаться нужного в книге. Я не готов постоянно задавать вопросы на форумы, ещё и думать как их правильно сформулировать, чтобы меня поняли. Я хочу сразу пробовать то, что мне нужно, на языке который я знаю, и посматривать код какой получился на асме! Далее просматривать этот код пытаясь понять что какая команда делает и значит.
    "без какой бы то коррекции" - коррекцию переходов делать приходится, а всякими отпимизациями мне занматся еще рано!
    Я не пойму почему не понимают мой способ и мой метод и чего я должен поступать по другому и дествовать как другие?! Для меня вполне нормально написать (не зависимо от языка) програмку изначально лишь бы как-то работающую, а после заниматься её "палировкой".
    [quote="Artyom"]Так делать не следует, лучше научится писать на
    чистом FASM'е, чем постоянно ходить по граблям :)[/quote]
    "Грабли" это необходимая вещь и без них никому и никак! Я не думаю, что новички выбрав способ изучения такой как предлагает вы, меньше будут наступать на "грабли" и у них будет что-то лучше получаться, чем у меня!

    Специалисты писавшие макросы, по сути тоже на "грабли" наступили, да и я в месте с ними наступил! Причём не на свои, а на их "грабли"! Вот только они этого усиленно не хотят признавать, что их макросы это "грабли" для новичков, а не удобство! Они вместо этого тешат себя мыслями, о том, что мой код говно, поэтому и "сработали" "грабли", мол чуть ли не так ему и надо! :-) Ну-ну!.... продолжайте в том же духе! Сплю и вижу, что с таким отношением, те "грабли" однажды сработают на их самих и на их иделальном коде, :-) раз проблему они в макросах не видят!
  • ИЗ МОЕЙ ЛС-ПЕРЕПИСКИ:

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

    "нужно всего лишь исправить на"-
    а как тебе прозвучит фраза, что в асм-вставках-дельфи, в том моменте программы и править то ничего не нужно! :-)
  • Хотете знать что такое говнокод ?
    Установил на свою голову "Microsoft Visual Studio 10.0", теперь Дельфи7 не хочет работать так как Студия обновила какие файлы которые тоже использует Дельфи7! Это даже не говнокод, это настоящем вредительством называется! Теперь видимо придётся винду из образа раскручивать, если удаление не поможет! Нафиг мне такая "радость" :-(
  • ALEXS1983 wrote:Похоже, что разница между мной и спецами на этом форуме, в том, что я обладаю этой широтой взглядов, которая например, заключается в способе который я пробую для написания программ ("вырезания" скомпилированного кода), который спецам не приемлем, так как они "приплюснуты" своим опытом и профессионализмом и они больше чем уверенны, что так делать нельзя!
    "Спецы на этом форуме" имеют очень большой опыт программ, которые кто-то когда-то левой пяткой скомпилировал и свалил из проекта, после чего абсолютно никто не может ничего в этих программах поправить. А надо. Поэтому "спецы на этом форуме" отрицательно относятся к любым методам создания программ, которые нельзя будет поправить в случае чего.

    Вопрос: предположим, ты сделал игру своим методом, у тебя есть код для fasm, бОльшая часть которого получена копированием какого-то кода Delphi, ты выложил игру на форуме, и пользователям захотелось какую-то фичу, которой там нет. Ну, скажем, сохранение/загрузку таблицы рекордов. Или красивую картинку на фон. Или <подставить нужное из 100500 хотелок, какой-то из них наверняка ещё не реализовано>. Твои действия?
    ALEXS1983 wrote:Установил на свою голову "Microsoft Visual Studio 10.0", теперь Дельфи7 не хочет работать
    Подробнее, пожалуйста.
    Сделаем мир лучше!
  • Insolor, CleverMouse спасибо за подсказку об Offset!
    =============================================
    [quote="CleverMouse"] Вопрос: предположим, ты сделал игру своим методом, у тебя есть код для fasm, бОльшая часть которого получена копированием какого-то кода Delphi, ты выложил игру на форуме, и пользователям захотелось какую-то фичу, которой там нет. Ну, скажем, сохранение/загрузку таблицы рекордов. Или красивую картинку на фон. Или <подставить нужное из 100500 хотелок, какой-то из них наверняка ещё не реализовано>. Твои действия?[/quote]
    Я тебе попытаюсь объяснить, что ты хотя бы отчасти сама-себе противоречишь!...
    Чтобы можно было дорабатывать, нужны чёткие и понятные приёмы-передачи параметров в процедурах! Я это вижу только путём передачи через переменные или так называемые структуры, а НЕ ЧЕРЕЗ РЕГИСТРЫ ПРОЦЕССОРА И НЕ ЧЕРЕЗ СТЕК!
    Вот пример с которым я "балуюсь" и делаю пробы
    Вот такая симпатичная и нужная структура, процедуре DrawLine, которая чертит самую обычную линию....

    Type TDrawLine_ = record // для procedure DrawLine
    x1,x2, // [координата начала по оси x] [координата конца по оси x]
    y1,y2// [координата начала по оси y] [координата конца по оси y]
    :Cardinal;
    end;
    var DrawLine_Var:TDrawLine_;
    procedure DrawLine;
    .......................
    end;

    ТЕ ПРОЦЕДУРЫ ЧТО БУДУТ ВЫЗЫВАТЬ DrawLine, тоже имеют свою структуру, для того чтобы и им могли передавать данные (ну в общем ты поняла, да?!)
    Так вот, в нескольких процедурах которые вызывают DrawLine меняется всего лишь один параметр из 4-х, например только x1.
    И вот CleverMouse, увидев, что, скажем, у четырёх процедур, концовка вот такая (как по шаблону!) (ну в переводе на асм в смысле ):
    ........
    DrawLine_Var.x1:=x1;
    DrawLine_Var.x2:=DrawLineVar.posx;
    DrawLine_Var.y1:=DrawLineVar.posY;
    DrawLine_Var.y2:=DrawLineVar.posY;
    DrawLine_;
    end;

    ...первая же и будет "голосить", :-) что это стопроцентный говнокод!... что надо было через регистры или "пуши"(стек) передавать параметры... что можно бы было эти строки сделать началом процедуры DrawLine и т.д.
    Вот и получится, что можно дооптимизироваться до того, что хрен разберёшь как работает DrawLine ! Да и использовать её другими (новыми) процедурами уже не получится!
    И вот еще интересный момент, то, что напишу я (говнокод), вот таким образом, (не зависимо от языка будь-то асм или дельфи), ты CleverMouse, разобраться сможешь! А вот то, что напишешь ты, используя свои мудрости и премудрости :-) я конечно разобраться не смогу!
    Логично предположить, что код в котором ты не можешь разобраться, написал мудрец (или "мудрец") такой же как и ты, а может и похлеще! :-) С возможной мотивацией такой же как у и тебя, - главное не говнокод, главное разумное использование каждого регистрика, байтика, битика и т.д. А то, что кто-то не разберётся в коде, его не волновало!
    Отсюда я вижу такие выводы:
    Код должен быть понятен другим, а чтобы он был понятен не надо излишне "пудрится" на оптимизации, лучше лишнюю передачу параметров сделать структурам или переменным, но чтобы это было понятно, что куда и зачем передаются!
    З.Ы. Вот только не подумай, что я этим написанным защищаю свой код. Я думаю, если ты захочешь, то всё правильно поймёшь, то, что я хотел этим текстом сказать!
  • CleverMouse, пациента не спасти.
  • [quote="Ray"]CleverMouse, пациента не спасти.[/quote]
    Ага! Не спасти! Потому, что и спасать не от чего! :-)
    ==========================
    Скажите, в каких случаях, (какой размер, кол-во команд асм и т.д.) должно быть повторяющихся в коде, чтобы стояло делать ради них отдельную процедуру ?
    К примеру если в коде повторяется вот такое
    dec dword [ebx+$08]
    inc dword [ebx+$04]
    стоит ли ради этого создавать отдельную процедуру?
  • Вызов процедуры это минимум две лишние комманды: call и ret. Вот и думай.

    Я уже начинаю терять суть того, что ты хочешь сказать. Уже давным давно везде и всегда параметры в процедуру передаются через стек. И никто не смог придумать ничего лучше. Не нужно описывать, как их передавать, просто перечислить. Если ты отступаешь от этого стандарта, то кроме тебя никто не поймёт, как твои процедуры вызывать.
  • У Дельфи, довольно премудрая схема передачи/приёма параметров между функциями. :)
    (немного просматривал эту схему)
  • Думаю ещё не потеряна для использования Visual Studio 98, в каком нибудь портабельном варианте запуска.
    Интересно что код одного развивающегося проекта (DLL Scintilla от Scite редактора) скомпилировался без танцев с бубном в варианте от 2013г.
  • [quote="Kopa"]Думаю ещё не потеряна для использования Visual Studio 98, в каком нибудь портабельном варианте запуска.[/quote]
    Так это ты так только думаешь... :-) или может ссылку дашь, где можно скачать Visual Studio ЛЮБУЮ, БЕЗ "ФОКУСОВ", ОБНОВЛЕНИЙ, "ПОЛЕГЧЕ", СО ВСТРОЕННОЙ ПОМОЩЬЮ и портабельную ?
  • Who is online

    Users browsing this forum: No registered users and 10 guests