На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> ошибка компиляции
    В проге есть строки
    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 !!!
    Меня этот глюк бесит - если кто знает как от него избавиться - напишите, плииииииз.
      а ты так и вызывай функцию, как она компилируется, и правь стек сам.. тока вот я чё-то не припомню, чтоб push ds заносила в стек 4 байта... ds вроде как всегда был в два байта толщиной.
        Это понятно, но хотелось точно узнать (прописывать каждую такую функцию лень). А носчет 4-х байт это точно - все время нарушение стека вываливалось, вот такая лажа....
          При исполнении 32-битного кода команда push ds заносит в стек dword, старшие 16 бит которого это 0, а младшие - ds. Это абсолютно чётко документировано в мануалах интела. Проблема с компилятором, тот мудак что его писал не прочитал в своё время документацию по процу, вот и выходит фигня.
          Мой совет такой: либо смени компилятор, либо каждый раз когда даёшь функции 16-битный аргумент в 32-битном коде, оформляй его как 32-разрядный. В TASM'е для этого используется префикс LONG, в MASM'е не знаю. Можешь попробовать обмануть компилятор чем-то вроде "000000000h OR ds" или "011111111h AND ds" , может и получится :)
            Все ясно, видимо Borland облажался, ну ладно одним тактом больше, одним меньше - неважно, придется сначало ds в ax засовывать, а потом уж и в стек (рчками писать все равно лень...), но все равно за участие спасибо !!!!
              тьфу блин, внатуре. тут же 32 код используется:))) а ты попробуй перевести компиляцию в 16 битный код! для этого напиши так:
              db 66h ; префикс замены операнда
              push ds
              должно сработать, хотя уже давно так не пробовал, может уже не работает;))))
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0227 ]   [ 15 queries used ]   [ Generated: 28.03.24, 11:42 GMT ]