У меня уже есть готовая программа, которая находит минимальное значение в массиве, но проблема вся в том, что если я поменяю в массиве допустим цифру 7 на -100, то у меня все равно выведет -15. Не могу понять в чем проблема и как ее пофиксить.
.486
.model flat, stdcall
option casemap: none
include /masm32/include/windows.inc
include /masm32/include/user32.inc
include /masm32/include/kernel32.inc
includelib /masm32/lib/user32.lib
includelib /masm32/lib/kernel32.lib
include /masm32/macros/macros.asm
uselib masm32, comctl32, ws2_32
include <masm32includewindows.inc>
include <masm32includekernel32.inc>
includelib <masm32libkernel32.lib>
include <masm32includeuser32.inc>
includelib <masm32libuser32.lib>
include <masm32includemasm32.inc>
includelib <masm32libmasm32.lib>
include <masm32includedebug.inc>
includelib <masm32libdebug.lib>
.data
msg_title db "Title", 0
A DB 1h
x dd -15,1,2,3,4,5,6,7,8,9,10,11
n dd 12
buffer db 128 dup(?)
format db "%d",0
min dd ?
imin dd ?
.code
start:
mov ecx, n
dec ecx
xor edi, edi ; указатель на 1-й элемент, принятый за начальный минимум
mov esi, 1 ; указатель на 2-й элемент (его индекс 1)
cycle:
mov eax, x[esi]
cmp eax, x[esi]
jge @next
mov edi, esi
@next:
inc esi
loop cycle
mov imin, edi ; запись индекса минимального элемента
mov eax, x[edi]
mov min, eax ; запись индекса минимального элемента
PrintDec imin
PrintLine
PrintDec min
invoke ExitProcess, 0
end start
390 / 323 / 19 Регистрация: 26.05.2009 Сообщений: 2,696 |
|
1 |
|
В массиве найти минимальный и максимальный элемент11.09.2012, 02:25. Показов 54138. Ответов 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 |
Ушел с форума 15873 / 7450 / 1008 Регистрация: 11.11.2010 Сообщений: 13,427 |
|
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 |
Ушел с форума 15873 / 7450 / 1008 Регистрация: 11.11.2010 Сообщений: 13,427 |
|
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___ Ушел с форума 15873 / 7450 / 1008 Регистрация: 11.11.2010 Сообщений: 13,427 |
||||
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 |
Ушел с форума 15873 / 7450 / 1008 Регистрация: 11.11.2010 Сообщений: 13,427 |
|
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 |
Собственно программа готова, но выводит ошибки. Ругается на len. Прошу помочь исправить программу. Заранее спасибо!
.386 .model flat,stdcall option casemap:none include d:masm32includekernel32.inc include d:masm32includemsvcrt.inc include d:masm32macrosmacros.asm includelib d:masm32libmsvcrt.lib includelib d:masm32libkernel32.lib .data array db 15,-100,50,0 len equ $ - array min db ? imin dw ? tpt db 'Result Min = al',0 .stack 100h .code start: mov ax,@data mov ds,ax mov cx,len dec cx xor di,di ; указатель на 1-й элемент, принятый за начальный минимум mov si,1 ; указатель на 2 элемент (его индекс 1) cycle: mov al,array[si] cmp al,array[di] jge next mov di,si next: inc si loop cycle mov imin,di ; запись индекса минимального элемента mov al,array[di] mov min,al ; запись значения минимального элемента ; ... mov ah,4ch int 21h invoke crt_printf, ADDR tpt, min invoke ExitProcess, 0 end start
Для начала разработаем блок-схему
1 Находим максималтный элемент
2 Находим минимальный элемент
3 Находим их разность
Теперь работаем :
data
caption db “prog”,0
text db “результат = %d”,0
tr db 100 DUP(?)
n dd 5,3,8,1,4,2,6,4,11,7
min dd 0
max dd 0
code
main:
mov esi,0
mov ecx,10
mov eax,[n+esi]
mov [min],eax
l1:
mov eax,[n+esi]
cmp eax,[min]
jnl m1
mov [min],eax
m1:
add esi,4
loop l1
invoke wsprintfA, addr tr, addr text,[min] ;находим минимум
invoke MessageBox, 0, addr tr, addr caption, 0
mov esi,0
mov ecx,10
mov eax,[n+esi]
mov [max],eax
l2:
mov eax,[n+esi]
cmp eax,[max]
jng m2
mov [max],eax
m2:
add esi,4
loop l2
invoke wsprintfA, addr tr, addr text,[max]
invoke MessageBox, 0, addr tr, addr caption, 0 ;находим максимум
mov eax,[min]
mov ebx,[max]
sub eax,ebx
invoke wsprintfA, addr tr, addr text,[min]
invoke MessageBox, 0, addr tr, addr caption, 0 ;находим их разность
invoke ExitProcess,0
end main
Вот и все.
Форум программистов Vingrad
Модераторы: Poseidon |
Поиск: |
|
[TASM] Нахождение минимального элемента массива, Минимальный элемент массива |
Опции темы |
avlzll |
|
||
Новичок Профиль Репутация: нет
|
Всем добрый день. Застопорился на простенькой задаче. Необходимо найти минимальный элемент массива. ( Y = min (X) ) Начало есть.
Дальше ясно, что надо организовать цикл, используя метки, cmp и условные переходы. Вопрос в том, как? Заранее спасибо за любую помощь. Это сообщение отредактировал(а) avlzll – 8.4.2009, 19:04 |
||
|
|||
Akina |
|
||
Советчик Профиль
Репутация: 17
|
PS. Проверять лень. ——————– О(б)суждение моих действий – в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция – Администрация форума. |
||
|
|||
avlzll |
|
||||
Новичок Профиль Репутация: нет
|
Спасибо за оперативный ответ Но в таком виде, увы, не компилируется.
В листинге вот что
|
||||
|
|||||
Akina |
|
||
Советчик Профиль
Репутация: 17
|
Да, вместо rep label0 должно быть loop label0. А уж остальное сам поправь, что надо сделать – очевидно… ——————– О(б)суждение моих действий – в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция – Администрация форума. |
||
|
|||
avlzll |
|
||
Новичок Профиль Репутация: нет
|
Да, остальные места тоже поправил и скомпилилось. Спасибо за помощь!
Насчет вывода на экран — как получится, ибо это всего лишь вторая в жизни программа на Асме 🙂 Пока с трудом идет. |
||
|
|||
|
Правила форума “Центр помощи” | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Центр помощи | Следующая тема » |