Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2012, 18:09   #1
gil9red
 
Регистрация: 22.01.2012
Сообщений: 6
По умолчанию Программа которая не работает (TASM)

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

Смысл задачи: есть два массива на 10 эл-тов, массивы однобайтовые,
нужно определить двухбайтовую сумма эл-тов, какого массива больше, и вывести на экран строку с соответствующим сообщением

Код:
.MODEL SMALL 
.STACK 100h 
.DATA

 mas1 db 2,3,1,1,4,5,2,1,2,2 
 mas2 db 4,1,1,4,4,3,3,5,1,2 

 msg1 db 'Mas1 > Mas2', 13, '$'
 msg2 db 'Mas2 > Mas1', 13, '$'

 sum1 dw ? 
 sum2 dw ? 
 
 count equ 10 
 i db 0

.CODE 
 start: 

 mov sum1, 0
 mov sum2, 0

 ; текущий индекс массива 
 mov i, 0

 ; кол-во повторений цикла 
mov cx, count 
 lall:  
 
 add sum1, mas1[i]
 add sum2, mas2[i]

 inc i 
 loop lall

 mov ax, sum1
 mov bx, sum2

 cmp ax, bx 
 JG end1 
 JL end2 

 end2: 
 mov dx, offset msg2 
 jmp endprog 

 end1: 
 lea dx, [msg1] 

 endprog: 
 mov ah,9h 
 int 21h 

 mov ah,1h 
 int 21h 
 ret 

 end start
gil9red вне форума Ответить с цитированием
Старый 22.01.2012, 18:22   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что отладчик показывает?
Меня смущает это место:
Цитата:
add sum1, mas1[i]
add sum2, mas2[i]
Без приведения типов тут по идее будет браться слово а не байт и массивов.
Отладчик есть? Пройдись им
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2012, 18:26   #3
gil9red
 
Регистрация: 22.01.2012
Сообщений: 6
По умолчанию

Я не проверял через отладчик, а делал компиляцию и компилятор показывает такую ошибку:
Can't add relative quantities - нельзя складывать относительные адреса

у меня не хватает знаний, чтобы исправить ошибку

Последний раз редактировалось gil9red; 22.01.2012 в 18:40.
gil9red вне форума Ответить с цитированием
Старый 22.01.2012, 18:32   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

С потолка:
Код:
 ; текущий индекс массива 

 ; кол-во повторений цикла 
mov cx, count 
 lall:  
 
 add sum1, byte [mas1+cx]
 add sum2, byte [mas2+cx]

 loop lall
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2012, 18:42   #5
gil9red
 
Регистрация: 22.01.2012
Сообщений: 6
По умолчанию

Stilet, объясни пожалуйста этот код

Код:
add sum1, byte [mas1+cx]
Код:
 add sum1, byte [mas1+cx]
 add sum2, byte [mas2+cx]
теперь компилятор высылает такую ошибку:
Operand types do not match

Последний раз редактировалось Stilet; 22.01.2012 в 18:59.
gil9red вне форума Ответить с цитированием
Старый 22.01.2012, 19:11   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот протестил эту прогу в фасме:
Код:
section '.data' data readable writeable

 mas1 db 2,3,1,1,4,5,2,1,2,2
 mas2 db 4,1,1,4,4,3,3,5,1,2 

 msg1 db 'Mas1 > Mas2', 13, '$'
 msg2 db 'Mas2 > Mas1', 13, '$'

 sum1 dw ? 
 sum2 dw ? 
 
 count equ 10 
 i db 0
start:

 xor ax,ax
 xor bx,bx

 ; кол-во повторений цикла 
mov ecx, count
lall:
 add al, [mas1+ecx-1]
 add bl, [mas2+ecx-1]
loop lall

 mov [sum1], ax
 mov [sum2], bx

ret
Только тут регистры 32-битные а у тебя 16-ти - поправишь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2012, 19:16   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
add al, [mas1+ecx-1]
Хе, а если в массивах будут числа >200 ?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 22.01.2012, 19:21   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
start:



 ; кол-во повторений цикла
mov ecx, count
lall:
  xor eax,eax
 mov al,[mas1+ecx-1]
  add [sum1],ax
 mov al,[mas2+ecx-1]
  add [sum2],ax

loop lall
ret
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2012, 19:32   #9
gil9red
 
Регистрация: 22.01.2012
Сообщений: 6
По умолчанию

попробовал заменить на 16битный регистр cx, но появляется ошибка индексирования:
illegal indexing mode

Код:
mov cx, count
lall:
 add al, [mas1+cx-1]
 add bl, [mas2+cx-1]
loop lall
я очень плохо знаю этот язык, буквально сегодня пришлось изучать,
в чем я не правильно сделал?

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

Последний раз редактировалось Stilet; 22.01.2012 в 21:04.
gil9red вне форума Ответить с цитированием
Старый 22.01.2012, 20:06   #10
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Код:
 xor	ax, ax
 xor	si, si
 mov cx, count 

 lall:  

 mov al, mas1[si]
 add sum1, ax
 mov al, mas2[si]
 add sum2, ax

 inc si
 loop lall
Вот так программа скомпилируется без ошибок.
Но работать будет неправильно, забыли настроить ds на .data
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов C-шной printf из ASM-программы (tasm). Не работает. Зойберг Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 04.11.2011 09:25
Программа работает, нужны коменты tASM edik12 Помощь студентам 0 14.04.2011 11:40
Почему программа на С++ не работает с локальным описанием массива, но работает с глобальным? >>STINGER<< Помощь студентам 4 08.03.2011 09:56
Программа на ассемблере (TASM) prostofilya Помощь студентам 0 27.06.2009 22:14
Как написать БД, которая работает везде? =) FeNr1z168 БД в Delphi 6 17.02.2009 08:48