Для компилятора это смещение бессмысленно, так как он не может определить дефолтный сегмент. Ему нужно помочь: mov ecx,dword ptr cs:[12345678h]
kejcerfcrv Зачем его определять, если дефолтный сегмент и так для каждой инструкции официальной документацией определён? В данном случае компилятор просто обязан сгенерировать инструкцию с дефолтным сегментом (т.е. ds).
kejcerfcrv То, что это так, не означает, что это правильное поведение, и формат инструкции здесь не причём. Есть документация, определяющая, как правильно интерпретировать аргументы инструкции по-умолчанию: Т.е. переопределение есть переопределение, а по-умолчанию должен быть ds без всяких подсказок. А уж преобразовывать явно указанное обращение к памяти mov ecx, dword ptr [12345678h] в immediate value mov ecx, 12345678h — очевидный ляп, недостойный оправдания.
l_inc То что вы не согласны с этим не означает что я не знаю про дефолтные сегменты камня, у меня знаетели двигатель есть для сей задачи - SDE. Сегмент должен быть чётко определён. То что не IA синтаксис это понятно. Для обращения к памяти нужно знать сегмент. Без сегмента инструкция превращается в загрузку смещения, это и делает компилятор. Вы ведь не говорите ничего про Lea.
Спасибо за ответы, да, действительно mov ecx,dword ptr ds:[12345678h] работает Но все таки это какое то западло, ни варнингов, ни ошибок, очень фигово при копировании кода из ida, можно не заметить. Подавляющее большинство дизассемблеров выводят код именно как mov ecx,dword ptr [12345678h]. В OllyDbg есть опция, чтобы показывать дефолтные сегменты в коде, а вот в ida не нашел, никто не в курсе?