Помощь - Поиск - Пользователи - Календарь
Полная версия: как это будет выглядеть в Паскале?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
forum4uxa
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
Это и ЕСТЬ в паскале... Ты задание приведи, что именно надо посчитать... А так hiv прав - этот код зацикливается...

Добавлено:
А все почему? Потому, что числа очень быстро вылетают за допустимые пределы (банальное переполнение)...
forum4uxa
Цитата(volvo @ 18.01.2007 20:17) *

Это и ЕСТЬ в паскале... Ты задание приведи, что именно надо посчитать... А так hiv прав - этот код зацикливается...

Добавлено:
А все почему? Потому, что числа очень быстро вылетают за допустимые пределы (банальное переполнение)...

i и k...
а вообще
1. Использование встроенного ассемблера, отладка, окно просмотра и диалог изменения переменных (регистров), окно регистров.
2. Программная модель процессора 8086, регистры, методы адреса-ции, система команд.
3. Реализовать фрагмент программы на ассемблере, эквивалентный указанному на языке Pascal по индивидуальному заданию.
forum4uxa
unsure.gif ????
hiv
Цитата(forum4uxa @ 18.01.2007 22:08) *
3. Реализовать фрагмент программы на ассемблере, эквивалентный указанному на языке Pascal по индивидуальному заданию.
Т.е. паскалевский код и есть задание? lol.gif Тогда беги к преподу и скажи, что типа в задании ошибка зацикливания - пусть поправит. А в остальном (ассемблерный код) похоже все сходится. Я немного счас занят, потом посмотрю досканальней.
forum4uxa
Цитата(hiv @ 19.01.2007 12:27) *

Т.е. паскалевский код и есть задание? lol.gif Тогда беги к преподу и скажи, что типа в задании ошибка зацикливания - пусть поправит. А в остальном (ассемблерный код) похоже все сходится. Я немного счас занят, потом посмотрю досканальней.

если поможешь, с меня чоколадка give_rose.gif
Malice
Вот так примерно это делает сам паскаль:
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
и всё таки как сделать, чтоб на паскале работала? всё тоже деление на ноль nea.gif
volvo
В Паскалевском варианте деления на 0 НЕТ. Есть зацикливание, но это разные вещи...
forum4uxa
Цитата(volvo @ 23.01.2007 16:11) *

В Паскалевском варианте деления на 0 НЕТ. Есть зацикливание, но это разные вещи...

а как избавиться от этого???
Malice
Цитата(forum4uxa @ 23.01.2007 16:26) *

а как избавиться от этого???

Блин.
Если изменить данный тебе код, например поменять местами i и k (т.е. сделать i=19, k=57), то паскалевский вариант и мой, приведеный выше отрабатывают одинаково. Результат i=44001, k=21554.
Если не менять то, что дали, то ломай голову сам smile.gif
hiv
Цитата(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 - флаг переноса.

     Рис. 4.5 Регистр флагов процессора 8086.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.