Блоки .IF в FASM

Discussion in 'WASM.ASSEMBLER' started by Vasil, May 7, 2006.

  1. Vasil

    Vasil Василь

    Blog Posts:
    0
    Честно говоря, не знал куда засунуть эту тему...



    Вот решил постепенно, точнее - постараться сразу, перейти от MASM к FASM. Подумал я, FASM - вещь. Но наткнулся на такую проблему, от которой я упал!!!



    1. В FASM нет обычной замены:

    ; .IF eax <> 0

    ; test eax, eax

    ; jz _ENDIF

    ; В MASM'e и то продумали дурацкий or eax, eax :)

    2. В масме я использовал верхний регистр, а не нижний:

    ; .IF .ELSEIF .ELSE .ENDIF .WHILE .REPEAT .........



    В итоге вот что получилось (см. аттач)...

    Буду очень признателен тем, кто найдёт какой-нить косяк :)

    Меня пока смущает 14 строчек нач. с 451-ой.



    ЗЫ: Если такая тема где-нить есть, то укажите плиз, сразу не увидишь :) А если эта тема устарела, то разумно будет, продолжить эту ;)



    [​IMG] _750674853__IF.rar
     
  2. Vasil

    Vasil Василь

    Blog Posts:
    0
    Шчьёрт побьери!!! Подстава...

    Совсем забыл, можно же так:

    ; .IF eax

    ;

    ; .ENDIF



    Простите, сразу не заметил :)
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Blog Posts:
    0
    Vasil

    В исходники глянь там один проектик на фасме вообще тебя либо в шок, либов в восхищение повергнет
     
  4. Vasil

    Vasil Василь

    Blog Posts:
    0
    FASM - оправдывает своё название "плоский", прям как в юморе: "Плоские шутки" :)
     
  5. leo

    leo Active Member

    Blog Posts:
    0
    flat - "плоский" в смысле "прямой, ясный, определённый"

    PS: ИМХО - использование в ассемблере всякого рода .IF и иже с ним это нонсенс - жалкое и никчемное подобие HLL, прям AsmBasic какой-то :)))
     
  6. Vasil

    Vasil Василь

    Blog Posts:
    0
    leo

    Ты будешь прав, если создавать маленькие проектики.

    Если так рассуждать, то зачем нам директивы invoke или stdcall...



    Согласись, что каждый делает по-своему ;)
     
  7. leo

    leo Active Member

    Blog Posts:
    0
    Не соглашусь, т.к. обычный invoke это простой и понятный макрос - известная последовательность команд push и call. А вот "необычный" масмовский invoke позволяет передавать в него непосредственно строку литералов типа "Hello, world!", что в результате превращается в какую-то отсебятину, поэтому я такой фигней никогда не пользуюсь

    А вот что дает .IF я вообще не понимаю
     
  8. Asterix

    Asterix New Member

    Blog Posts:
    0
    Vasil



    IF/ENDIF в фасме имеют бало смысла, т.к. не позволяют писать

    так
    Code (Text):
    1. .if (al>="0" && al<="9") || (al>="A" && al<="F") || (al>="a" && al<="f") || al==VK_BACK


    или так
    Code (Text):
    1. .IF ($invoke(GetProcAddress, $invoke(GetModuleHandle, OFFSET szKernel32), $CTA0("D\*ebugActiveProcessStop")))
     
  9. Ms Rem

    Ms Rem New Member

    Blog Posts:
    0
    Впринципе, макросы полезны только тогда, когда ты полностью понимаешь какой они дают код. С invoke то тут все понятно, его можно юзать, А вот всякие .IF я бы юзать не стал, т.к. привык писать без них, и не понимаю что эти ифы генерят.
     
  10. Asterix

    Asterix New Member

    Blog Posts:
    0
    leo





    ну обилие cmp eax,eax/je ... и test eax,eax/jz ... будут захламлять код


    Code (Text):
    1. .IF (BYTE PTR [esi]) == bl
    2.    .IF ($invoke(CheckSignature, $invoke(GetCurrentProcess), OFFSET szKernel32, OFFSET szIsDebuggerPresent, OFFSET IsDebuggerPresentSignature, 14))
    3.       inc BYTE PTR [edi]
    4.       inc ebp
    5.    .ELSE
    6.       invoke ErrorToLog, $CTA0(" \[Failed to apply protection against I\*sDebuggerPresent\]")
    7.    .ENDIF
    8. .ENDIF
     
  11. NullSessi0n

    NullSessi0n New Member

    Blog Posts:
    0
    Если я пишу программы, единственный макрос, который я позволяю - struct. На мой взгляд, invoke не ускоряет существенно процесс написания программа и не делает её удобочитаемой (я привык видеть так, как в отладчике). И пусть большой проект занимает 500 и более Кб, мне всё равно. Главное, что push и call намного понятнее и удобнее для меня. Тем более что я люблю обнулять eax и затем push eax.

    Asterix

    Фигня это, читается как программа на ЯВУ. Вы мне как в классическом OllyDbg и SoftIce подавайте, а не свои грёбаные макросы ставьте. Все эти .IF,.ELSE,.ENDIF - всё лишь от лени. А я её не считаю двигателем прогресса, мне вообще свойственно писать программы, которые какой-то группе людей (например, разработчикам защит ПО) усложнят жизнь. Пока что позволяю SoftIce иметь всех вподряд, так как user-mode отладчик мне не удобен (у него GUI и извратные, идущие от Microsoft способы).
     
  12. Nata

    Nata New Member

    Blog Posts:
    0
    В версии Fasm 1.65.19 можно допустим писать так:

    @:

    .if (al>="0" & al<="9") | (al>="A" & al<="F") | (al>="a" & al<="f")

    inc esi

    loop @

    .endif

    бла...бла..бла..
     
  13. Asterix

    Asterix New Member

    Blog Posts:
    0
    Nata

    синтаксис | вместо || и & вместо && и <> вместо != роднит фасм с убогим VB или паскалем
     
  14. Nata

    Nata New Member

    Blog Posts:
    0
    И чем те синтаксис не нравится!Было || стало |.Смысл то не меняется!Так даже лучше!Впрочем на вкус и цвет.......Не хочеш писать на макросах то не пиши!
     
  15. dead_body

    dead_body wasm.ru

    Blog Posts:
    0




    это пока так нельзя. фасм на месте не стоит. Щас выйдет версия под Мас, потом версия с debug output, при этом будут происходить задокументирование всех фич.

    Потом когда всё это будет закончено, в версии 1.68 будут нововедения наверное...

    Главное надееться и верить, что Томасу это всё не надоест :).
     
  16. mix_mix

    mix_mix Михаил

    Blog Posts:
    0
    Все говорят, что у fasm'a истинно правильный синтаксис, но, когда я увидел такую строку:

    invoke MessageBox,0,_message,_caption,0

    я был повергнут в ШОК. Какой-же это нах%р правильный синтаксис, когда в стек помещается не адрес строки, а сама строка (грубо говоря)!
     
  17. NullSessi0n

    NullSessi0n New Member

    Blog Posts:
    0
    Что тебе не нравится? Если пишется

    mov eax,<переменная>

    то кладётся адрес этой переменной, а

    если

    mov eax,[<переменная>]

    то кладётся значение по этому адресу. И всё удобно. И забудь ты ЯВУ, нах он нужен.
     
  18. Quantum

    Quantum Паладин дзена

    Blog Posts:
    0
    dead_body



    Где об этом можно почитать? Надо полагать, что эта версия не будет поддерживать PPC? Чем она тогда будет отличаться от линуксовой версии?



    Случайно обнаружил, что PureBasic использует фасм для компиляции кода :)
     
  19. IceStudent

    IceStudent Active Member

    Blog Posts:
    0
    mix_mix

    Это всего лишь макросы, использовать их тебя никто не заставляет. Это первое. Под правильным синтаксисом имелся ввиду синтаксис ассемблера. Это второе. И не ругайся - это третье.
     
  20. dinoweb

    dinoweb Дмитрий

    Blog Posts:
    0
    Программу, написанную с использованием .if(a >='0' || a<='9'), invoke(invoke(...),"xxx"), трудно назвать написанной на языке ассемблера. Даже не задумываясь об оптимизации, сам ты напишешь код куда лутьше, чем сделает это компилятор. Чем она лутьше программы, написанной на си, в смысле полного понимания её работы? В ней нет той гибкости, изящества и силы языка Ассемблера. Лично я предпочитаю знать: где, что и когда. А макросы использую только свои (для построения сложных структур данных), и простые стандартные.