Форум «Всё о Паскале» _ Задачи _ как это будет выглядеть в Паскале?
Автор: forum4uxa 19.01.2007 0:13
i:=57; k:=19; while i<199 do if ((i + k div 2) mod 11) = 5 then i:=i-k else k:=k*k+(i div 2)
Автор: volvo 19.01.2007 0:17
Это и ЕСТЬ в паскале... Ты задание приведи, что именно надо посчитать... А так hiv прав - этот код зацикливается...
Добавлено: А все почему? Потому, что числа очень быстро вылетают за допустимые пределы (банальное переполнение)...
Автор: forum4uxa 19.01.2007 2:08
Цитата(volvo @ 18.01.2007 20:17)
Это и ЕСТЬ в паскале... Ты задание приведи, что именно надо посчитать... А так hiv прав - этот код зацикливается...
Добавлено: А все почему? Потому, что числа очень быстро вылетают за допустимые пределы (банальное переполнение)...
i и k... а вообще 1. Использование встроенного ассемблера, отладка, окно просмотра и диалог изменения переменных (регистров), окно регистров. 2. Программная модель процессора 8086, регистры, методы адреса-ции, система команд. 3. Реализовать фрагмент программы на ассемблере, эквивалентный указанному на языке Pascal по индивидуальному заданию.
Автор: forum4uxa 19.01.2007 15:06
????
Автор: hiv 19.01.2007 16:27
Цитата(forum4uxa @ 18.01.2007 22:08)
3. Реализовать фрагмент программы на ассемблере, эквивалентный указанному на языке Pascal по индивидуальному заданию.
Т.е. паскалевский код и есть задание? Тогда беги к преподу и скажи, что типа в задании ошибка зацикливания - пусть поправит. А в остальном (ассемблерный код) похоже все сходится. Я немного счас занят, потом посмотрю досканальней.
Автор: forum4uxa 20.01.2007 4:25
Цитата(hiv @ 19.01.2007 12:27)
Т.е. паскалевский код и есть задание? Тогда беги к преподу и скажи, что типа в задании ошибка зацикливания - пусть поправит. А в остальном (ассемблерный код) похоже все сходится. Я немного счас занят, потом посмотрю досканальней.
если поможешь, с меня чоколадка
Автор: Malice 20.01.2007 4:51
Вот так примерно это делает сам паскаль:
mov i, 57 mov k, 19 @n: cmp i, 119 jnb @ext mov ax, k shr ax, 1 add ax, i xor dx, dx mov cx, 11 div cx xchg ax, dx cmp ax, 5 jnz @w mov ax, i sub ax, k mov i, ax jmp @n @w: mov ax, i shr ax, 1 mov cx, ax mov ax, k mul k add ax, cx mov k, ax jmp @n @ext:
Автор: forum4uxa 23.01.2007 19:38
и всё таки как сделать, чтоб на паскале работала? всё тоже деление на ноль
Автор: volvo 23.01.2007 20:11
В Паскалевском варианте деления на 0 НЕТ. Есть зацикливание, но это разные вещи...
Автор: forum4uxa 23.01.2007 20:26
Цитата(volvo @ 23.01.2007 16:11)
В Паскалевском варианте деления на 0 НЕТ. Есть зацикливание, но это разные вещи...
а как избавиться от этого???
Автор: Malice 23.01.2007 20:44
Цитата(forum4uxa @ 23.01.2007 16:26)
а как избавиться от этого???
Блин. Если изменить данный тебе код, например поменять местами i и k (т.е. сделать i=19, k=57), то паскалевский вариант и мой, приведеный выше отрабатывают одинаково. Результат i=44001, k=21554. Если не менять то, что дали, то ломай голову сам
Автор: hiv 23.01.2007 21:39
Цитата(forum4uxa @ 23.01.2007 16:26)
а как избавиться от этого???
Зацикливание возникает в следствии того, что не обрабатывается ошибка переполнения, если ее включить - то будет паскалем выдаваться "Runtime error 215 at 0BED:0075.", что означает "Arithmetic overflow error". Это значит что где-то при вычислении твоего k происходит переполнение, в ассемблере после математических операций нада проверять флаговый регистр:
Этот 16-разрядный (16-битовый) регистр содержит всю необхо- димую информацию о состоянии процессора 8086 и результатах пос- ледних инструкций (см. Рис. 4.5).
15 0 ------------------------------------------------------------ | | | | | O | D | T | S | Z | | A | P | P | | C | ------------------------------------------------------------
Битовые флаги:
O - флаг переполнения; D - флаг направления; I - флаг прерывания; T - флаг перехвата; S - флаг знака; Z - флаг нуля; A - флаг дополнительного переноса; P - флаг четности; C - флаг переноса.