Обнаружил ошибку в FASME при генерации кода в 32-х битном режиме для следующих пар инструкций: IRET / IRETD POPA / POPAD POPF / POPFD PUSHA / PUSHAD PUSHF / PUSHFD Проблема в том, что для 16-ти разрядных вариантов этих инструкций не генерируется префикс 66h. Причем, для 16-ти разрядного режима с использованием директивы use16 все генерируется правильно.
16-ти разрядные варианты это: IRETW POPAW POPF PUSHAW PUSHFW а IRET/POPA/POPF/PUSHA/PUSHF разрядные как режим.
include 'win32axp.inc' invoke ExitProcess,<stdcall WinMain,<invoke GetModuleHandle,0>,0,\ <invoke GetCommandLine>,SW_SHOWDEFAULT> почему так нельзя, а так можно: include 'win32ax.inc' invoke ExitProcess,<stdcall WinMain,<stdcall [GetModuleHandle],0>,0,\ <invoke GetCommandLine>,SW_SHOWDEFAULT> ну и всякое в этом роде.
Privalov А планируется ли 64 битная версия? В твоем интервью читал, что она уже есть, но на сайте не нашел
Quantum S_T_A_S_ Харе оффтопить народ Лучшеб сказали, где скачать можно поглядеть. PS: Я говорил не про то интервью что на wasm'е лежит, а про новое, что тут на форуме проскакивало
Совсем народ сусбин не знает. Обидно =( http://sysbin.com/files/articles/fasm.html на форум то и кнам заходите board.sysbin.com =) Люди, а вот это чел с ником Привалов. Это такой прикол или как? =) Или сам Томаш заговорил по русски?! 8)
Он конешно сказал что говорит по русски но не очень. Поэтому все интервью бралось на англ. Так значит Привалов ты хорошо говоришь по русски?
Privalov и так еще не компилирует: Код (Text): proc test_uses_directive uses ebx esi edi ret endp но Код (Text): proc test_uses_directive uses ebx esi edi,anything_param ret endp
Спешу задать вопрос к Privalov, по поводу FASM. Я некоторое время назад отлаживал свой код ОС и столкнулся с проблемой поиска хотябы начала процедуры, в которой имею #GP. Пришлось прибегать в к просмотру BIN файла, генерируемого FASM..., тупо высматривая и высчитывая OFFSET, чтобы хоть чуть определиться, в какой процедуре это произошло (CS:EIP). Будет ли в перспективе ключ и генерация файла типа .MAP при компиляции, позволяющий ориентироваться в таких случаях? Думаю это несложно, но полезно. Спасибо!
Пробовал ты display? Код (Text): macro dispsym name { bits = 32 display 'The offset of ',`name,' is 0x' repeat bits/4 d = '0' + name shr (bits-%*4) and 0Fh if d > '9' d = d + 'A'-'9'-1 end if display d end repeat display 13,10 } dispsym start dispsym some_other_label start: xor eax,eax some_other_label:
Privalov еще хотел сказать пару слов о инструкциях типа IRET/IRETD. Да, действительно, приставка "W" работает, просто я, видимо, привык к мнемонике, используемой Intel в своих мануалах. Да и большинство отладчиков и дизассемблеров, что мне довелось увидеть используют именно такое обозначение. Может проще было бы оставить два варианта в стиле IRET/IRETD, а не три IRET/IRETW/IRETD? Или уже поздно? Может устроим голосование? Кто что думает? А сейчас о более серьезных вещах: для инструкций, где используется 16-ти битное смещение типа MOV EAX,dword [BX+0FFFFh], FASM генерирует код с 2-х байтным смещением, когда мог бы использовать один байт. Пример: MOV EAX,dword [BX+SI+0FFFFh] > 678B80FFFF когда можно было бы 678B40FF
Я выбирал IRET/IRETW/IRETD потому, что я думал, что в мануалах Intelа противоречивость - PUSH, POP и RET у Intelа разрядные как режим (в fasm есть PUSHW/POPW/RETW и PUSHD/POPD/RETD дла 16-ти и 32-ти битных вариантов), потому я сделал PUSHA, PUSHF, POPA, POPF и IRET аналогичными. А ошибка с MOV EAX,[BX+SI+0FFFFh] исправлена.