Память

Тема в разделе "WASM.BEGINNERS", создана пользователем Linkey, 24 янв 2010.

  1. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    JCronuz

    Кстати, известно что проц скипует все замены сегмента кроме последнего. Но вот _проверяет_ ли он их при этом (в контексте конкретной команды конечно)? - пришла такая мысль.
     
  2. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Для кого недостаток, а для кого достоинство.
    Код (Text):
    1.   mov eax,var
    2.   mov eax,[var]
    Думаю, "смысловая разница" вполне очевидна :)
     
  3. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    ...особенно если учесть полное внешнее соответствие этих записей следующим записям:
    Код (Text):
    1.   mov eax,400000h
    2.   mov eax,[400000h]
     
  4. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    PSR1257 Была тема на васме, про опкод mov es:ds:cs:[eax], reg32
     
  5. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    http://wasm.ru/forum/viewtopic.php?id=25301
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Twister
    Необходимо указать сегментный регистр явно, дабы не забыли про сегментацию и что адрес является смещением в сегменте, собственно в чём и вопрос заключается. Сегмент кода я выбрал просто так.
     
  7. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    JCronuz

    Не, я имел в виду несколько иное:

    Допустим, команда mov gs:[0],eax вызывает исключение из-за запрещения модификации памяти на данном уровне привилегий.

    Однако команда mov fs:[0],eax НЕ вызывает никаких проблем при выполнении (допусти, типа установки SEH).

    Но что же будет при выполнении команды:

    mov gs:fs:[0],eax

    ? По одной логике "gs:" скипается и не имеет никакого значения валидный он или нет, но с другой стороны почему эта проверка должна пропускаться?...
     
  8. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    ... Мда, проверил - ничего интересного. Невалидные в контексте команды префиксы просто пропускаются CPU.
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а с какой стати она на стадии дешифровки команды должна выполняться. она будет выполняться уже после.
     
  10. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    max7C4

    Ну проверить-то не помешает :)
     
  11. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    а это мое имхо (не будем разжигать холивар):
    в масме это одно и тоже,

    а фасмовский mov eax,var стирает принципиальную границу между mov и lea что вызывает путаницу,

    в масме огромный по количеству букв OFFSET в сочетании с mov акцентирует внимание на том что смысл изменился
     
  12. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    ничто не проходит бесследно - навыки продвинутого кода(читать писать в сегмент кода) вошли в привычку ... :))
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Разница видна из самих мнемоник. Кроме того, fasm как раз эту разницу подчеркивает.
    Код (Text):
    1.   mov eax,var
    2.   lea eax,[var]
     
  14. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    Опять же только мое имхо:
    квадратные скобки lea ненужны она со значениями не работает, а в данном случае
    читается как "загрузить адрес значения лежащего по указанному адресу" - тавтология и избыточность - загрузить указанный адрес намного естественнее,
    короче - мне его концепция соглашений просто не по вкусу - но она вполне имеет право на существование
     
  15. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Phantom_84
    +1, к тому же lea r32, dword ptr address выглядит глупо т.к. адрес ни как не связан с размером располагаемых там данных, а tasm и masm (если мне не изменяет память) ни за что не переварят lea r32, var (имея ввиду без указания dword ptr), если var определена не как dd
     
  16. cornolio

    cornolio New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2009
    Сообщения:
    50
    не нормально собирает и без dword ptr, но тут как говорится на вкус и цвет)
     
  17. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    cornolio
    а компилируется команда lea или mov
     
  18. cornolio

    cornolio New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2009
    Сообщения:
    50
    Код (Text):
    1. .data
    2. tmp db 0
    3. .code
    4. lea eax, tmp
    5.  
    6. 00401000 >/$ 8D05 00204000  LEA EAX,DWORD PTR DS:[402000]
    все верно собирает ml.exe 9.0.30729.1
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Rockphorr
    Именно. Читать память желательно из сегмента кода. Обычно это и удобнее(например код после смены кпл).
     
  20. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Rockphorr
    :)
    Код (Text):
    1. @ equ OFFSET
    2. mov eax, @ str