Консультация № 146189
06.10.2008, 14:27
0.00 руб.
0 5 1
Здравствуйте Эксперты!! Дана программа на Паскале с заменеными на Ассемблере циклами! Надо заменить еще и тело цикла
m:=m+i;
if m<50 then
A[i]:=5*i
Else A[i]:=m;
! И на каждую строку написать коментарии,Помогите пожалуйста...

Приложение:
{21. Program test0021;}
Var
i,m:integer;
A:array [13..21] of integer;
label A10,B10,C10,D10;
Begin
m:=0;
asm
{ i:=21;}
mov ax,21
{ repeat}
A10:
mov i,ax
end;
m:=m+i;
if m<50 then
A[i]:=5*i
Else A[i]:=m;
asm
{ dec(i)}
mov ax,i
dec ax
{ until i<13;}
cmp ax,13
jae A10
end;
{for i:=13 to 21 do}
asm
mov ax,13
jmp B10
C10:
mov ax,i
inc ax
B10:
mov i,ax
cmp ax,21
ja D10
end;
write(A[i]:4);
asm
jmp C10
D10:
end;
writeln;
readln;
End.

Обсуждение

Неизвестный
06.10.2008, 16:36
общий
Что-то не очень понял, какой цикл? Тот, что в комментариях?
Почему такая "каша" в программе? Это Вам дали такое задание - изменить?
Или задание, которое Вы выполняете как-то звучит?
Неизвестный
08.10.2008, 01:04
общий
Нет то что стоит в скобках коментариев ну например { repeat} замененно ниже... а мне надо заменить еще и
m:=m+i;
if m<50 then
A[i]:=5*i
Else A[i]:=m;
И все... ну и написать коментарии если можно
Неизвестный
08.10.2008, 11:01
общий
То есть, цикл: i пробегает значения от 13 до 21, и вычисляются значения m = m + i . В зависимости от результата вычисления m нужно изменять значения A[i] ?
Неизвестный
08.10.2008, 11:48
общий
Ладно давайте сначала!!! Мне дали программу на Паскале вот она!
21. Program test0021;
Var
i,m:integer;
A:array [13..21] of integer;
Begin
m:=0;
i:=21;
repeat
m:=m+i;
if m<50 then
A[i]:=5*i
Else A[i]:=m;
dec(i)
until i<13;

for i:=13 to 21 do
write(A[i]:4);writeln;
End.

Задание изменить выделеный код кодом ассемблера, и написать коментарии выподнения!!! Мне заменили но не полностью, не заменили фрагмент

m:=m+i;
if m<50 then
A[i]:=5*i
Else A[i]:=m;

И не написали коментарии, ......
Неизвестный
08.10.2008, 12:48
общий
это ответ
Здравствуйте, Saidart!
Так бы сразу и сказали. Ясно теперь, что не нужно нам предлагать для комментирования плохо написанные программы? Мы лучше сможем.
Например так, как в программе, что приложении лежит
---
Чтобы все правильно записалось в Паскаль:
1) скопируйте содержимое приложения в карман;
2) откройте среду разработки Паскаля с пустым окном;
3) если развернулось на весь экран, то нажмите Alt+Enter - нужно оконное;
4) нажмите Ctrl+O (O - не ноль а О!!);
5) выберите значок окна ( у меня черное) в самом-самом верхнем левом углу окна Виновского;
6) нажмите левую кнопку мыши и выберите "Изменить - Вставить";
7) опять нажмите Ctrl+O (теперь для того, чтобы включить автомат. отступ).
8) Удачи!!


Приложение:
Program test0021;
Var
i,m:integer;
A:array [13..21] of integer;
Begin
m:=0;
{
i:=21;
repeat
m:=m+i;
if m<50 then
A[i]:=5*i
Else A[i]:=m;
dec(i)
until i<13;}
asm
mov i, 21 {инициализируем переменную i}
@@1: {метки, начинающиеся с @@ можно заранее не объявлять}
mov ax, i {помещаем значение переменной в AX}
add m, ax {добавляем i к m. Использование регистра здесь обязательно}
lea di, A {загружаем в DI адрес начала массива. DS:DI теперь указывает
на начало массива}
{Теперь вычислим в BX смещение элемента i}
mov bx, ax {В AX по-прежнему находится значение i}
sub bx, 13 {Вычитаем 13 - т.к. нумерация с 13-го}
shl bx, 1 {сдвиг влево на 1 двоичный разряд равносилен умножению
на 2, и так и быстрее и профессиональнее
Умножать на 2 нужно, так как каждый элемент
занимает 2 байта (integer)}
add di, bx {добавляем к адресу смещение элемента
Теперь DS:DI указывает на нужный элемент массива}
cmp m, 50 {Сравниваем m с 50}
jb @@2 {Если меньше (Below), то переход на метку @@2}
{Это выполняется, если больше или равно 50}
mov [di], ax {помещаем по адресу DS:DI содержимое регистра AX}
jmp @@3 {Безусловный переход на метку}
@@2:
{Это выполняется, если меньше 50}
mov bl, 5 {Подготавливаем умножение i*5. У нас будет AL*BL
так как 50 меньше максимального значения байта = 255}
{В АХ уже находится значение i}
mul bl {умножение AL*BL - результат помещается в AX}
mov [di], ax {Записываем результат в память по адресу DS:DI}
@@3:
dec i {Уменьшаем значение i на 1}
cmp i, 13 {Сравниваем ш с 13}
jae @@1 {Переход если больше или равно}
end;
for i:=13 to 21 do
write(A[i]:4);writeln;
End.
Форма ответа