Anarky
Постоялец
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
|
|
« Ответ #1 : 02-10-2009 03:52 » |
|
Anarky, "чё" - описано в ошибке. Лезь в гугль и смотри перевод, коли не знаешь.
Загляни в справочник команд - посмотри команду add для 16-битных операндов.
Где инициализация?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #2 : 02-10-2009 06:52 » |
|
.code next: mov dl,[bx+di]
Хм, а что находится в регистрах bx и di? Где lea?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Anarky
Постоялец
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
|
|
« Ответ #4 : 03-10-2009 11:47 » |
|
Anarky, у Тебя не инициализирован регистр сегмента данных DS. Для начала Тебе надо его инициализировать: и после этого уже обращаться к массиву.
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #5 : 03-10-2009 11:54 » |
|
Anarky, а если честно то у Тебя полная чепуха написана. После команды 'jl sum' у тебя выполнение программы убежит неизвестно куда.
|
|
|
Записан
|
|
|
|
Anarky
Постоялец
Offline
|
|
« Ответ #6 : 03-10-2009 12:12 » |
|
Anarky, а если честно то у Тебя полная чепуха написана. После команды 'jl sum' у тебя выполнение программы убежит неизвестно куда.
так и происходит))) почитал о циклах, чувствую loop надо использовать...
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #7 : 03-10-2009 13:09 » |
|
Anarky, нет разницы, использовать loop или условный переход. Надо просто понимать, что ты делаешь: сперва думаем, потом пишем.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Anarky
Постоялец
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
|
|
« Ответ #9 : 03-10-2009 13:35 » |
|
Anarky, все что ты написал даже смотреть не хочется. Ты приведи код к удобочитаемому виду и показывай всю программу а не куски из нее.
У тебя в третьем посте нормальный код, его просто причесать немного надо и добавить инструкции 3 - 4 и все работать будет.
|
|
|
Записан
|
|
|
|
Anarky
Постоялец
Offline
|
|
« Ответ #10 : 03-10-2009 13:44 » |
|
Anarky, все что ты написал даже смотреть не хочется. Ты приведи код к удобочитаемому виду и показывай всю программу а не куски из нее.
У тебя в третьем посте нормальный код, его просто причесать немного надо и добавить инструкции 3 - 4 и все работать будет.
инструкции 3-4: указать что делать если элемент >0 или =0, правильно?
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #11 : 03-10-2009 13:49 » |
|
инструкции 3-4: указать что делать если элемент >0 или =0, правильно?
Ты хочешь здесь в ответы вопросы поиграть? Ну давай поиграем. Ответ: нет.
|
|
|
Записан
|
|
|
|
Anarky
Постоялец
Offline
|
|
« Ответ #12 : 03-10-2009 13:52 » |
|
инструкции 3-4: указать что делать если элемент >0 или =0, правильно?
Ты хочешь здесь в ответы вопросы поиграть? Ну давай поиграем. Ответ: нет. тогда вопрос: что это за инструкции?
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #13 : 03-10-2009 13:53 » |
|
тогда вопрос: что это за инструкции?
Инструкции ассемблера. Очевидно же.
|
|
|
Записан
|
|
|
|
Anarky
Постоялец
Offline
|
|
« Ответ #14 : 03-10-2009 14:03 » |
|
это моя первая в жизни программа на ассемблере, а ты глумишься. это жестоко, либо подскажи, либо ничего не пиши...
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #15 : 03-10-2009 14:05 » |
|
это моя первая в жизни программа на ассемблере, а ты глумишься. это жестоко, либо подскажи, либо ничего не пиши...
Ты хочешь что бы за Тебя написали данную программу?
|
|
|
Записан
|
|
|
|
Sel
Злобный
Администратор
Offline
|
|
« Ответ #16 : 03-10-2009 14:09 » |
|
Serg79, видимо, именно этого он и хочет...
|
|
|
Записан
|
Слово не воробей. Всё не воробей, кроме воробья.
|
|
|
Anarky
Постоялец
Offline
|
|
« Ответ #17 : 03-10-2009 14:15 » |
|
Serg79, скажи почему он все элементы складывает, а не отрицательные... я исправлю
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #18 : 03-10-2009 14:24 » |
|
Anarky, у Тебя вообще не понятно, что складывается, так как у Тебя не инициализирован сегмент данных. 1 - Ты сначала инициализируй его и попробуй запустить программу еще раз. 2 - Потом покажи весь получившийся код (не забудь оформить его должным образом) и задавай свои вопросы. После этого, я думаю, процесс нахождения истины пойдет быстрее. P.S. все, что я сказал относится к 3 посту. То что написано тобой после, даже смотреть не хочется.
|
|
« Последнее редактирование: 04-10-2009 06:18 от Sel »
|
Записан
|
|
|
|
Anarky
Постоялец
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
программа работаетя указал, чтоб отрицательные складывались: А программа складывает все элементы. ответ должен быть -6, а получается 4
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #20 : 03-10-2009 14:55 » |
|
Anarky, я не знаю что у Тебя работает. Вообще то что бы что то работало с начало надо указать какую модель памяти будет использовать твоя программа, директива .model. Далее, определить размер стека, директива .stack. Далее, определить по необходимости (тебе это надо сделать) начало сегмента данных, директива .data. После отметить начало сегмента кода, директива .code.
Всего этого я у Тебя не вижу и поэтому я не понимаю что у Тебя может работать.
|
|
|
Записан
|
|
|
|
Anarky
Постоялец
Offline
|
|
« Ответ #21 : 03-10-2009 15:06 » |
|
я все это компилирую через tasm, а запускаю турбодебагером, и просматриваю по шагам (F7) содержимое dx...
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #22 : 03-10-2009 15:14 » |
|
Anarky а какая разница, что tasm, что masm используют одинаковые имена для сегментов и у них одинаковый синтаксис.
|
|
|
Записан
|
|
|
|
Anarky
Постоялец
Offline
|
|
« Ответ #23 : 03-10-2009 15:28 » |
|
именно поэтому пишет: program has no symbol table при запуске и: terminated, exit code 0 но по шагам все пашет, пока мой цикл не выполнится))))
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #24 : 03-10-2009 15:46 » |
|
Да Anarky. Именно поэтому я тебе говорю что бы ты с начало оформил код как положено (как того требует среда исполнения и компилятор), а уж потом начал разбираться с остальными проблемами.
|
|
|
Записан
|
|
|
|
|
Serg79
|
|
« Ответ #26 : 03-10-2009 16:20 » |
|
Давай Anarky, удачи тебе в твоих начинаниях.
|
|
|
Записан
|
|
|
|
Anarky
Постоялец
Offline
|
|
« Ответ #27 : 03-10-2009 16:57 » |
|
Serg79, почитал про модель памяти, они могут быть: tiny, small, medium,compact,large, flat но ничего не понял про тип кода и данных: near, far объясни пожалуйста на пальцах что это такое
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #28 : 03-10-2009 17:06 » |
|
Это английские слова: near - близкий, far - дальний. В архитектуре x86 используются сегменты. Адресация без указания сегмента (точнее, неявно используется сегмент, загруженный в регистр DS, ES или SS - в зависимости от команды) - это ближняя адресация, полное указание сегмента и смещения - это дальняя адресация.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Serg79
|
|
« Ответ #29 : 03-10-2009 17:11 » |
|
Anarky, если кратко: tyny - код и данные вместе должны занимать не более 64 Кбайт small - код <= 64 Кбайт, данные <= 64 Кбайт. Один сегмент кода, один сегмент данных. medium - данные <= 64 Кбайт, код любого размера. Много сегментов кода, один сегмент данных. compact - код <= 64 Кбайт, данные любого размера. Один сегмент кода, много сегментов данных. large - код > 64 Кбайт, данные > 64 Кбайт. Много сегментов кода и данных. flat - Нет сегментов. 32-разрядная адресация используется как для кода, так и для данных. Только защищенный режим.
near - вызов кода находящегося в том же сегменте кода. far - вызов удаленного кода, то есть кода расположенного в другом сегменте кода (для решения твоей задачи это не понадобиться).
|
|
|
Записан
|
|
|
|
|