Честно говоря, не знал куда засунуть эту тему... Вот решил постепенно, точнее - постараться сразу, перейти от 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-ой. ЗЫ: Если такая тема где-нить есть, то укажите плиз, сразу не увидишь А если эта тема устарела, то разумно будет, продолжить эту _750674853__IF.rar
Шчьёрт побьери!!! Подстава... Совсем забыл, можно же так: ; .IF eax ; ; .ENDIF Простите, сразу не заметил
Vasil В исходники глянь там один проектик на фасме вообще тебя либо в шок, либов в восхищение повергнет
flat - "плоский" в смысле "прямой, ясный, определённый" PS: ИМХО - использование в ассемблере всякого рода .IF и иже с ним это нонсенс - жалкое и никчемное подобие HLL, прям AsmBasic какой-то ))
leo Ты будешь прав, если создавать маленькие проектики. Если так рассуждать, то зачем нам директивы invoke или stdcall... Согласись, что каждый делает по-своему
Не соглашусь, т.к. обычный invoke это простой и понятный макрос - известная последовательность команд push и call. А вот "необычный" масмовский invoke позволяет передавать в него непосредственно строку литералов типа "Hello, world!", что в результате превращается в какую-то отсебятину, поэтому я такой фигней никогда не пользуюсь А вот что дает .IF я вообще не понимаю
Vasil IF/ENDIF в фасме имеют бало смысла, т.к. не позволяют писать так Code (Text): .if (al>="0" && al<="9") || (al>="A" && al<="F") || (al>="a" && al<="f") || al==VK_BACK или так Code (Text): .IF ($invoke(GetProcAddress, $invoke(GetModuleHandle, OFFSET szKernel32), $CTA0("D\*ebugActiveProcessStop")))
Впринципе, макросы полезны только тогда, когда ты полностью понимаешь какой они дают код. С invoke то тут все понятно, его можно юзать, А вот всякие .IF я бы юзать не стал, т.к. привык писать без них, и не понимаю что эти ифы генерят.
leo ну обилие cmp eax,eax/je ... и test eax,eax/jz ... будут захламлять код Code (Text): .IF (BYTE PTR [esi]) == bl .IF ($invoke(CheckSignature, $invoke(GetCurrentProcess), OFFSET szKernel32, OFFSET szIsDebuggerPresent, OFFSET IsDebuggerPresentSignature, 14)) inc BYTE PTR [edi] inc ebp .ELSE invoke ErrorToLog, $CTA0(" \[Failed to apply protection against I\*sDebuggerPresent\]") .ENDIF .ENDIF
Если я пишу программы, единственный макрос, который я позволяю - struct. На мой взгляд, invoke не ускоряет существенно процесс написания программа и не делает её удобочитаемой (я привык видеть так, как в отладчике). И пусть большой проект занимает 500 и более Кб, мне всё равно. Главное, что push и call намного понятнее и удобнее для меня. Тем более что я люблю обнулять eax и затем push eax. Asterix Фигня это, читается как программа на ЯВУ. Вы мне как в классическом OllyDbg и SoftIce подавайте, а не свои грёбаные макросы ставьте. Все эти .IF,.ELSE,.ENDIF - всё лишь от лени. А я её не считаю двигателем прогресса, мне вообще свойственно писать программы, которые какой-то группе людей (например, разработчикам защит ПО) усложнят жизнь. Пока что позволяю SoftIce иметь всех вподряд, так как user-mode отладчик мне не удобен (у него GUI и извратные, идущие от Microsoft способы).
В версии Fasm 1.65.19 можно допустим писать так: @: .if (al>="0" & al<="9") | (al>="A" & al<="F") | (al>="a" & al<="f") inc esi loop @ .endif бла...бла..бла..
И чем те синтаксис не нравится!Было || стало |.Смысл то не меняется!Так даже лучше!Впрочем на вкус и цвет.......Не хочеш писать на макросах то не пиши!
это пока так нельзя. фасм на месте не стоит. Щас выйдет версия под Мас, потом версия с debug output, при этом будут происходить задокументирование всех фич. Потом когда всё это будет закончено, в версии 1.68 будут нововедения наверное... Главное надееться и верить, что Томасу это всё не надоест .
Все говорят, что у fasm'a истинно правильный синтаксис, но, когда я увидел такую строку: invoke MessageBox,0,_message,_caption,0 я был повергнут в ШОК. Какой-же это нах%р правильный синтаксис, когда в стек помещается не адрес строки, а сама строка (грубо говоря)!
Что тебе не нравится? Если пишется mov eax,<переменная> то кладётся адрес этой переменной, а если mov eax,[<переменная>] то кладётся значение по этому адресу. И всё удобно. И забудь ты ЯВУ, нах он нужен.
dead_body Где об этом можно почитать? Надо полагать, что эта версия не будет поддерживать PPC? Чем она тогда будет отличаться от линуксовой версии? Случайно обнаружил, что PureBasic использует фасм для компиляции кода
mix_mix Это всего лишь макросы, использовать их тебя никто не заставляет. Это первое. Под правильным синтаксисом имелся ввиду синтаксис ассемблера. Это второе. И не ругайся - это третье.
Программу, написанную с использованием .if(a >='0' || a<='9'), invoke(invoke(...),"xxx"), трудно назвать написанной на языке ассемблера. Даже не задумываясь об оптимизации, сам ты напишешь код куда лутьше, чем сделает это компилятор. Чем она лутьше программы, написанной на си, в смысле полного понимания её работы? В ней нет той гибкости, изящества и силы языка Ассемблера. Лично я предпочитаю знать: где, что и когда. А макросы использую только свои (для построения сложных структур данных), и простые стандартные.