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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: [asm] Суммирование отрицательных членов массива  (Прочитано 79395 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
Anarky
Постоялец

ru
Offline Offline

« : 01-10-2009 21:38 » 

дан массив из восьми элементов:
-3,-2,-1,0,1,2,3,4
прога должна складывать отрицательные элементы
написал так, чтобы ответ был в ax
правильный ответ: -6 (ax=fffa)
вот код:
model small
.486
.data 
 
 mas   db -3,-2,-1,0,1,2,3,4
   .code 
next:
   mov dl,[bx+di]   ; берем элемент из массива в dl
   inc di                 ; увеличиваем счетчик
   cmp dl,0            ; сравниваем dl с нулем
   jl sum                ; если меньше нуля то sum
   jge next             ; если равен или больше то берем след элемент
 sum:
   add ax,dl
 end  sum
end next
Подскажите что не так? в sum пишет ошибку **Error** masv.asm(16) Operand types do   not match
Правильно ли отрицательные элементы складываю?
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #1 : 02-10-2009 03:52 » 

Anarky, "чё" - описано в ошибке. Лезь в гугль и смотри перевод, коли не знаешь.

Загляни в справочник команд - посмотри команду add для 16-битных операндов.

Где инициализация?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

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

« Ответ #2 : 02-10-2009 06:52 » 

Цитата: Anarky
Код:
.code  
next:
   mov dl,[bx+di]
Хм, а что находится в регистрах bx и di? Где lea?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Anarky
Постоялец

ru
Offline Offline

« Ответ #3 : 02-10-2009 15:23 » 

model small
.486
.data  
 
 mas   db -3,-2,-1,0,1,2,3,4
   .code
    
next:
   mov di,0
   mov bx,offset mas
   mov cx,[bx+di]   ; берем элемент из массива в dl
   inc di                 ; увеличиваем счетчик
   cmp cx,0            ; сравниваем dl с нулем
   jl sum                ; если меньше нуля то sum
   jge next             ; если равен или больше то берем след элемент
 sum:
add ax,cx
end  sum
end next
Компилируется без ошибок, но при запуске выдает ошибку.
Мне кажется, я неправильно выбираю элемент массива...

Anarky, "чё" - описано в ошибке. Лезь в гугль и смотри перевод, коли не знаешь.

Загляни в справочник команд - посмотри команду add для 16-битных операндов.

Где инициализация?
Спасибо, намек понял.)))  Пытался сложить imm8 и imm16
« Последнее редактирование: 02-10-2009 18:52 от Sel » Записан
Serg79
Команда клуба

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

WWW
« Ответ #4 : 03-10-2009 11:47 » 

Anarky, у Тебя не инициализирован регистр сегмента данных DS. Для начала Тебе надо его инициализировать:
Код:
mov ax, @data
mov ds, ax
и после этого уже обращаться к массиву.
Записан
Serg79
Команда клуба

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

WWW
« Ответ #5 : 03-10-2009 11:54 » 

Anarky, а если честно то у Тебя полная чепуха написана. После команды 'jl sum' у тебя выполнение программы убежит неизвестно куда.
Записан
Anarky
Постоялец

ru
Offline Offline

« Ответ #6 : 03-10-2009 12:12 » 

Anarky, а если честно то у Тебя полная чепуха написана. После команды 'jl sum' у тебя выполнение программы убежит неизвестно куда.
так и происходит))) почитал о циклах, чувствую loop надо использовать...
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #7 : 03-10-2009 13:09 » 

Anarky, нет разницы, использовать loop или условный переход. Надо просто понимать, что ты делаешь: сперва думаем, потом пишем.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Anarky
Постоялец

ru
Offline Offline

« Ответ #8 : 03-10-2009 13:30 » 

я поправил программу:
stseg       segment     para   stack
           dw          16      dup(?)
stseg       ends
dseg        segment     para
 mas   dw -3,-2,-1,0,1,2,3,4
 otv     dw ?
 dseg        ends
cseg        segment     para
next      proc        far
                assume  cs:cseg,ds:dseg,ss:stseg
            push ds
            mov ax,0
            push ax
         mov ax,dseg
          mov ds,ax
;++++++++++++++++++++++++++++++++++++++++
   mov cx,8
   mov ax,0
   mov dx,0
   mov bx,offset mas
cikl:  mov ax,[bx]   ; берем элемент из массива 
      cmp ax,0            ; сравниваем ax с нулем
   jl sum                ; если меньше нуля то sum
  sum:
   mov otv,ax
   add dx,otv
   inc bx
   inc bx
   loop cikl
;++++++++++++++++++++++++++++++++++++++++
ret
next endp
cseg ends
     end next

указываю чтоб отрицательные складывал: (jl sum), а складываются все элементы массива((((
почему так?Не понял
Записан
Serg79
Команда клуба

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

WWW
« Ответ #9 : 03-10-2009 13:35 » 

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

У тебя в третьем посте нормальный код, его просто причесать немного надо и добавить инструкции 3 - 4 и все работать будет.
Записан
Anarky
Постоялец

ru
Offline Offline

« Ответ #10 : 03-10-2009 13:44 » 

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

У тебя в третьем посте нормальный код, его просто причесать немного надо и добавить инструкции 3 - 4 и все работать будет.
инструкции 3-4: указать что делать если элемент >0 или =0, правильно?
Записан
Serg79
Команда клуба

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

WWW
« Ответ #11 : 03-10-2009 13:49 » 

инструкции 3-4: указать что делать если элемент >0 или =0, правильно?
Ты хочешь здесь в ответы вопросы поиграть? Ну давай поиграем. Улыбаюсь

Ответ: нет.
Записан
Anarky
Постоялец

ru
Offline Offline

« Ответ #12 : 03-10-2009 13:52 » 

инструкции 3-4: указать что делать если элемент >0 или =0, правильно?
Ты хочешь здесь в ответы вопросы поиграть? Ну давай поиграем. Улыбаюсь

Ответ: нет.

тогда вопрос: что это за инструкции?
Записан
Serg79
Команда клуба

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

WWW
« Ответ #13 : 03-10-2009 13:53 » 

тогда вопрос: что это за инструкции?
Инструкции ассемблера. Очевидно же.
Записан
Anarky
Постоялец

ru
Offline Offline

« Ответ #14 : 03-10-2009 14:03 » 

это моя первая в жизни программа на ассемблере, а ты глумишься. это жестоко, либо подскажи, либо ничего не пиши...
Записан
Serg79
Команда клуба

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

WWW
« Ответ #15 : 03-10-2009 14:05 » 

это моя первая в жизни программа на ассемблере, а ты глумишься. это жестоко, либо подскажи, либо ничего не пиши...
Ты хочешь что бы за Тебя написали данную программу?
Записан
Sel
Злобный
Администратор

ru
Offline Offline

« Ответ #16 : 03-10-2009 14:09 » 

Serg79, видимо, именно этого он и хочет...
Записан

Слово не воробей. Всё не воробей, кроме воробья.
Anarky
Постоялец

ru
Offline Offline

« Ответ #17 : 03-10-2009 14:15 » 

Serg79, скажи почему он все элементы складывает, а не отрицательные... я исправлю
Записан
Serg79
Команда клуба

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

WWW
« Ответ #18 : 03-10-2009 14:24 » 

Anarky, у Тебя вообще не понятно, что складывается, так как у Тебя не инициализирован сегмент данных.
1 - Ты сначала инициализируй его и попробуй запустить программу еще раз.
2 - Потом покажи весь получившийся код (не забудь оформить его должным образом) и задавай свои вопросы.

После этого, я думаю, процесс нахождения истины пойдет быстрее.

P.S. все, что я сказал относится к 3 посту. То что написано тобой после, даже смотреть не хочется.
« Последнее редактирование: 04-10-2009 06:18 от Sel » Записан
Anarky
Постоялец

ru
Offline Offline

« Ответ #19 : 03-10-2009 14:45 » 

Код:
stseg       segment     para   stack
           dw          16      dup(?)
stseg       ends
dseg        segment     para
 mas   dw -3,-2,-1,0,1,2,3,4
 otv     dw ?
 dseg        ends
cseg        segment     para
next      proc        far
                assume  cs:cseg,ds:dseg,ss:stseg
            push ds
            mov ax,0
            push ax
         mov ax,dseg
          mov ds,ax
;++++++++++++++++++++++++++++++++++++++++
   mov cx,8
   mov ax,0
   mov dx,0
   mov bx,offset mas
cikl:  mov ax,[bx]   ; берем элемент из массива 
      cmp ax,0            ; сравниваем ax с нулем
   jl sum                ; если меньше нуля то sum
  sum:
   mov otv,ax
   add dx,otv
   inc bx
   inc bx
   loop cikl
;++++++++++++++++++++++++++++++++++++++++
ret
next endp
cseg ends
     end next
программа работает
я указал, чтоб отрицательные складывались:
Код:
 cmp ax,0 
 jl sum
А программа складывает все элементы. ответ должен быть -6, а получается 4
Записан
Serg79
Команда клуба

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

WWW
« Ответ #20 : 03-10-2009 14:55 » new

Anarky, я не знаю что у Тебя работает. Вообще то что бы что то работало с начало надо указать какую модель памяти будет использовать твоя программа, директива .model. Далее, определить размер стека, директива .stack. Далее, определить по необходимости (тебе это надо сделать) начало сегмента данных, директива .data. После отметить начало сегмента кода, директива .code.

Всего этого я у Тебя не вижу и поэтому я не понимаю что у Тебя может работать.
Записан
Anarky
Постоялец

ru
Offline Offline

« Ответ #21 : 03-10-2009 15:06 » 

я все это компилирую через tasm, а запускаю турбодебагером, и просматриваю по шагам (F7) содержимое dx...
Записан
Serg79
Команда клуба

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

WWW
« Ответ #22 : 03-10-2009 15:14 » 

Anarky а какая разница, что tasm, что masm используют одинаковые имена для сегментов и у них одинаковый синтаксис.
Записан
Anarky
Постоялец

ru
Offline Offline

« Ответ #23 : 03-10-2009 15:28 » 

именно поэтому пишет: program has no symbol table при запуске
и: terminated, exit code 0
но по шагам все пашет, пока мой цикл не выполнится))))
Записан
Serg79
Команда клуба

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

WWW
« Ответ #24 : 03-10-2009 15:46 » 

Да Anarky. Именно поэтому я тебе говорю что бы ты с начало оформил код как положено (как того требует среда исполнения и компилятор), а уж потом начал разбираться с остальными проблемами.
Записан
Anarky
Постоялец

ru
Offline Offline

« Ответ #25 : 03-10-2009 16:16 » 

этого я не знаю, пойду читать книжку RTFM
Записан
Serg79
Команда клуба

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

WWW
« Ответ #26 : 03-10-2009 16:20 » 

Давай Anarky, удачи тебе в твоих начинаниях.
Записан
Anarky
Постоялец

ru
Offline Offline

« Ответ #27 : 03-10-2009 16:57 » 

Serg79, почитал про модель памяти, они могут быть:
tiny, small, medium,compact,large, flat
но ничего не понял про тип кода и данных: near, far
объясни пожалуйста на пальцах что это такое А черт его знает...
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #28 : 03-10-2009 17:06 » 

Это английские слова: near - близкий, far - дальний.
В архитектуре x86 используются сегменты. Адресация без указания сегмента (точнее, неявно используется сегмент, загруженный в регистр DS, ES или SS - в зависимости от команды) - это ближняя адресация, полное указание сегмента и смещения - это дальняя адресация.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

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

WWW
« Ответ #29 : 03-10-2009 17:11 » 

Anarky, если кратко:
tyny - код и данные вместе должны занимать не более 64 Кбайт
small - код <= 64 Кбайт, данные <= 64 Кбайт. Один сегмент кода, один сегмент данных.
medium - данные <= 64 Кбайт, код любого размера. Много сегментов кода, один сегмент данных.
compact - код <= 64 Кбайт, данные любого размера. Один сегмент кода, много сегментов данных.
large - код > 64 Кбайт, данные > 64 Кбайт. Много сегментов кода и данных.
flat - Нет сегментов. 32-разрядная адресация используется как для кода, так и для данных. Только защищенный режим.

near - вызов кода находящегося в том же сегменте кода.
far - вызов удаленного кода, то есть кода расположенного в другом сегменте кода (для решения твоей задачи это не понадобиться).
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines