Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.12.172] |
|
Сообщ.
#1
,
|
|
|
В проге есть строки
IDEAL P486 LOCALS $$ MODEL USE32 LARGE C ....... ....... call File_Read C, [$Handle], 4, OFFSET Buf, ds ....... ....... при компиляции получаем PUSH ds PUSH OFFSET Buf PUSH 4 PUSH [$Handle] CALL File_Read ADD ESP,00000000Eh то есть из стека вынимаем 14 байт, но в защищенном режиме - при записи ds в стек помещается 4 байта, то есть всего - 16 !!! Меня этот глюк бесит - если кто знает как от него избавиться - напишите, плииииииз. |
Сообщ.
#2
,
|
|
|
а ты так и вызывай функцию, как она компилируется, и правь стек сам.. тока вот я чё-то не припомню, чтоб push ds заносила в стек 4 байта... ds вроде как всегда был в два байта толщиной.
|
Сообщ.
#3
,
|
|
|
Это понятно, но хотелось точно узнать (прописывать каждую такую функцию лень). А носчет 4-х байт это точно - все время нарушение стека вываливалось, вот такая лажа....
|
Сообщ.
#4
,
|
|
|
При исполнении 32-битного кода команда push ds заносит в стек dword, старшие 16 бит которого это 0, а младшие - ds. Это абсолютно чётко документировано в мануалах интела. Проблема с компилятором, тот мудак что его писал не прочитал в своё время документацию по процу, вот и выходит фигня.
Мой совет такой: либо смени компилятор, либо каждый раз когда даёшь функции 16-битный аргумент в 32-битном коде, оформляй его как 32-разрядный. В TASM'е для этого используется префикс LONG, в MASM'е не знаю. Можешь попробовать обмануть компилятор чем-то вроде "000000000h OR ds" или "011111111h AND ds" , может и получится |
Сообщ.
#5
,
|
|
|
Все ясно, видимо Borland облажался, ну ладно одним тактом больше, одним меньше - неважно, придется сначало ds в ax засовывать, а потом уж и в стек (рчками писать все равно лень...), но все равно за участие спасибо !!!!
|
Сообщ.
#6
,
|
|
|
тьфу блин, внатуре. тут же 32 код используется:))) а ты попробуй перевести компиляцию в 16 битный код! для этого напиши так:
db 66h ; префикс замены операнда push ds должно сработать, хотя уже давно так не пробовал, может уже не работает;)))) |