Создать прогрмму , где даны 10 натуральных чисел. Вывести на экран максимальные и минимальные числа.
Сидим с братом и не можем догнать ход проги , поняли одно что можно сделать через память или массив.
Пожалуста помогите народ , буду весьма благодарен !!!!!!!!!!!!!!!!!
Ну это тоесть дана любые 10 натуральных числел , из них вывести максимальное и минимальное число на экран .
паскалевская прога со вставками на языке ассемблера
вот что у меня получилось на паскале , а как туда ассемблер вогнать не знаю
var
a : array[1 .. 10] of integer;
i : integer;
min, max : integer;
begin
randomize;
for i := 1 to 10 do
begin
a[i] := random(100) - 50;
write(a[i]:4);
end;
writeln;
min := a[1];
max := a[1];
for i := 2 to 10 do
begin
if a[i] < min then
min := a[i];
if a[i] > max then
max := a[i];
end;
writeln('min: ', min);
writeln('max: ', max);
readln;
end.
program MinMax;
var
a: array[1..10] of Integer;
i, Min, Max: Integer;
begin
Randomize;
for i := 1 to 10 do
begin
a[i] := Random(101) - 50;
Write(a[i], ' ');
end;
Writeln;
asm
cld
lea si,a
lodsw
mov bx,ax
mov dx,ax
mov cx,9
@@1:
lodsw
cmp ax,bx
jge @@2
mov bx,ax
@@2:
cmp ax,dx
jle @@3
mov dx,ax
@@3:
loop @@1
mov Min,bx
mov Max,dx
end;
Writeln('Min = ', Min);
Writeln('Max = ', Max);
end.
Огромное огромное огромное СПАСИБО !!!!!!!!!!!!!!!!
xds извени пожалйста что ещё раз побеспокоил , помоги мне пожалуйста с описанием команд , я из них половину нашел , а вот что за команды cld , lodsw , jge @@2 , jle @@3 , что они выполняют ?
program MinMax;
var
a: array[1..10] of Integer;
i, Min, Max: Integer;
begin
randomize;
for i := 1 to 10 do
begin
a[i] := Random(101) - 50;
Write(a[i], ' ');
end;
Writeln;
asm
cld {Сброс флага направления при цепочной команде}
lea si,a {Загрузка эффективного адреса}
lodsw
mov bx,ax {В регистр bx помещается регистр ax }
mov dx,ax {В регистр dx помещается регистр ax }
mov cx,9 {В регистр cx помещается кол-во 9 натуральных чисел}
@@1:
lodsw
cmp ax,bx {Сравниваем два операнда ax и bx}
jge @@2
mov bx,ax {В регистр bx помещается регистр ax }
@@2:
cmp ax,dx {Сравниваем два операнда ax и dx}
jle @@3
mov dx,ax {В регистр dx помещается регистр ax }
@@3:
loop @@1
mov Min,bx {В Min помещается регистр bx }
mov Max,dx{В Max помещается регистр dx}
end;
Writeln('Min = ', Min);
Writeln('Max = ', Max);
end.
можно еще и вот так:
red_alex , xds большое , прибольшое спасибо . Народ слушайте а если немного задача меняется , ну т.е. надо найти не максимальные и мин. числа , а выстроить последовательно этих 10 натуральных чисел , что в асме изменится ?
Тогда иди сюда:
http://forum.pascal.net.ru/index.php?s=&showtopic=3065&view=findpost&p=27327
Благодарю
Вот что у меня получилось пузырьковой сортировкой , но оно не работает , ругается
Program Posled;
Const n=10;
Var
Mas:Array[1..n] of integer;
i,j:Byte;
Exchange:Integer;
Begin
For i:=1 To n Do Begin
write('?');
Readln(Mas[i]);
End;
procedure BubbleSort(Mas: Pointer; Len: Integer);
Begin
asm
dec Len
@CycleExt:
xor ebx,ebx
mov ecx,Len
mov esi,0
@CycleIn:
mov edi,Mas[esi]
cmp edi,Mas[esi+4]
jg @Exchange
add esi,4
loop @CycleIn
jmp @Check
@Exchange:
mov ebx,Mas[esi+4]
mov Mas[esi+4],edi
mov Mas[esi],ebx
add esi,4
loop @CycleIn
@Check:
cmp ebx,0
je @Exit
jmp @CycleExt
@Exit:
end;
For i:=1 To n Do
Write(Mas[i]:6);
End.
а текст "ругани" привести возможно?
да и вообще код на кашу похож... я тоже ругался когда его посмотрел
Program Posled;
Const n=10;
Var
Mas:Array[1..n] of integer;
i,j:Byte;
Exchange:Integer;
Begin
For i:=1 To n Do Begin
write('?');
Readln(Mas[i]);
i:=n;
asm
dec i
@CycleExt:
xor ebx,ebx
mov ecx,i
mov esi,0
@CycleIn:
mov edi,Mas[esi]
cmp edi,Mas[esi+4]
jg @Exchange
add esi,4
loop @CycleIn
jmp @Check
@Exchange:
mov ebx,Mas[esi+4]
mov Mas[esi+4],edi
mov Mas[esi],ebx
add esi,4
loop @CycleIn
@Check:
cmp ebx,0
je @Exit
jmp @CycleExt
@Exit:
end;
For i:=1 To n Do
Write(Mas[i]:6);
End.
Народ а что такое с задачей (найти макс. и мин. числа) , выводятся на экран ряд разных чисел , даже есть с отрицанием , ведь ряд натуральных чисел - это ряд положительных чисел ?
program MinMax;
var
a: array[1..10] of Integer;
i, Min, Max: Integer;
begin
Randomize;
for i := 1 to 10 do
begin
a[i] := Random(101) - 50;
Write(a[i], ' ');
end;
Writeln;
asm
cld
lea si,a
lodsw
mov bx,ax
mov dx,ax
mov cx,9
@@1:
lodsw
cmp ax,bx
jge @@2
mov bx,ax
@@2:
cmp ax,dx
jle @@3
mov dx,ax
@@3:
loop @@1
mov Min,bx
mov Max,dx
end;
Writeln('Min = ', Min);
Writeln('Max = ', Max);
end.
GoodWin там компилятор ругается на команду xor ebx,ebx , типа он не знает такого
естественно ругается - ebx это 32-битный регистр, tp - 16-битный компилятор.
используй вместо ebx просто bx.
Теперь стал ругаться на mov cx,i , не знает опреанд i
Program Posled;
Const
n = 10;
mas: array[1 .. n] of integer =
(1, 4, 2, 7, 3, 8, 4, 2, 10, 9);
var
i, j: integer;
Begin
{
for i := 1 To n Do Begin
write('?'); Readln(Mas[i]);
end;
}
i := n;
asm
dec i
@CycleExt:
xor bx, bx
mov cx, i
mov si, 0
@CycleIn:
mov di, WORD PTR Mas[si]
cmp di, WORD PTR Mas[si+2]
jg @Exchange
add si,2
loop @CycleIn
jmp @Check
@Exchange:
mov bx, WORD PTR Mas[si+2]
mov WORD PTR Mas[si+2], di
mov WORD PTR Mas[si],bx
add si,2
loop @CycleIn
@Check:
cmp bx,0
je @Exit
jmp @CycleExt
@Exit:
end;;
writeln;
For i := 1 To n Do
Write(Mas[i]:6);
End.
a[i] := 1 + Random(100);
Я использую обычный Turbo Pascal 7 со встроенным ассемблером тока под виндоус
Ребята помогите составить алгоритм программы , ну т.е. объяснение что делается в каждом цикле , или хотя бы блок схему как к ней составить ?
program MinMax;
var
a: array[1..10] of Integer;
i, Min, Max: Integer;
begin
randomize;
for i := 1 to 10 do
begin
a[i] := 1+Random(100);
Write(a[i], ' ');
end;
Writeln;
asm
cld {флаг направления обнуляется}
lea si,a {Загрузка эффективного адреса}
lodsw { Записываем в регистр АХ содержимое слова памяти}
mov bx,ax {В регистр bx помещается регистр ax }
mov dx,ax {В регистр dx помещается регистр ax }
mov cx,9 {В регистр cx помещается кол-во 9 натуральных чисел}
@1:
lodsw
cmp ax,bx {Сравниваем два операнда ax и bx}
jge @2 { переход знаковых чисел, если первый операнд больше либо равен второго}
mov bx,ax {В регистр bx помещается регистр ax }
@2:
cmp ax,dx {Сравниваем два операнда ax и dx}
jle @3 { переход знаковых чисел, если первый операнд меньше либо равен второго}
mov dx,ax {В регистр dx помещается регистр ax }
@3:
loop @1
mov Min,bx {В Min помещается регистр bx }
mov Max,dx{В Max помещается регистр dx}
end;
Writeln('Min = ', Min);
Writeln('Max = ', Max);
end.