IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> массив из натуральных чисел, Pascal+Assembler
CooLLeR-zzz
сообщение 11.05.2006 18:42
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Создать прогрмму , где даны 10 натуральных чисел. Вывести на экран максимальные и минимальные числа.
Сидим с братом и не можем догнать ход проги , поняли одно что можно сделать через память или массив.
Пожалуста помогите народ , буду весьма благодарен !!!!!!!!!!!!!!!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
red_alex
сообщение 13.05.2006 10:12
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской
Реальное имя: Алексей

Репутация: -  0  +


Цитата
Вывести на экран максимальные и минимальные числа


Требуется вывести максимальное и минимальное число? Просто не понятно, что означает фраза: вывести максимальные и минимальныеп числа.

И что значит Паскаль+ассемблер?Т.е написать программу либо в Паскале, либо в ассемблере или сделать паскалевскую прогу со вставками на языке ассемблера?


--------------------
Если люди отказываются верить в простоту математики, то это только потому, что они не понимают всю сложность жизни.

Джон фон Нейман
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
CooLLeR-zzz
сообщение 13.05.2006 19:02
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Ну это тоесть дана любые 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.


Сообщение отредактировано: volvo - 2.11.2006 16:07
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 14.05.2006 8:23
Сообщение #4


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
CooLLeR-zzz
сообщение 14.05.2006 8:54
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Огромное огромное огромное СПАСИБО !!!!!!!!!!!!!!!! good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
CooLLeR-zzz
сообщение 14.05.2006 10:07
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


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.


Тегами так и не будешь пользоваться?

Сообщение отредактировано: volvo - 2.11.2006 16:07
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
red_alex
сообщение 14.05.2006 10:14
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской
Реальное имя: Алексей

Репутация: -  0  +


можно еще и вот так:
Код

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;


  asm
  sub si,si
  mov bx,offset a
  mov ax, [bx]
  mov max,ax
  mov min,ax
  mov cx,9
  add bx,2
@1:
  mov ax,[bx]
  cmp max,ax
  jge @fin
  mov max,ax
@fin:
  cmp min,ax
  jle @fin2
  mov min,ax
@fin2:
  add bx,2
  loop @1
end;
  writeln('min: ', min);
  writeln('max: ', max);
  readln;
end.

по команда cld флаг направления обнуляется (DF:=0), т.е когда ты просматриваешь "массив" при помощи строковых команд, ты выбирашь направления его просмотра, слева направо (DF=0) или справа налево (DF=1), взависимости от этого у тебя к (от) значению регистра SI (DI) прибавляется (отнимается) 2, если у тебя "массив" слов, или 1 если "массив" байтов
jge ... это переход для знаковых чисел, если первый операнд больше либо равен второго
jle ... аналогично , только по меньше либо равно

lodsw записывает в регистр АХ содержимое слова памяти, абсолютный адрес которого задается регистрами DS:Si, после чего меняется значение регистра SI на +-2

Сообщение отредактировано: FreeMan - 17.05.2006 8:58


--------------------
Если люди отказываются верить в простоту математики, то это только потому, что они не понимают всю сложность жизни.

Джон фон Нейман
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
CooLLeR-zzz
сообщение 14.05.2006 13:18
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


rolleyes.gif red_alex , xds большое , прибольшое спасибо good.gif . Народ слушайте а если немного задача меняется , ну т.е. надо найти не максимальные и мин. числа , а выстроить последовательно этих 10 натуральных чисел , что в асме изменится ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.05.2006 13:25
Сообщение #9


Гость






Тогда иди сюда:

FAQ: Методы сортировок -> Реализация пузырьковой сортировки на ассемблере
 К началу страницы 
+ Ответить 
CooLLeR-zzz
сообщение 15.05.2006 4:45
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Благодарю good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
CooLLeR-zzz
сообщение 15.05.2006 9:28
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вот что у меня получилось пузырьковой сортировкой , но оно не работает , ругается

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.

ТЭГИ!

чё за ошибка не могу понять :-(

Сообщение отредактировано: volvo - 2.11.2006 16:08
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GoodWind
сообщение 15.05.2006 9:56
Сообщение #12


Автооответчик
*****

Группа: Модераторы
Сообщений: 1 188
Пол: Мужской
Реальное имя: Александр

Репутация: -  16  +


а текст "ругани" привести возможно?

да и вообще код на кашу похож... я тоже ругался когда его посмотрел dry.gif

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.

примерно так.. хотя проверить не мог - на работе некогда, да и компилятора нет.

Сообщение отредактировано: volvo - 2.11.2006 16:08


--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
CooLLeR-zzz
сообщение 15.05.2006 10:14
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Народ а что такое с задачей (найти макс. и мин. числа) , выводятся на экран ряд разных чисел , даже есть с отрицанием , ведь ряд натуральных чисел - это ряд положительных чисел ? mega_chok.gif


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.


я же сказал ПОЛЬЗУЙСЯ ТЭГАМИ!

Сообщение отредактировано: volvo - 2.11.2006 16:09
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
CooLLeR-zzz
сообщение 15.05.2006 10:26
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


wacko.gif
GoodWin там компилятор ругается на команду xor ebx,ebx , типа он не знает такого mad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GoodWind
сообщение 15.05.2006 11:04
Сообщение #15


Автооответчик
*****

Группа: Модераторы
Сообщений: 1 188
Пол: Мужской
Реальное имя: Александр

Репутация: -  16  +


естественно ругается - ebx это 32-битный регистр, tp - 16-битный компилятор.

используй вместо ebx просто bx.


--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
CooLLeR-zzz
сообщение 15.05.2006 15:57
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Теперь стал ругаться на mov cx,i , не знает опреанд i nea.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.05.2006 16:41
Сообщение #17


Гость






Цитата(CooLLeR-zzz @ 15.05.2006 15:57) *

Теперь стал ругаться на mov cx,i , не знает опреанд i nea.gif

Да не в том дело, что он не знает. Ругается на то, что ты в 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
сообщение 15.05.2006 23:47
Сообщение #18


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Цитата
Народ а что такое с задачей (найти макс. и мин. числа) , выводятся на экран ряд разных чисел , даже есть с отрицанием , ведь ряд натуральных чисел - это ряд положительных чисел ?
Натуральные - это целые положительные числа. Кстати, у тебя в варианте на Паскале они тоже были просто целыми (wink.gif), а я невнимательно читал условие smile.gif Сделай так:
a[i] := 1 + Random(100);


CooLLeR-zzz, укажи точно компилятор, который ты используешь. Кроме того, для некоторых компиляторов (e. g., FPC) важен выбранный режим совместимости, т. к. от него зависит размер переменной типа Integer (в FPC он может быть 16, 32 и 64 бита). В 32-битном приложении "правильный" размер Integer - это всё же 32 бита (у FPC по умолчанию - 16) smile.gif

Вот примеры сортировки "пузырьком" для 16-ти (BP) и 32-х битного (FPС) компилятора:

Сообщение отредактировано: volvo - 2.11.2006 16:09


Прикрепленные файлы
Прикрепленный файл  asmsort.zip ( 867 байт ) Кол-во скачиваний: 176


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
CooLLeR-zzz
сообщение 16.05.2006 4:20
Сообщение #19


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Я использую обычный Turbo Pascal 7 со встроенным ассемблером тока под виндоус smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
CooLLeR-zzz
сообщение 18.05.2006 13:55
Сообщение #20


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Ребята помогите составить алгоритм программы , ну т.е. объяснение что делается в каждом цикле , или хотя бы блок схему как к ней составить ?

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]

Сообщение отредактировано: volvo - 2.11.2006 16:10
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 23.08.2025 1:53
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"