Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Pascal 7.0 + Asm, Ошибка 200 
V
    Опции темы
aeroslav
Дата 24.11.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Может предание старо как мир, но никак я эту проблему решить не могу. Накропал файлик Lab3.asm. На его основе сделал Lab3.obj тем же Тасмом, что идет в идет в Паскале. Написал Labor3.pas. Подключил к нему  Lab3.asm. Все это бесценное творение лежит в папке BIN. При запуске программа, доходит до выполнения asm-процедур вылетает ошибка :"Error 200: Division by zero". Ошибка сия вылетает и тогда, когда я убираю из процедур все операции деления (дабы просто провериться). Ежели запустить скомпилированный exe-шник то в ходе выполнения проги выдается ошибка (привожу полностью):

16-разрядная подсистема MS-DOS

C:\BP\BIN\LABOR3.EXE
Процессор NTVDM обнаружил недопустимую инструкцию.
CS:0002 IP:0057 OP:f0 37 05 0e 02 Для завершения работы приложения нажмите кнопку "Закрыть".

Работаю в Windows XP. А вот и тексты прог.

Цитата

.MODEL large, Pascal
.data
Extrn Numer:Word
Extrn Denom: Word
Extrn Res:Word
Extrn aAsm:Byte
Extrn dAsm:Byte
Extrn cAsm:Byte
Extrn aAsmI:Word
Extrn dAsmI:Word
Extrn cAsmI:Word
.code
Public Lab3S
Lab3S    proc    far
; знаменатель- Denom
mov    al,aAsm
sub    al,cAsm
inc    al
cbw
mov    Denom,ax
; числитель- Numer
mov    al,cAsm
idiv    dAsm
mov    bl,al
mov    al,aAsm
mov    dx,3
imul    dx
sar    ax,1
add    ax,bx
cbw    
mov    byte ptr Numer,al
mov    byte ptr Numer+1,ah
; результат- Res
idiv    Denom
mov    Res,ax
ret
Lab3S    endp
Public Lab3I
Lab3I    proc    far
; знаменатель- Denom
mov    ax,aAsmI
sub    ax,cAsmI
inc    ax
mov    Denom,ax
; числитель- Numer
mov    ax,cAsmI
idiv    dAsmI
mov    bx,ax
mov    ax,aAsmI
mov    dx,3
imul    dx
sar    ax,1
add    ax,bx
cwd    
mov    word ptr Numer,ax
mov    word ptr Numer+2,dx
; результат- Res
idiv    Denom
mov    Res,4
ret
Lab3I    endp
end


Цитата

program Lab3P;
{$L Lab3.obj}
{$F+}
Uses CRT;
Const
  inv2='Result';
  inv3='vihodit za granici';
  invAi='A(Integer)';
  invCi='C(Integer)';
  invDi='D(Integer)';
  invAs='A(ShortInt)';
  invCs='C(ShortInt)';
  invDs='D(ShortInt)';
  IntMin=-32768;
  IntMax=32767;
  ShortMin=-128;
  ShortMax=127;
Label L1;
var
  a,c,d,x: LongInt;
  aAsm, cAsm, dAsm: ShortInt;
  Res, aAsmI, cAsmI, dAsmI, Numer, Denom: Integer;
  ch: Char;

procedure Lab3I(var Res: Integer; aAsmI,cAsmI,dAsmI: Integer); external;
procedure Lab3S(var Res: Integer; aAsm, cAsm, dAsm: ShortInt); external;

{funccia vichislenia x=(c/d+3*a/2)/(c-a+1)}
function F(a,c,d: LongInt; Min, Max: LongInt): boolean;
  var
    x1: LongInt;
    s1: string;
begin
  F:= True;
  x1:= c-a+1;
  if (x1< Min) or (x1> Max) then begin
    s1:= 'Znamenatel'+inv3;
    writeln(s1,Min,'..',Max,'!');
    writeln(x1);
    F:= False;
    exit;
  end;
  if (d=0) or (x1=0) then begin
    writeln('Delenie na 0!');
    F:= False;
  end
  else begin
    x:=  c div d+ 3*a div 2;
    writeln('Pascal');
    writeln('Chislitel  ',x);
    writeln('Znamehatel ',x1);
    x:= x div x1;
    writeln('x=  ',x);
    if (x<Min) or (x>Max) then begin
      s1:= inv2+ inv3;
      writeln(s1,Min,'..',Max,'!');
      writeln(x);
      F:= False;
      exit;
    end;
  end;
end;

procedure ExpI; {Integer}
begin
  writeln('=======Integer=======');
  repeat
    writeln('Vvedite ',invAi,IntMin,IntMax);
    readln(a);
    writeln('Vvedite ',invCi,IntMin,IntMax);
    readln©;
    writeln('Vvedite ',invDi,IntMin,IntMax);
    readln(d);
  until (F(a,c,d,IntMin,IntMax));
    aAsmI:= a;
    cAsmI:= c;
    dAsmI:= d;
    Lab3I(Res,aAsmI,cAsmI,dAsmI);
    writeln('Chislitel  ',Numer);
    writeln('Znamehatel ',Denom);
    writeln('x=  ',Res);
end;

procedure ExpS; {Integer}
begin
  writeln('=======ShortInt=======');
  repeat
    writeln('Vvedite ',invAs,ShortMin,ShortMax);
    readln(a);
    writeln('Vvedite ',invCs,ShortMin,ShortMax);
    readln©;
    writeln('Vvedite ',invDs,ShortMin,ShortMax);
    readln(d);
  until (F(a,c,d,ShortMin,ShortMax));
    aAsm:= a;
    cAsm:= c;
    dAsm:= d;
    Lab3S(Res,aAsm,cAsm,dAsm);
    writeln('Chislitel  ',Numer);
    writeln('Znamehatel ',Denom);
    writeln('x=  ',Res);
end;

procedure Main;
var
  i: Integer;
begin
  writeln('Vichislit x=(c/d+3*a/2)/(c-a+1)');
  repeat
    writeln('Vvedite vibor parametrov x,a,b');
    writeln('   1-Integer');
    writeln('   2-ShortInt');
    writeln('   3-Vihod');
    {$I-}
    readln(i);
    {$I+}
  until IOResult=0;
  case i of
    1 : ExpI;
    2 : ExpS;
    3 : Halt(0);
  end;
end;

begin
  repeat
    ClrScr;
    Main;
    writeln('Povtorim?(y/n)');
    ch:= ReadKey;
  until (ch='n') or (ch='N');
end.


Помогите пожалуйста!

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Labor3.rar 1,67 Kb
PM MAIL   Вверх
Akina
Дата 24.11.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Известный сбой модуля CRT.TPU на быстрых процессорах - при определении скорости системы получается деление на ноль. Характерен как для Паскалей версий по 7.0 включительно, так и для Клипперов версий по 5.0 включительно.

Ищи патченый CRT.TPU. Или патчер для линкованных программ. Или просто поправь исходник модуля, в счетчике циклов в обработчике прерывания таймера добавь увеличение счетчика перед делением и пересобери модуль. 

По-иному проблема не решается.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Snowy
Дата 24.11.2006, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



Асм тут совсем не при чём.
Стандартная трабла модуля Crt - не писался он под современные процы.
Лови фиксер и новый Crt.pas

Присоединённый файл ( Кол-во скачиваний: 47 )
Присоединённый файл  CrtDebug.zip 13,29 Kb
PM MAIL   Вверх
aeroslav
Дата 27.11.2006, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Народ, спасибо, попробую сейчас. Надеюсь, что заработает.
PM MAIL   Вверх
aeroslav
Дата 27.11.2006, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Наткнулся попутно на такую статью:

В связи с кривизной модуля CRT на быстрых машинах типа iPentium II/III, iCeleron программы откомпиленные на BP7/TP7 при запуске вылетают с run-time error 200 - деление на ноль. Причём ошибка эта появляется при подключение модуля даже если вы и не вызывали процедуру Delay, которая там криво написана. 

Суть проблемы состоит в том, что в этом модуле время измерялась через производительность процессора - в то давнее древнее время, как сами понимаете, не было столь быстрых процессоров и не было этой ошибки. Для того, чтобы ваши программы не вылетали вам нужно установить пропатченный вариант CRT, который Вы сможете скачать с сайта Библиотека программиста - http://prog.agava.ru

При этом учтите, стандартный модуль crt.tpu находится в turbo.tpl, чтобы включить в него полученный вами модуль надо найти в поставке Борланд Паскаль tpumover и сделать нижеследующее: 
<полный_путь>\tpumover.exe turbo.tpl +crt.tpu

Кстати, для очень быстрых машин это может и не помочь. 

Я все это сделал, но ошибка не пропала. Это может быть из-за того, что у меня Athlon 3000+?
PM MAIL   Вверх
Snowy
Дата 27.11.2006, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



Нет под рукой щас паскаля.
Пропатчить не могу.
Но совет простой - не используй Crt smile
PM MAIL   Вверх
aeroslav
Дата 27.11.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Цитата(Snowy @  27.11.2006,  12:40 Найти цитируемый пост)
Нет под рукой щас паскаля.
Пропатчить не могу.
Но совет простой - не используй Crt  


Да у меня уже есть CRT.TPU пропатченный, я его с нета скачал, добавил в turbo.tpl как описано выше(но не уверен, ибо никаких сообщений типа Окей или Гуд линкинг не появилось). Завтра попробую, если не выйдет ничего, поставить на VMWare 98-й или 95-й, и там уже дальше буду ковыряться.
А по поводу совета, как я без CRT ввод/вывод без заморочек сделаю?
PM MAIL   Вверх
Snowy
Дата 27.11.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



Цитата(aeroslav @  27.11.2006,  12:53 Найти цитируемый пост)
как я без CRT ввод/вывод без заморочек сделаю?
Да всё также - на асме smile
Тем более, что готовые примеры в самом же Crt smile
PM MAIL   Вверх
aeroslav
Дата 27.11.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Цитата(Snowy @  27.11.2006,  13:28 Найти цитируемый пост)
Да всё также - на асме 
Тем более, что готовые примеры в самом же Crt  

Не пойдет. И причина проста - это моё следующее задание: та же прога, только на ассемблере полностью smile  
PM MAIL   Вверх
Snowy
Дата 27.11.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



Ну так как раз наоборот - то что нужно.
В Crt тебе уже готовые функции на асме написаны.
Перенеси к себе и юзай smile
PM MAIL   Вверх
aeroslav
Дата 27.11.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Годится, главное, что указали, куда рыть дальше. Можно считать, что проблема решена. Спасибо.
PM MAIL   Вверх
aeroslav
Дата 2.12.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Цитата(Snowy @  24.11.2006,  18:24 Найти цитируемый пост)
Асм тут совсем не при чём.
Стандартная трабла модуля Crt - не писался он под современные процы.
Лови фиксер и новый Crt.pas 


Какая-то заговоренная ошибка. Я уже пробовал и с патчем и без, и в эмулятре, и нашёл пенёк 133 с 98й виндой, и везде это долбаное деление на ноль smile . Что делать? 

З.Ы. Или может кто-то стыковал с Delphi7? Напишите плиз, если кто знает, мне и такой вариант подойдет.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1154 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.