Параметры в стэке и шлюзы прерывания

Тема в разделе "WASM.ASSEMBLER", создана пользователем C0DiCK, 16 июл 2006.

  1. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    Короче, без параметров шлюз работает.
    С параметрами в стэке - нет. Хотя ВРОДЕ всё правильно.
    Плиз, посмотрите.
     
  2. iloq

    iloq New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    10
    А почему у тебя лимит сегмента стэка - 0+ты используешь его как expand down? Может в этом дело? (hStack.Flags1=10010010b)
     
  3. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    iloq - нет, не в этом дело. Попробывал не помогло. Лимит = 0, сегмент расширяется вниз. Значит доступные смещения от 0 до FFFF(сегмент 16-битный). Тем более, что не зависимо от того, использую я параметры или нет, стек используется для размещения адреса возврата.
     
  4. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Насколько я знаю, у шлюзов прерываний и ловушек просто нет параметров в стеке :) Это поле в дескрипторе всегда должно быть 0. А параметры есть только у шлюзов вызова.
     
  5. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    Шлюз прерывания - 1110b
    Шлюз ловушки - 1111b
    У меня - 1100b
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ты бы не мог выложить в каком-нибудь другом формате, например, бинарном? Я Masm очень туго понимаю, а посмотреть хотелось бы :dntknw:.

    Кстати, а как именно не работает? Виснет? Перезагружается? На реальной машине или в эмуляторе? И в каком (примерно) месте?

    Навскидку: если проблема возникает именно при вызове с параметрами, то, скорее всего, что-то не так со стеком. Если места в стеке не хватает, то процессор выдает особый случай стека. М.б. ты не учел, что поле WC -- количество двойных слов, а не байт?
     
  7. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Я в код сначала не посмотрел, только на название темы.
    По делу - не знаю, сложно там у тебя всё.. Может упростить для начала?

    Что сразу вызывает подозрения - в GDT три сегмента стека, а настраиваешь ты только один. Остальные не используются или они сразу готовы?
     
  8. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    Сразу готовы - чтоб не заморачиваться сильно.
     
  9. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Попробовал вызывать с параметрами, получилось. Возможно, нашёл, где у тебя ошибка.

    Код (Text):
    1. Draw    PROC
    2. ;   MOV EBP, ESP
    3. ;   MOV DX, SEL_VIDEO
    4. ;   MOV ES, DX
    5. ;   MOV DI, [EBP+8]
    6. ;   MOV AX, [EBP+6]
    7. ;   MOV ES:[DI], AX
    8.  
    9.     RET
    10. Draw    ENDP
    Адрес возврата CS:EIP занимает в стеке не 6, а 8 байт. Причём у меня получилось, что при передаче правления через 32-х разрядный шлюз это всегда так, независимо от разрядности сегмента кода и стека. Кстати, размер "одного" параметра у меня получился 4 байта - опять же независимо ни от чего.

    Да, и, там в конце конечно должно быть ret 4.
     
  10. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    RET 4 - это как в паскале, стек освобождает вызывающая процедура. А я, дурак, думал, что как в C - кто вызвал, тот стек и подчищает. Спасибо, sergh!