Автор
|
Тема: ошибка компиляции
|
Maaniv |
опубликован 19-09-2001 02:23 MSK
В проге есть строки 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 !!! Меня этот глюк бесит - если кто знает как от него избавиться - напишите, плииииииз.
|
Organic
|
опубликован 22-09-2001 16:20 MSK
а ты так и вызывай функцию, как она компилируется, и правь стек сам.. тока вот я чё-то не припомню, чтоб push ds заносила в стек 4 байта... ds вроде как всегда был в два байта толщиной. |
Maaniv
|
опубликован 23-09-2001 01:33 MSK
Это понятно, но хотелось точно узнать (прописывать каждую такую функцию лень). А носчет 4-х байт это точно - все время нарушение стека вываливалось, вот такая лажа.... |
NKritsky
|
опубликован 24-09-2001 14:12 MSK
При исполнении 32-битного кода команда push ds заносит в стек dword, старшие 16 бит которого это 0, а младшие - ds. Это абсолютно чётко документировано в мануалах интела. Проблема с компилятором, тот мудак что его писал не прочитал в своё время документацию по процу, вот и выходит фигня. Мой совет такой: либо смени компилятор, либо каждый раз когда даёшь функции 16-битный аргумент в 32-битном коде, оформляй его как 32-разрядный. В TASM'е для этого используется префикс LONG, в MASM'е не знаю. Можешь попробовать обмануть компилятор чем-то вроде "000000000h OR ds" или "011111111h AND ds" , может и получится :) |
Maaniv
|
опубликован 27-09-2001 01:27 MSK
Все ясно, видимо Borland облажался, ну ладно одним тактом больше, одним меньше - неважно, придется сначало ds в ax засовывать, а потом уж и в стек (рчками писать все равно лень...), но все равно за участие спасибо !!!! |
Organic
|
опубликован 30-09-2001 10:21 MSK
тьфу блин, внатуре. тут же 32 код используется:))) а ты попробуй перевести компиляцию в 16 битный код! для этого напиши так:db 66h ; префикс замены операнда push ds должно сработать, хотя уже давно так не пробовал, может уже не работает;))))
|