JCronuz Кстати, известно что проц скипует все замены сегмента кроме последнего. Но вот _проверяет_ ли он их при этом (в контексте конкретной команды конечно)? - пришла такая мысль.
Для кого недостаток, а для кого достоинство. Код (Text): mov eax,var mov eax,[var] Думаю, "смысловая разница" вполне очевидна
...особенно если учесть полное внешнее соответствие этих записей следующим записям: Код (Text): mov eax,400000h mov eax,[400000h]
Twister Необходимо указать сегментный регистр явно, дабы не забыли про сегментацию и что адрес является смещением в сегменте, собственно в чём и вопрос заключается. Сегмент кода я выбрал просто так.
JCronuz Не, я имел в виду несколько иное: Допустим, команда mov gs:[0],eax вызывает исключение из-за запрещения модификации памяти на данном уровне привилегий. Однако команда mov fs:[0],eax НЕ вызывает никаких проблем при выполнении (допусти, типа установки SEH). Но что же будет при выполнении команды: mov gs:fs:[0],eax ? По одной логике "gs:" скипается и не имеет никакого значения валидный он или нет, но с другой стороны почему эта проверка должна пропускаться?...
... Мда, проверил - ничего интересного. Невалидные в контексте команды префиксы просто пропускаются CPU.
а с какой стати она на стадии дешифровки команды должна выполняться. она будет выполняться уже после.
а это мое имхо (не будем разжигать холивар): в масме это одно и тоже, а фасмовский mov eax,var стирает принципиальную границу между mov и lea что вызывает путаницу, в масме огромный по количеству букв OFFSET в сочетании с mov акцентирует внимание на том что смысл изменился
ничто не проходит бесследно - навыки продвинутого кода(читать писать в сегмент кода) вошли в привычку ... )
Разница видна из самих мнемоник. Кроме того, fasm как раз эту разницу подчеркивает. Код (Text): mov eax,var lea eax,[var]
Опять же только мое имхо: квадратные скобки lea ненужны она со значениями не работает, а в данном случае читается как "загрузить адрес значения лежащего по указанному адресу" - тавтология и избыточность - загрузить указанный адрес намного естественнее, короче - мне его концепция соглашений просто не по вкусу - но она вполне имеет право на существование
Phantom_84 +1, к тому же lea r32, dword ptr address выглядит глупо т.к. адрес ни как не связан с размером располагаемых там данных, а tasm и masm (если мне не изменяет память) ни за что не переварят lea r32, var (имея ввиду без указания dword ptr), если var определена не как dd
Код (Text): .data tmp db 0 .code lea eax, tmp 00401000 >/$ 8D05 00204000 LEA EAX,DWORD PTR DS:[402000] все верно собирает ml.exe 9.0.30729.1
Rockphorr Именно. Читать память желательно из сегмента кода. Обычно это и удобнее(например код после смены кпл).