Короче, без параметров шлюз работает. С параметрами в стэке - нет. Хотя ВРОДЕ всё правильно. Плиз, посмотрите.
А почему у тебя лимит сегмента стэка - 0+ты используешь его как expand down? Может в этом дело? (hStack.Flags1=10010010b)
iloq - нет, не в этом дело. Попробывал не помогло. Лимит = 0, сегмент расширяется вниз. Значит доступные смещения от 0 до FFFF(сегмент 16-битный). Тем более, что не зависимо от того, использую я параметры или нет, стек используется для размещения адреса возврата.
Насколько я знаю, у шлюзов прерываний и ловушек просто нет параметров в стеке Это поле в дескрипторе всегда должно быть 0. А параметры есть только у шлюзов вызова.
Ты бы не мог выложить в каком-нибудь другом формате, например, бинарном? Я Masm очень туго понимаю, а посмотреть хотелось бы . Кстати, а как именно не работает? Виснет? Перезагружается? На реальной машине или в эмуляторе? И в каком (примерно) месте? Навскидку: если проблема возникает именно при вызове с параметрами, то, скорее всего, что-то не так со стеком. Если места в стеке не хватает, то процессор выдает особый случай стека. М.б. ты не учел, что поле WC -- количество двойных слов, а не байт?
Я в код сначала не посмотрел, только на название темы. По делу - не знаю, сложно там у тебя всё.. Может упростить для начала? Что сразу вызывает подозрения - в GDT три сегмента стека, а настраиваешь ты только один. Остальные не используются или они сразу готовы?
Попробовал вызывать с параметрами, получилось. Возможно, нашёл, где у тебя ошибка. Код (Text): Draw PROC ; MOV EBP, ESP ; MOV DX, SEL_VIDEO ; MOV ES, DX ; MOV DI, [EBP+8] ; MOV AX, [EBP+6] ; MOV ES:[DI], AX RET Draw ENDP Адрес возврата CS:EIP занимает в стеке не 6, а 8 байт. Причём у меня получилось, что при передаче правления через 32-х разрядный шлюз это всегда так, независимо от разрядности сегмента кода и стека. Кстати, размер "одного" параметра у меня получился 4 байта - опять же независимо ни от чего. Да, и, там в конце конечно должно быть ret 4.
RET 4 - это как в паскале, стек освобождает вызывающая процедура. А я, дурак, думал, что как в C - кто вызвал, тот стек и подчищает. Спасибо, sergh!