Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
Problem – Determine largest number in an array of n elements. Value of n is stored at address 2050 and array starts from address 2051. Result is stored at address 3050. Starting address of program is taken as 2000.
Example:
Algorithm:
- We are taking first element of array in A
- Comparing A with other elements of array, if A is smaller then store that element in A otherwise compare with next element
- The value of A is the answer
Program:
Memory Address | Mnemonics | Comment |
---|---|---|
2000 | LXI H 2050 | H←20, L←50 |
2003 | MOV C, M | C←M |
2004 | DCR C | C←C-01 |
2005 | INX H | HL←HL+0001 |
2006 | MOV A, M | A←M |
2007 | INX H | HL←HL+0001 |
2008 | CMP M | A-M |
2009 | JNC 200D | If Carry Flag=0, goto 200D |
200C | MOV A, M | A←M |
200D | DCR C | C←C-1 |
200E | JNZ 2007 | If Zero Flag=0, goto 2007 |
2011 | STA 3050 | A→3050 |
2014 | HLT |
Explanation:
Registers used: A, H, L, C
- LXI 2050 assigns 20 to H and 50 to L
- MOV C, M copies content of memory (specified by HL register pair) to C (this is used as a counter)
- DCR C decrements value of C by 1
- INX H increases value of HL by 1. This is done to visit next memory location
- MOV A, M copies content of memory (specified by HL register pair) to A
- INX H increases value of HL by 1. This is done to visit next memory location
- CMP M compares A and M by subtracting M from A. Carry flag and sign flag becomes set if A-M is negative
- JNC 200D jumps program counter to 200D if carry flag = 0
- MOV A, M copies content of memory (specified by HL register pair) to A
- DCR C decrements value of C by 1
- JNZ 2007 jumps program counter to 2007 if zero flag = 0
- STA 3050 stores value of A at 3050 memory location
- HLT stops executing the program and halts any further execution
Advantages of finding the largest number in an array:
- It is a simple and straightforward task that can be easily implemented in any programming language.
- It is a common operation used in many algorithms and applications, such as finding the maximum value in a data set or determining the winner of a game.
- It is a fast operation that can be completed in O(n) time complexity, where n is the number of elements in the array.
Disadvantages of finding the largest number in an array:
- If the array is unsorted, finding the largest number requires iterating through the entire array, which can be inefficient for very large arrays.
- If multiple elements in the array have the same maximum value, finding only one of them requires additional logic or iterations, which can add complexity to the algorithm.
- If the array is very large and memory is limited, storing the entire array in memory may not be feasible, which could require a more complex solution such as sorting the array in smaller parts.
Last Updated :
07 May, 2023
Like Article
Save Article
390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
|
1 |
|
В массиве найти минимальный и максимальный элемент11.09.2012, 02:25. Показов 54381. Ответов 22
Здравствуйте! На ассемблере последний раз писал что-то ещё на 1-м курсе универа и всё забыл за неимением практики. А тут пришла знакомая и попросила помочь с заданием. Добавлено через 8 минут
0 |
Troll_Face 608 / 406 / 8 Регистрация: 26.04.2012 Сообщений: 2,065 |
||||||||
12.09.2012, 19:34 |
2 |
|||||||
не тестировал, сразу говорю, но вроде так… Добавлено через 22 часа 34 минуты
3 |
390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
|
12.09.2012, 21:42 [ТС] |
3 |
И не понимаю, что делает «lodsb». Можете пояснить, для чего эта команда в этом коде?
0 |
390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
|
12.09.2012, 21:57 [ТС] |
4 |
Вот что у меня получается: Миниатюры
0 |
390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
|
12.09.2012, 22:11 [ТС] |
5 |
В архиве то, что я написал. Запускаю по run.bat.
0 |
766 / 310 / 11 Регистрация: 27.05.2011 Сообщений: 703 |
|
12.09.2012, 22:14 |
6 |
body90, ты наверно думаешь, что представленный код является полным?
2 |
body90 390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
||||
12.09.2012, 22:25 [ТС] |
7 |
|||
Написал так. Компиллируется без ошибок, но вот когда запускаю *.exe — выскакивает ошибка с кнопкой «Закрыть». Я что-то неправильно сделал?
только вот ещё одно, результата на экране ты не увидишь, пока не допишешь вывод, либо ч/з отладчик.. А как вывод делать?
0 |
766 / 310 / 11 Регистрация: 27.05.2011 Сообщений: 703 |
|
12.09.2012, 22:28 |
8 |
ну у тебя часть кода находится в данных, перенести надо..
1 |
body90 390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
||||
13.09.2012, 02:16 [ТС] |
9 |
|||
.data должен быть пустым? Добавлено через 36 минут
Добавлено через 25 минут
0 |
390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
|
13.09.2012, 02:49 [ТС] |
10 |
Вот как оно вылетает (первое изображение) после нажатия F9 в TLINK.exe. Миниатюры
0 |
390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
|
13.09.2012, 05:31 [ТС] |
11 |
Почему-то мне кажется, что приложение просто зацикливается. Добавлено через 2 часа 18 минут
0 |
Ушел с форума 15881 / 7457 / 1010 Регистрация: 11.11.2010 Сообщений: 13,439 |
|
13.09.2012, 05:47 |
12 |
body90, опять используется массив двойных слов вместо массива байтов, и массив array убери из секции code в секцию data
1 |
body90 390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
||||||||
13.09.2012, 11:08 [ТС] |
13 |
|||||||
Mikl___, сделал так, как Вы сказали. Совсем теперь по «циклу» один раз стало проходить.
Добавлено через 21 минуту
хотя обращений к ним нет. Может я чего-то не понимаю. Добавлено через 25 секунд
0 |
Ушел с форума 15881 / 7457 / 1010 Регистрация: 11.11.2010 Сообщений: 13,439 |
|
13.09.2012, 11:40 |
14 |
body90, тебе же сказали — помести array в сегмент данных!
1 |
body90 390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
||||||||
13.09.2012, 11:46 [ТС] |
15 |
|||||||
Всё равно результат тот же.
В момент до выполнения строки
bh = 32
1 |
390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
|
13.09.2012, 11:47 [ТС] |
16 |
Вот скрин. Миниатюры
1 |
Mikl___ Ушел с форума 15881 / 7457 / 1010 Регистрация: 11.11.2010 Сообщений: 13,439 |
||||
13.09.2012, 11:50 |
17 |
|||
должно быть вот так
2 |
390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
|
13.09.2012, 11:56 [ТС] |
18 |
bh работает, а в bl теперь всё время лежит 0, хотя в массиве минимальный элемент = 2.
0 |
Ушел с форума 15881 / 7457 / 1010 Регистрация: 11.11.2010 Сообщений: 13,439 |
|
13.09.2012, 12:03 |
19 |
body90, естественно, потому что изначально BL=0, а ноль всегда меньше двух
1 |
body90 390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
||||
13.09.2012, 12:03 [ТС] |
20 |
|||
Не знаю правильно ли, но вышел из ситуации так:
0 |
Есть задание. Необходимо найти значение максимального элемента в массиве. Элементы массива должны иметь тип WORD
(2 байта). В первом элементе массива должно хранить количество элементов массива −1. То есть оттуда мы должны считать количество чисел, перейти на адрес второй ячейки массива, и начиная с числа по этому адресу уже сравнивать.
Написал следующий код:
section .text
global _start
_start:
mov eax, 3 ; mov eax, [x]
mov ebx,0 ; EBX будет хранить максимальное значение
mov ecx, x ; ECX будет указывать на текущий элемент для выполнения операции сравнения
add ecx, 2
top: cmp ebx, [ecx]
JNS l1
mov ebx, [ecx]
l1: add ecx, 2 ; перемещаем указатель на следующий элемент
dec eax ; выполняем декремент счётчика
jnz top ; если счётчиком не является 0, то тогда выполняем цикл ещё раз
done:
add ebx, '0'
mov [max], ebx ; готово, сохраняем результат в переменной sum
display:
mov edx, 2 ; длина сообщения
mov ecx, max ; сообщение для написания
mov ebx, 1 ; файловый дескриптор (stdout)
mov eax, 4 ; номер системного вызова (sys_write)
int 0x80 ; вызов ядра
mov eax, 1 ; номер системного вызова (sys_exit)
int 0x80 ; вызов ядра
section .data
global x
x:
dw 3
dw 2
dw 4
dw 3
max:
dw 0
Компилирую в Linux через консоль, компиляция проходит, но результат выводит неправильный. Кроме того, ему не нравится синтаксис(segmentation fault)
mov eax, [x]
Если кто разбирается в ассемблере, помогите, пожалуйста. Где я ошибся?
.model tiny ; модель памяти, используемая для COM .code ; начало сегмента кода org 100h ; начальное значение счетчика - 100h start: mov al, x ; значение х заносим в al cmp al, y ; сравниваем х и y jge label_1 ; если х >= y, то переходим на метку label_1 mov al, y ; если x < y, то (al) = y label_1: mov t, al ; заносим в t максимальное число mov al, z ; значение z заносим в al cmp al, t ; сравниваем z и t jge label_2 ; если z >= t, то переходим на метку label_2 mov al, t ; если z < t, то (al) = t label_2: mov t, al ; заносим в t максимальное число ret ; завершение COM программы x db 5 ; x = 5 y db 8 ; y = 8 z db 15 ; z = 15 t db ? ; резервируем память для результата end start ; конец программы
sersad
Гость |
Добрый день, поистине неисповедимы пути ассемблера, при написании этой программы хотелось что бы был найден максимальный элемент и показан на экране, и как результат на экране не то что нужно, подскажите что не так. begin: jmp setup |
||
|
4y4z
Участник |
Если бы это был код на С и других языках высокого уровня, то после каждой операции по изменению содержимого переменных(а таковыми в данном случае естественно будут все регистры после выполнения mov) то нужно было бы вывести на печать содержимое измененной переменной. Но в данном случае нужно пропустить программу через отладчик. Увидите как меняется содержимое регистров, чтобы проверить правильно ли она работает. |
||
Ищу работу. (разработка/тестирование/отладка) |
SAVC
Гость |
Насколько я понял, ты на TASM пишешь. mov si,offset mass lodsb m3: mov byte ptr max,ah max: db ‘ максимальный$’ jmp short m2 |
||
|
sersad
Гость |
Не могли бы вы подсказать что за команда jmp sort m2 а то программа пишет что такого она не знает |
||
|
Sla
Команда клуба
|
jump sort = jump short ? |
||
Мы все учились понемногу… Чему-нибудь и как-нибудь. |
sersad
Гость |
Доброго времени суток присланная прога от SAVC, выдает такое же сообщение как и мой вариант, не ищет она число и не выводит его на экран, а выводит надпись » максимальный» |
||
|
Sla
Команда клуба
|
sersad, ну правильно не выводит m3: mov byte ptr max,ah |
||
Мы все учились понемногу… Чему-нибудь и как-нибудь. |
sersad
Гость |
Sla, получилось вот так |
||
|
Sla
Команда клуба
|
вообще-то оно не будет работать с числами больше 15 а вот почему не выводилось |
||
Мы все учились понемногу… Чему-нибудь и как-нибудь. |
Sla
Команда клуба
|
sersad, и… оформляй код тегами [code][/code] |
||
Мы все учились понемногу… Чему-нибудь и как-нибудь. |
sersad
Гость |
Sla, не то чтобы больше 15 оно и больше 10 не считает(правильно подмечено «оно») у меня пока только это и получается,если вы про эту команду mov max ,al — так ты ж пред выводом строки запихнул в ah код функции,тем самім затерев результат— если можно то конкретно ткните где что не так , не особенно понял. |
||
|
Sla
Команда клуба
|
sersad, слухай, откоментируй этот код, на каждую строчку begin: jmp setup |
||
Мы все учились понемногу… Чему-нибудь и как-нибудь. |
sersad
Гость |
begin: jmp setup |
||
|
Sla
Команда клуба
|
sersad, 48 добавляем чтобы вывести число на экран зы… я тебя просил оформи свой код тегами [code] [/code] |
||
Мы все учились понемногу… Чему-нибудь и как-нибудь. |