Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/313: Рейтинг темы: голосов - 313, средняя оценка - 4.98
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
1

В массиве найти минимальный и максимальный элемент

11.09.2012, 02:25. Показов 56835. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! На ассемблере последний раз писал что-то ещё на 1-м курсе универа и всё забыл за неимением практики. А тут пришла знакомая и попросила помочь с заданием.
Если не сложно, помогите мне. Буду очень благодарен.
Задание:
1) в массиве найти минимальный и максимальный элемент;

Добавлено через 8 минут
Желательна максимальная простота кода и, если не сложно, комментарии, т.к. это потом ей ещё защищать.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2012, 02:25
Ответы с готовыми решениями:

Найти в массиве максимальный элемент и минимальный элемент, и поменять их местами
Привет) помогите пожалуйста решить задачу. Дан целочисленный массив из m элементов. Найдите в нем...

Найти в этом массиве минимальный элемент N и максимальный элемент M
Ввести с клавиатуры массив целых чисел. Найти в этом массиве минимальный элемент N и максимальный...

Найти в массиве минимальный и максимальный элемент
var a:array of integer; min,max,i,n:integer; begin writeln('n='); readln(n); for i:=1 to n do...

Найти минимальный и максимальный элемент в массиве
найти минимальный и максимальный элемент в массиве скажите где ошибка в данном скрипте использую...

22
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
12.09.2012, 19:34 2
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mov si, offset array
mov cx, array_len
xor bx, bx                     ;в bh - максимум, в bl - минимум...
@1: 
     lodsb 
     cmp al, bh
     jg max
     cmp al, bl
     jl min
     jmp @@1
min: 
     and bl, al
     jmp @@1
max:
    and bh, al
@@1:
    loop @1
не тестировал, сразу говорю, но вроде так...

Добавлено через 22 часа 34 минуты
body90, пардон))) хотел повыпендриваться)))
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mov si, offset array
mov cx, array_len
xor bx, bx                     ;в bh - максимум, в bl - минимум...
@1: 
     lodsb 
     cmp al, bh
     jg max
     cmp al, bl
     jl min
     jmp @@1
min: 
     mov bl, al
     jmp @@1
max:
    mov bh, al
@@1:
    loop @1
3
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
12.09.2012, 21:42  [ТС] 3
И не понимаю, что делает "lodsb". Можете пояснить, для чего эта команда в этом коде?
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
12.09.2012, 21:57  [ТС] 4
Вот что у меня получается:
Миниатюры
В массиве найти минимальный и максимальный элемент  
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
12.09.2012, 22:11  [ТС] 5
В архиве то, что я написал. Запускаю по run.bat.
Вложения
Тип файла: rar MyAsm.rar (290.7 Кб, 307 просмотров)
0
766 / 310 / 11
Регистрация: 27.05.2011
Сообщений: 703
12.09.2012, 22:14 6
body90, ты наверно думаешь, что представленный код является полным?
это только выполнение твоего задания(поиск min,max), оформление здесь отсутствует, как допишешь его, так и сможешь проверить..
возми ту же элементарную программку - Hello World, впиши туда то что тебе написали и всё..
только вот ещё одно, результата на экране ты не увидишь, пока не допишешь вывод, либо ч/з отладчик..
2
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
12.09.2012, 22:25  [ТС] 7
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
.model   small
.data
array dd 1,2,3,4,5
mov si, offset array
mov cx, 5
xor bx, bx                     ;в bh - максимум, в bl - минимум...
.code
main:
@1: 
     lodsb 
     cmp al, bh ;сравнение al и bh
     jg max
     cmp al, bl
     jl min
     jmp @@1
min: 
     mov bl, al
     jmp @@1
max:
    mov bh, al
@@1:
    loop @1
end main
end
Написал так. Компиллируется без ошибок, но вот когда запускаю *.exe - выскакивает ошибка с кнопкой "Закрыть". Я что-то неправильно сделал?

Цитата Сообщение от zzzyyyxxx Посмотреть сообщение
только вот ещё одно, результата на экране ты не увидишь, пока не допишешь вывод, либо ч/з отладчик..
А как вывод делать?
0
766 / 310 / 11
Регистрация: 27.05.2011
Сообщений: 703
12.09.2012, 22:28 8
ну у тебя часть кода находится в данных, перенести надо..
по поводу вывода - https://www.cyberforum.ru/asse... 54461.html, выбирай, что душе угодно..
1
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
13.09.2012, 02:16  [ТС] 9
.data должен быть пустым?

Добавлено через 36 минут
Так тоже вылетает с ошибкой:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.model   small
.data
.code
array dd 1,2,3,4,5
mov si, offset array
mov cx, 5
xor bx, bx                     ;в bh - максимум, в bl - минимум...
@1: 
     lodsb 
     cmp al, bh ;сравнение al и bh
     jg max
     cmp al, bl ;сравнение al и bl
     jl min
     jmp @@1
min: 
     mov bl, al
     jmp @@1
max:
    mov bh, al
@@1:
    loop @1 ; переход на следующий элемент массива
end
Добавлено через 25 минут
Подскажите, пожалуйста, что я ещё неправильно делаю. А то мне сегодня её уже надо отдать...
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
13.09.2012, 02:49  [ТС] 10
Вот как оно вылетает (первое изображение) после нажатия F9 в TLINK.exe.
На втором изображении то, что видно на консоли, если я сделаю это же через DosBox. После этого курсор просто мигает и не реагирует ни на какие нажатия.
Миниатюры
В массиве найти минимальный и максимальный элемент   В массиве найти минимальный и максимальный элемент  
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
13.09.2012, 05:31  [ТС] 11
Почему-то мне кажется, что приложение просто зацикливается.

Добавлено через 2 часа 18 минут
И с этим разобрался, но в bh и bl ложатся числа, которых даже нет в массиве. Посмотрел в Turbo Debuggere в окне Wotches. Что может быть не так?
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
13.09.2012, 05:47 12
body90, опять используется массив двойных слов вместо массива байтов, и массив array убери из секции code в секцию data
будь внимательнее и думай головой
1
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
13.09.2012, 11:08  [ТС] 13
Mikl___, сделал так, как Вы сказали. Совсем теперь по "циклу" один раз стало проходить.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Title   Laba
;=====================================
StackSG segment ; Stack segment
    dw  1024    dup (?)
StackSG Ends
;=====================================
DataSG  Segment; Data segment
DataSG Ends
;=====================================
CodeSG  Segment ; Code segment
    assume  ss:StackSG,cs:CodeSG,ds:DataSG
 
BEGIN:
array db 7,2,10,4,26
mov si, offset array
mov cx, 5
xor bx, bx
@1: 
     lodsb 
     cmp al, bh
     jg max
     cmp al, bl
     jl min
     jmp @@1
min: 
     mov bl, al
     jmp @@1
max:
    mov bh, al
@@1:
    loop @1
mov     ah,4ch
int 21h
CodeSG  Ends
END BEGIN
Добавлено через 21 минуту
А тут точно можно использовать bh и bl? Я не могу понять их поведения. Они по прежнему получают значения, которых вообще нет в массиве. Ещё и меняют значение, когда выполняется последний кусок кода
Assembler
1
2
3
4
mov     ah,4ch
int 21h
CodeSG  Ends
END BEGIN
хотя обращений к ним нет. Может я чего-то не понимаю.

Добавлено через 25 секунд
Может кто-то скомпиллировать мой код и сказать что не так?
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
13.09.2012, 11:40 14
body90, тебе же сказали -- помести array в сегмент данных!
1
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
13.09.2012, 11:46  [ТС] 15
Всё равно результат тот же.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Title   Laba
;=====================================
StackSG segment ; Stack segment
    dw  1024    dup (?)
StackSG Ends
;=====================================
DataSG  Segment; Data segment
array db 7,2,10,4,26
DataSG Ends
;=====================================
CodeSG  Segment ; Code segment
    assume  ss:StackSG,cs:CodeSG,ds:DataSG
 
BEGIN:
mov si, offset array
mov cx, 5
xor bx, bx
@1: 
     lodsb 
     cmp al, bh
     jg max
     cmp al, bl
     jl min
     jmp @@1
min: 
     mov bl, al
     jmp @@1
max:
    mov bh, al
@@1:
    loop @1
mov     ah,4ch
int 21h
CodeSG  Ends
END BEGIN
В момент до выполнения строки
Assembler
1
mov     ah,4ch
bh = 32
bl = 159
1
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
13.09.2012, 11:47  [ТС] 16
Вот скрин.
Миниатюры
В массиве найти минимальный и максимальный элемент  
1
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
13.09.2012, 11:50 17
должно быть вот так
Assembler
1
2
3
4
5
BEGIN: mov ax,DataSG
mov ds,ax
mov si, offset array
mov cx, 5
xor bx, bx
2
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
13.09.2012, 11:56  [ТС] 18
bh работает, а в bl теперь всё время лежит 0, хотя в массиве минимальный элемент = 2.
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
13.09.2012, 12:03 19
body90, естественно, потому что изначально BL=0, а ноль всегда меньше двух
поставь вместо xor bx,bx команду mov bx,7Fh и всё заработает
1
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
13.09.2012, 12:03  [ТС] 20
Не знаю правильно ли, но вышел из ситуации так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Title   Laba
;=====================================
StackSG segment ; Stack segment
    dw  1024    dup (?)
StackSG Ends
;=====================================
DataSG  Segment; Data segment
    array db 7,2,10,4,26
DataSG Ends
;=====================================
CodeSG  Segment ; Code segment
    assume  ss:StackSG,cs:CodeSG,ds:DataSG
 
BEGIN:
mov ax, DataSG
mov ds, ax
mov si, offset array
mov cx, 5
xor bx, bx
mov bl, al
@1: 
     lodsb 
     cmp al, bh
     jg max
     cmp al, bl
     jl min
     jmp @@1
min: 
     mov bl, al
     jmp @@1
max:
    mov bh, al
@@1:
    loop @1
mov     ah,4ch
int 21h
CodeSG  Ends
END BEGIN
0
13.09.2012, 12:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2012, 12:03
Помогаю со студенческими работами здесь

Найти минимальный и максимальный элемент в массиве
2 задачи,решите плиз 1)Даны 2 линейных массива a и b . Найти сумму,поместить в массив С ,...

Найти максимальный и минимальный элемент в массиве
здравствуйте! у меня несложное задание: найти максимальный и минимальный элемент в массиве. всё...

Классы. В массиве чисел размером 6х6 элементов найти максимальный элемент, минимальный элемент и их индексы
В массиве чисел размером 6х6 элементов найти максимальный элемент, минимальный элемент и их...

Найти в массиве минимальный элемент m и максимальный элемент M
Дан массив целых чисел. Найти в этом массиве минимальный элемент m и максимальный элемент M....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru