Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
CaH_CaHbl4
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
1

Определить, есть ли в массиве отрицательные элементы

06.04.2014, 18:49. Просмотров 855. Ответов 1
Метки нет (Все метки)

Задача:
Определить, есть ли в массиве отрицательные элементы

Сделано в Emu8086

Вот код:

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
org 100h
    jmp start 
;--------------------------------; 
;вывод результата
Ok       DB 'Все положительные',13,10,'$' 
NotOk    DB 'Есть отрицательные',13,10,'$'
Array    DW 310,-1,33,41,1                       ;Массив 
ArrayStr DB 'Массив: 310,-1,33,41,1','$'
CountEl  DW 5                                   ;размер массива
;--------------------------------; 
 
start:  
        lea si,Array 
        mov cx,CountEl
        mov ah,9
        mov dx,offset ArrayStr;           
        int 21h             
check:  
        cmp [si],0        
        jl M_notOk  ;if a[i]<0
        add si,2         
        loop check        
        mov  dx,offset Ok ;  
        jmp print               
M_notOk:
        mov  dx,offset NotOk         
print:  
        mov  ah,9           
        int  21h              
        mov  ah,4ch                 
        int  21h 
        mov  ah,10
        int  16h  
ret
 
end start
Теперь вопрос:
Есть строка кода
Assembler
1
2
3
4
5
.............
        .............
        add si,2         
       .............
        .............
Если здесь я напишу вместо 2 хоть 100, программа все равно работает правильно на некотором ряде тестов.
Тест для add si,1
Определить, есть ли в массиве отрицательные элементы

т.е программа фактически где-то встречает отрицательное число и отрабатывает правильно.

теперь ставим add si,2
Определить, есть ли в массиве отрицательные элементы

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

ставим add si,10
Определить, есть ли в массиве отрицательные элементы


О_О Как так?! он же уже точно должен был что то пропустить. Ну ладно.
ставим add si,100
как вы уже догадались, ррезультат такой же
Определить, есть ли в массиве отрицательные элементы


Только при add si,1000 появляется долгожданный пропус отрицательного элемента и программа делает ошибку
Определить, есть ли в массиве отрицательные элементы


Уважаемые гуру, помогите.
Ведь чую, что что-то важное недочитал или недоглядел.
Такие вопросы появились после того, как посмотрев примеры в интернете увидел строкуadd si,2
Сначала подумал что это норма, ведь массив объявлен через DW (2 байта), но потом проделав эксперименты понял, что тут что-то неладное.

Когда начал изучать ASM то помню, что в памяти массивы, объявленные таким образом
Assembler
1
array1 dw 1,2,3,4,5
В памяти идут не подряд
Определить, есть ли в массиве отрицательные элементы

т.е. логически правильно писать add si,2
Тогда почему при add si,4 все так же корректно работает

Спасибо заранее за все пояснения.

Добавлено через 12 минут
add si,103 - отрицательное пропускается, и программа говорит что все положительные
add si,102 - отрицательное видится, и программа говорит что есть отрицательные
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2014, 18:49
Ответы с готовыми решениями:

В массиве определить среднее арифметическое положительных чисел, все отрицательные элементы увеличить на это среднее
Добрый день. Нужно написать программу которая создаёт массив А . Которая определяет среднее...

В массиве все положительные элементы массива просуммировать, а отрицательные элементы удвоить
Добрый день, постановка задачи такая: Дан массив А(20). Все положительные элементы массива...

проверка на отрицательные элементы в массиве
Здравствуйте форумчане, нужна небольшая помощь как мне проверить массив на наличие отрицательных...

В одномерном массиве заменить отрицательные элементы нулями
В одномерном массиве заменить отрицательные элементы нулями.Подсчитать число замен. Массив задать в...

Определить, есть ли в массиве отрицательные элементы
1.формирование одномерного массива целых чисел 2.определить есть ли в этом массиве отрицательные...

1
CaH_CaHbl4
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
06.04.2014, 23:36  [ТС] 2
разобрался.

массив
1 -2 3 4 5 6 7
при mov si,2, вторым числом должно быть -2, т.е. все годно, сработает по отрицательной ветке.
если же сделать mov si,10, по идее он должен ПЕРЕСКОЧИТЬ второе отрицательное число и выдать, что все положительные.
мысль ясна?
на самом деле, пока проблемы излагал, немного начал понимать.
просто при таком шаге он вылазит где-то в область памяти, где полюбас встречается что-то отрицательное.
я сейчас цикл увеличил во много раз, в массиве оставил одни положительные, всего в массиве пять разных чисел, но цикл вылазит в область памяти, где массива то уже и нет.
вот где-то за границами памяти он и находит это отрицаьтельное
сейчас попробую при прыжке не на 2, а на 1, причем в конце будет что-то отрицательное.
предположение верное.
до конца массива недошел=> отрицательный элемент не увидел, в байтах, которые не надо было рассматривать нифига отрицательного не увидел
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2014, 23:36

Определить, есть ли в данном массиве отрицательные элементы, кратные К
3) Сформируйте массив из 15 целых чисел. Определить, есть ли в данном массиве отрицательные...

В массиве из 10 чисел есть положительные и отрицательные элементы
. В массиве из 10 чисел есть положительные и отрицательные элементы. Вычислить сумму положительных...

Определить, есть ли в массиве отрицательные числа (если да - определить номер первого из них)
Помогите пожалуйста написать программу на с++ через функцию! Дан массив вещественных чисел,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.