| 
			| 
					
						| 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   stackdw          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 - вызов удаленного кода, то есть кода расположенного в другом сегменте кода (для решения твоей задачи это не понадобиться).
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |