WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  ASM
  ошибка компиляции

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   ошибка компиляции
Maaniv опубликован 19-09-2001 02:23 MSK   Click Here to See the Profile for Maaniv   Click Here to Email Maaniv  
В проге есть строки
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     Click Here to See the Profile for Organic  Click Here to Email Organic     
а ты так и вызывай функцию, как она компилируется, и правь стек сам.. тока вот я чё-то не припомню, чтоб push ds заносила в стек 4 байта... ds вроде как всегда был в два байта толщиной.
Maaniv опубликован 23-09-2001 01:33 MSK     Click Here to See the Profile for Maaniv  Click Here to Email Maaniv     
Это понятно, но хотелось точно узнать (прописывать каждую такую функцию лень). А носчет 4-х байт это точно - все время нарушение стека вываливалось, вот такая лажа....
NKritsky опубликован 24-09-2001 14:12 MSK     Click Here to See the Profile for NKritsky  Click Here to Email NKritsky     
При исполнении 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     Click Here to See the Profile for Maaniv  Click Here to Email Maaniv     
Все ясно, видимо Borland облажался, ну ладно одним тактом больше, одним меньше - неважно, придется сначало ds в ax засовывать, а потом уж и в стек (рчками писать все равно лень...), но все равно за участие спасибо !!!!
Organic опубликован 30-09-2001 10:21 MSK     Click Here to See the Profile for Organic  Click Here to Email Organic     
тьфу блин, внатуре. тут же 32 код используется:))) а ты попробуй перевести компиляцию в 16 битный код! для этого напиши так:

db 66h ; префикс замены операнда
push ds

должно сработать, хотя уже давно так не пробовал, может уже не работает;))))

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.