Создать прогрмму , где даны 10 натуральных чисел. Вывести на экран максимальные и минимальные числа. Сидим с братом и не можем догнать ход проги , поняли одно что можно сделать через память или массив. Пожалуста помогите народ , буду весьма благодарен !!!!!!!!!!!!!!!!!
red_alex
13.05.2006 14:12
Цитата
Вывести на экран максимальные и минимальные числа
Требуется вывести максимальное и минимальное число? Просто не понятно, что означает фраза: вывести максимальные и минимальныеп числа.
И что значит Паскаль+ассемблер?Т.е написать программу либо в Паскале, либо в ассемблере или сделать паскалевскую прогу со вставками на языке ассемблера?
CooLLeR-zzz
13.05.2006 23:02
Ну это тоесть дана любые 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;
Огромное огромное огромное СПАСИБО !!!!!!!!!!!!!!!!
CooLLeR-zzz
14.05.2006 14:07
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;
program poisk; 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;
по команда cld флаг направления обнуляется (DF:=0), т.е когда ты просматриваешь "массив" при помощи строковых команд, ты выбирашь направления его просмотра, слева направо (DF=0) или справа налево (DF=1), взависимости от этого у тебя к (от) значению регистра SI (DI) прибавляется (отнимается) 2, если у тебя "массив" слов, или 1 если "массив" байтов jge ... это переход для знаковых чисел, если первый операнд больше либо равен второго jle ... аналогично , только по меньше либо равно
lodsw записывает в регистр АХ содержимое слова памяти, абсолютный адрес которого задается регистрами DS:Si, после чего меняется значение регистра SI на +-2
CooLLeR-zzz
14.05.2006 17:18
red_alex , xds большое , прибольшое спасибо . Народ слушайте а если немного задача меняется , ну т.е. надо найти не максимальные и мин. числа , а выстроить последовательно этих 10 натуральных чисел , что в асме изменится ?
Вот что у меня получилось пузырьковой сортировкой , но оно не работает , ругается
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.
ТЭГИ!
чё за ошибка не могу понять :-(
GoodWind
15.05.2006 13:56
а текст "ругани" привести возможно?
да и вообще код на кашу похож... я тоже ругался когда его посмотрел
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.
примерно так.. хотя проверить не мог - на работе некогда, да и компилятора нет.
CooLLeR-zzz
15.05.2006 14:14
Народ а что такое с задачей (найти макс. и мин. числа) , выводятся на экран ряд разных чисел , даже есть с отрицанием , ведь ряд натуральных чисел - это ряд положительных чисел ?
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.
я же сказал ПОЛЬЗУЙСЯ ТЭГАМИ!
CooLLeR-zzz
15.05.2006 14:26
GoodWin там компилятор ругается на команду xor ebx,ebx , типа он не знает такого
Теперь стал ругаться на mov cx,i , не знает опреанд i
volvo
15.05.2006 20:41
Цитата(CooLLeR-zzz @ 15.05.2006 15:57)
Теперь стал ругаться на mov cx,i , не знает опреанд i
Да не в том дело, что он не знает. Ругается на то, что ты в 2-х байтовый регистр CX пытаешься однобайтовое значение i засунуть... Кстати, тут еще 2 проблемы. Поскольку код изначально тестировался на 32-битном компиляторе, массив состоит из элементов типа Integer, а на 32-битах размер Integer-а равен 4 байтам, ты работаешь с 16-битным компилятором, придется смещение менять на 2...
И еще. WORD PTR не забывай, указывай компилятору, что ты работаешь именно с 2-х байтовыми элементами массива...
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.
xds
16.05.2006 3:47
Цитата
Народ а что такое с задачей (найти макс. и мин. числа) , выводятся на экран ряд разных чисел , даже есть с отрицанием , ведь ряд натуральных чисел - это ряд положительных чисел ?
Натуральные - это целые положительные числа. Кстати, у тебя в варианте на Паскале они тоже были просто целыми (), а я невнимательно читал условие Сделай так:
a[i] := 1 + Random(100);
CooLLeR-zzz, укажи точно компилятор, который ты используешь. Кроме того, для некоторых компиляторов (e. g., FPC) важен выбранный режим совместимости, т. к. от него зависит размер переменной типа Integer (в FPC он может быть 16, 32 и 64 бита). В 32-битном приложении "правильный" размер Integer - это всё же 32 бита (у FPC по умолчанию - 16)
Вот примеры сортировки "пузырьком" для 16-ти (BP) и 32-х битного (FPС) компилятора:
CooLLeR-zzz
16.05.2006 8:20
Я использую обычный Turbo Pascal 7 со встроенным ассемблером тока под виндоус
CooLLeR-zzz
18.05.2006 17:55
Ребята помогите составить алгоритм программы , ну т.е. объяснение что делается в каждом цикле , или хотя бы блок схему как к ней составить ?
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.
2. Все тексты программ должны помещаться в теги [ CODE] [ /CODE]
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.