Память

Discussion in 'WASM.BEGINNERS' started by Linkey, Jan 24, 2010.

  1. PSR1257

    PSR1257 New Member

    Blog Posts:
    0
    Joined:
    Nov 30, 2008
    Messages:
    933
    JCronuz

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

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    Для кого недостаток, а для кого достоинство.
    Code (Text):
    1.   mov eax,var
    2.   mov eax,[var]
    Думаю, "смысловая разница" вполне очевидна :)
     
  3. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    ...особенно если учесть полное внешнее соответствие этих записей следующим записям:
    Code (Text):
    1.   mov eax,400000h
    2.   mov eax,[400000h]
     
  4. JCronuz

    JCronuz New Member

    Blog Posts:
    0
    Joined:
    Sep 26, 2007
    Messages:
    1,240
    Location:
    Russia
    PSR1257 Была тема на васме, про опкод mov es:ds:cs:[eax], reg32
     
  5. JCronuz

    JCronuz New Member

    Blog Posts:
    0
    Joined:
    Sep 26, 2007
    Messages:
    1,240
    Location:
    Russia
    http://wasm.ru/forum/viewtopic.php?id=25301
     
  6. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    Twister
    Необходимо указать сегментный регистр явно, дабы не забыли про сегментацию и что адрес является смещением в сегменте, собственно в чём и вопрос заключается. Сегмент кода я выбрал просто так.
     
  7. PSR1257

    PSR1257 New Member

    Blog Posts:
    0
    Joined:
    Nov 30, 2008
    Messages:
    933
    JCronuz

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

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

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

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

    mov gs:fs:[0],eax

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

    PSR1257 New Member

    Blog Posts:
    0
    Joined:
    Nov 30, 2008
    Messages:
    933
    ... Мда, проверил - ничего интересного. Невалидные в контексте команды префиксы просто пропускаются CPU.
     
  9. max7C4

    max7C4 New Member

    Blog Posts:
    0
    Joined:
    Mar 17, 2008
    Messages:
    1,203
    а с какой стати она на стадии дешифровки команды должна выполняться. она будет выполняться уже после.
     
  10. PSR1257

    PSR1257 New Member

    Blog Posts:
    0
    Joined:
    Nov 30, 2008
    Messages:
    933
    max7C4

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

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    а это мое имхо (не будем разжигать холивар):
    в масме это одно и тоже,

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

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

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    ничто не проходит бесследно - навыки продвинутого кода(читать писать в сегмент кода) вошли в привычку ... :))
     
  13. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    Разница видна из самих мнемоник. Кроме того, fasm как раз эту разницу подчеркивает.
    Code (Text):
    1.   mov eax,var
    2.   lea eax,[var]
     
  14. Rockphorr

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    Опять же только мое имхо:
    квадратные скобки lea ненужны она со значениями не работает, а в данном случае
    читается как "загрузить адрес значения лежащего по указанному адресу" - тавтология и избыточность - загрузить указанный адрес намного естественнее,
    короче - мне его концепция соглашений просто не по вкусу - но она вполне имеет право на существование
     
  15. max7C4

    max7C4 New Member

    Blog Posts:
    0
    Joined:
    Mar 17, 2008
    Messages:
    1,203
    Phantom_84
    +1, к тому же lea r32, dword ptr address выглядит глупо т.к. адрес ни как не связан с размером располагаемых там данных, а tasm и masm (если мне не изменяет память) ни за что не переварят lea r32, var (имея ввиду без указания dword ptr), если var определена не как dd
     
  16. cornolio

    cornolio New Member

    Blog Posts:
    0
    Joined:
    Apr 16, 2009
    Messages:
    50
    не нормально собирает и без dword ptr, но тут как говорится на вкус и цвет)
     
  17. max7C4

    max7C4 New Member

    Blog Posts:
    0
    Joined:
    Mar 17, 2008
    Messages:
    1,203
    cornolio
    а компилируется команда lea или mov
     
  18. cornolio

    cornolio New Member

    Blog Posts:
    0
    Joined:
    Apr 16, 2009
    Messages:
    50
    Code (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 Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    Rockphorr
    Именно. Читать память желательно из сегмента кода. Обычно это и удобнее(например код после смены кпл).
     
  20. JCronuz

    JCronuz New Member

    Blog Posts:
    0
    Joined:
    Sep 26, 2007
    Messages:
    1,240
    Location:
    Russia
    Rockphorr
    :)
    Code (Text):
    1. @ equ OFFSET
    2. mov eax, @ str