верхнее и нижнее слово

Тема в разделе "WASM.BEGINNERS", создана пользователем devillsd, 21 май 2008.

  1. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    например wParam = bbbb|cccch
    где здесь нижнее слово, а где здесь верхнее слово???
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    если ты просто сORишь оба этих числа, то верхнее слово будет 0 а нижнее результат выражения (bbbb|cccc)

    Вообще, если у тебя есть число XXYYZZQQ, то в памяти оно лежит как
    QQ ZZ YY XX.
    Старшая часть (high word) здесь это XXYY, а младшая ZZQQ.
    Такой способ хранения называется Little-Endian, потому как сначала идет самый младший байт (QQ), а потом по старшинству. к самому "верхнему", как ты выразился
     
  3. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Поставлю вопрос по другому, потомучто ещё немного не допонял...
    Пример
    Факт что:
    Нижнее слово wParam содержит ID_MENU or ID_CONTROL
    Верхнее слово wParam содержит 0 в случае с меню и код уведомления в случае с контролом
    когда мы проверяем меню ли это
    Когда мы проверяем wParam на ID_MENU
    мы пишем
    mov eax,wParam
    .IF ax==IDM_???///тут мы отсекаем 16 бит

    выходит что eax это нижнее слово а ax верхнее??
    Или в чём фишка?
     
  4. JamesB

    JamesB New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2008
    Сообщения:
    66
    ax - это младшее слово eax
    al - младший байт ax, ah - старший байт eax
    старшее слово eax получить можно битовым сдвигом вправо на 16 бит
    shr eax, 16
    тогда старшее слово сдвинется "на младшее", а что там было затрется нулями
    вот тебе картинка
    [​IMG]
    тоже самое с ebx, ecx, edx.
    почти тоже самое с остальными. НО это все только на 32-битных платформах)

    нет., читай выше
     
  5. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Почему нет, младшее слово ax
    мы занесли wParam в еax, а проверяем только ax,по факту мы отсекаем Старшее слово и оставляем только младшее...почему НЕТ???
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да, AX это младшее слово EAX'а
    Но старшее его слово напрямую недоступно - см. картинку.

    mov eax, wParam
    mov ebx, eax
    shr ebx, 16
    ; теперь ax - младшее слово wParam, bx - старшее
     
  7. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    mov eax,lParam
    and eax,0ffffh

    Теперь в eax верхнее слово IParam ? а как лучшее shr или and ?
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    У-у-ф..
    IParam = LoWord+HiWord*2^16
    LoWord = LParam and 0FFFFh //зануляем HiWord, остается только LoWord
    HiWord = IParam shr 16 //сдвинаем на 16 бит = делим на 2^16, LoWord "исчезает", остается HiWord
    Пример:
    LParam = 87654321h
    LoWord = 00004321h
    HiWord = 00008765h
     
  9. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    пасибо :) ТЕПЕРЬ всё понятно..
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    нижнее =\
    and и shr мало чего общего имеют.
    как раз and FFFF выделит нижнее слово, а shr на 16 бит выделит верхнее