Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Суммирование отрицательных элементов массива  (Прочитано 17782 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dale
Гость
« : 27-10-2004 16:15 » 

Подскажите мне мою ошибку.
Данная программа должна выдать сумму всех отрицатльных элементов заданного массива в интервале от -4 до -15
Результат должен выводиться на экран.

model small
.data
mas  db -2,0,2,-7,8,-12,1,3,-9,-18,11,12,-15 ;Инициализируем массив. Размер каждого элемента байт
message db 'Сумма отрицательных элементов в интервале (-4,-15): $',0ah,0dh
.stack 256
.code
start:

mov ax,@data
mov ds,ax

mov cx,13       ;Значение счетчика цикла
mov dx,0
lea bx,mas

m1:  
mov ax,[bx]
    or  ax,ax
    cmp ax,15     ;сравнить al c 4
    jnle m2       ;перейти на метку если al=<-4
    cmp ax,4
    jnge m2       ;перейти на метку если al=>-15
    add ax,30h
    add dx,ax
m2:
inc bx          ;Переходим на следующий элемент массива
loop m1         ;В начало цикла, если cx не равен 0

mov bx,dx
mov ah,09h   ;Выводим сообщение message
lea dx,message
int 21h

mov dx,bx
mov ah,02h
add dx,30h
int 21h

exit:
mov ah,4ch
int 21h
end start

Количество отрицательных элементов массива считается правельно, если поставить счетчик
inc dx
вместо сумирования элементов. Само сумирование не идет


Пробовал считать сумму положительных элементов массива на интервале от 4 до 15

Количество элементов при этом считается правельно, но сумма не выводится.
Причем, в регистр dx записывается правельное значение суммы, но на экран оно не выводиться....


Подскажите кто что может....
Заранее спасибо
Записан
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 27-10-2004 17:45 » 

Ну ты чего-то с исходником наворотил прежде чем послать Улыбаюсь. Из того, что в текущем:
Код:
add ax,30h 
add dx,ax

получается, что ты считаешь непонятно что.
Код:

model small
.data
mas db -2,0,2,-7,8,-12,1,3,-9,-18,11,12,-15 ;Инициализируем массив. Размер каждого элемента байт
message db 'Сумма отрицательных элементов в интервале )-4,-15:{ $',0ah,0dh
.stack 256
.code
start{

mov ax,@data
mov ds,ax

mov cx,13 ;Значение счетчика цикла
mov dx,0
lea bx,mas

m1{
mov ax, bx
; or ax,ax лишнее по-моему
cmp ax, -15 ;сравнить al c 15
jl m2 ;перейти на метку если al=<-15
cmp ax, -4
jg m2 ;перейти на метку если al=>-4
; add ax,30h не пойму зачем {)
add dx,ax
m2{
inc bx ;Переходим на следующий элемент массива
loop m1 ;В начало цикла, если cx не равен 0

mov bx,dx
mov ah,09h ;Выводим сообщение message
lea dx,message
int 21h
 
mov ah,02h
mov dx,"код минуса" ; не помню конечно
int 21h

; теперь подготовим сумму к выводу
mov ax, dx
mov bx, 10
idiv bx
mov bx, ax
mov ah, 06h
mov dl, bl
add dl, 30h
int 21h
mov ah, 02h
mov dl, bh
add dl, 30h
int 21h

exit{
mov ah,4ch
int 21h
end start

Должно быть видимо вот так, или именно так и не работает?
Или не сумма нужна, а количество?

Ой, в первый раз забыл отформатировать и 30h прибавить перед выводом. Сейчас исправлю Улыбаюсь
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Dale
Гость
« Ответ #2 : 29-10-2004 12:22 » 

Дико извеняюсь за ту хрень, которую забыл удалить пред отправкой мессаги.
Это были эксперименты отчаянного меня.

Объясни логику того что ты делал при выводе символа наэкран

mov ah,02h
mov dx,"код минуса" ; не помню конечно
int 21h

; теперь подготовим сумму к выводу
mov ax, dx
mov bx, 10
idiv bx
mov bx, ax
mov ah, 06h
mov dl, bl
add dl, 30h
int 21h
mov ah, 02h
mov dl, bh
add dl, 30h
int 21h


Я что-то не совсем ето понял. И еще. Скажи не легче будет складывать модули элементов массива в цикле, а потом дописать "-" к числу, как впринципе ты и делаешь???

И еще вопрос, ассемблер может выводить отрицательные числа на экран??? Если  я не ошибаюсь разница между отрицательными и положительными цифрами заключается в старшем бите.... Как объеснить ассемблеру при выводе числа, что старший бит - знаковый???

И последний вопрос, но уже не по теме.....
есть строка. Я заменяю в ней определенные символы на другие. Как заменить мне определенные символы на "$"? Это же вроде как конец строки. Ассемблер это так и понимает и ничего хорошего не делает....
Пример последнего кода:

model small
.data
stroka db 'A gdo-tO LonDonskiy dogdy OK','$'
SMV DB '$'
.stack 256
.code
assume ds:@data, es:@data, ss:@data

start:
mov ax,@data
mov ds,ax
mov es,ax
lea bx,stroka       ;Пишем в di адрес нашей строки
mov cx,28           ;количество символов

m1:
    mov al,[bx]
    or  al,al
    cmp al,40h     ;сравнить al c
    jle m2            ;перейти на метку если
    cmp al,5Bh
    jge m2
   
mov al,25h         ;  Это код % Можно mov al,"%"
mov [bx],al


m2:
inc bx          ;Переходим на следующий элемент массива
loop m1         ;В начало цикла, если cx не равен 0

exit:            ;Вывод на экран результата и выход
mov ah,09h
lea dx,stroka

int 21h
mov ax,4c00h
int 21h

end start
Записан
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 29-10-2004 13:31 » 

Dale,
Цитата

Я что-то не совсем ето понял. И еще. Скажи не легче будет складывать модули элементов массива в цикле, а потом дописать "-" к числу, как впринципе ты и делаешь???

Фиг его знает, но я об этом не подумал Улыбаюсь И кстати у меня еще одна ошибка, при знаковом делении, частное получиться со знаком, а остаток без, поэтому частное нужно neg вот здесь:
Код:

; теперь подготовим сумму к выводу
mov ax, dx
mov bx, 10
idiv bx
mov bx, ax
mov ah, 06h
mov dl, bl
neg dl ; здесь исправлено
add dl, 30h
int 21h
mov ah, 02h
mov dl, bh
add dl, 30h
int 21h

 Фигня в том, что ассемблер, вообще не может выводить числа на экран самостоятельно, нужно превращать числа в символы и уже символы выводить на экран, что я собственно и делаю в этом куске кода. Сумма может быть двузначной, применим целочисленное деление на 10, в частном получим десятки, а в остатке единицы. Дорисовываем минус и выводим сначала десятки, потом единицы. 30h - это код нуля, если его прибавить к цифре, получим код этой цифры.
Цитата

И последний вопрос, но уже не по теме.....
есть строка. Я заменяю в ней определенные символы на другие. Как заменить мне определенные символы на "$"? Это же вроде как конец строки. Ассемблер это так и понимает и ничего хорошего не делает....

Если честно, то по-моему никак   Вот такой я вот  Надо не использовать стандартные функции строковой обработки, а написать свои. Но я могу и ошибаться.
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Dale
Гость
« Ответ #4 : 29-10-2004 13:58 » 

Конечный код:
model small
.data
mas db -2,0,2,-7,8,-12,1,3,-9,-18,11,12,-15 ;Инициализируем массив. Размер каждого элемента байт
message db 'Сумма отрицательных элементов в интервале (-4,-15): $',0ah,0dh
.stack 256
.code
start:

mov ax,@data
mov ds,ax

mov cx,13    ;Значение счетчика цикла
mov dx,0
lea bx,mas
m1:
mov al,[bx]
or al,al
cmp al,-4
jnle m2
cmp al,-15
jnge m2
add dx,ax

m2:
inc bx
loop m1

mov bx,dx
mov ah,09h    ;Выводим сообщение message
lea dx,message
int 21h


mov dx,bx
; теперь подготовим сумму к выводу
mov ax,dx
mov bx,10h
idiv bx
;mov bx, ax
;mov ah, 06h
;mov dl, bl
;neg dl           ; здесь исправлено
;add dl, 30h
;int 21h
;mov ah, 02h
;mov dl, bh
;add dl, 30h
;int 21h


;mov ah,02h
;add dl,30h
;int 21h

exit:
mov ah,4ch
int 21h
end start
Компиляция идет нормально. При выполнении программы выдается
Divide overflow

Я так понимаю - это переполнение. Ошибка возникает при делении на 10
Записан
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 29-10-2004 14:06 » 

Все может быть Улыбаюсь я же не тестирую код. Попробуй
mov bl, 10
idiv bl
Ой-ей-ей ты же делишь на шестнадцать
Цитата

mov bx,10h
idiv bx

Тогда напиши mov bl, 0Ah или все-таки просто 10
или можно neg ax, а потом div bl. Тогда не надо будет думать о знаках остатка и частного. Даже наверное лучше так сделать.
Еще можешь понавтыкать отладочные сообщения, хотя в данном случае и так ясно, что переполнение при делении
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines