Чем отличается call X от call ds:X ??

Тема в разделе "WASM.BEGINNERS", создана пользователем shob_vas, 10 дек 2007.

  1. shob_vas

    shob_vas New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2007
    Сообщения:
    3
    Все никак не могу понять, чем отличются команды
    call X
    и
    call ds:X

    На что показывает ds?
     
  2. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Ничем по сути. Адресация понимается как "сегмент:смещение".
    DS - Data Segment, хранит в себе селектор сегмента данных. Если не указано явно, по умолчанию считается, что сегмент DS.
    RTFM wasm.ru/publist.php?list=24
     
  3. d51

    d51 New Member

    Публикаций:
    0
    Регистрация:
    4 ноя 2007
    Сообщения:
    17
    ответ может быть не полным сори сам недавно учу
    В старых моделях памяти до 32 разрядных виндов
    ds это сегментный регистр в современных виндах
    модель памяти плоская cмоти заголовок файла asm
    .586
    .model flat,stdcall ---flat это плоская модель памяти
    option casemap:none
    .......................
    для прикладного програмиста это означает что
    между call XXX и сall ds:XXXX разницы нет
    другое дело если приходится работать с разными процессами
    в этом случае приходится учитывать значение этого регистра
    в разных процесах он разный.Почитай о моделях памяти например
    В уроках Iczelion'a

    удачи d51
     
  4. shob_vas

    shob_vas New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2007
    Сообщения:
    3
    а как записать что то в ds или считать?
    ds это часть edi или нет? или это отдельный регистр? сколько в ds бит?
     
  5. shob_vas

    shob_vas New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2007
    Сообщения:
    3
    понятно... то есть если call X попадает туда куда надо, то можно считать, что это еквивалентно записи call ds:X? там никакой подставы с какими нибудь данными нет?
     
  6. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Фактически да. Вообще, на эту тему почитай Пирогова или еще лучше мануал Интела.
     
  7. HoBleen

    HoBleen New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    77
    call X эквивалентен call cs:X (команды, связанные с EIP по умолчанию связывают данные с сегментным регистром CS).
    В общем случае call X = call cs:X != call ds:X, потому что это будут разные ВИРТУАЛЬНЫЕ адреса. Но в винде база cs = базе ds, так что ЛИНЕЙНЫЕ адреса будут одинаковые.

    [added]
    Упс, не заметил, уже сказали...
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    часть edi это di. а Ds это сегментный регистр 16битный
     
  9. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    call X = Call cs:X
    Call ds:x = Call ds:x
     
  10. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    ...ну да, сорри, ступил в #2
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    и ведь даже не поспоришь ;)
     
  12. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    shob_vas
    Приведи реальный пример, что идёт на месте X, т.к. от контекста очень зависит использование сегментных регистров.