Вопрос № 181185: Здравствуйте, уважаемые эксперты! Помогите пожалуйста с решением задачи, изложенной ниже. Решение я нашел, но оно не работает. В чем ошибка? Сложение N (N<16) двухбайтных чисел. Числа должны располагаться во внутренней или внешней памяти, н...
Вопрос № 181185:
Здравствуйте, уважаемые эксперты! Помогите пожалуйста с решением задачи, изложенной ниже. Решение я нашел, но оно не работает. В чем ошибка?
Сложение N (N<16) двухбайтных чисел. Числа должны располагаться во внутренней или внешней памяти, начиная с определенного адреса. результат должен фиксироваться в регистрах R0 - R7 или ячейках внутренней памяти. Решение задачи: NAME LABORATORNAJA 1
DSEG AT 30h ; задаем начало сегмента внутренней памяти данных с адреса 30h. CSEG AT 0h ; задаем
начало сегмента памяти программ с адреса 0h.
mov r0, #30h mov r1, #40h ; задаем начальные адреса ячеек внутренней памяти для хранения младших и старших байтов (соответственно) складываемых чисел.
mov 30h, 0FFh ; сохраняем в ячейке с адресом #30h младший байт 1-го слагаемого. mov 31h, 0F2h ; -//- младший байт 2-го слагаемого. mov 32h, 01Fh ; -//- младший байт 3-го слагаемого. mov 33h, 0ABh ; -//- младший байт 4-го слагаемого.
mov 40h, 0F3
h ; сохраняем в ячейке с адресом #40h старший байт 1-го слагаемого. mov 41h, 0FFh ; -//- старший байт 2-го слагаемого. mov 42h, 053h ; -//- старший байт 3-го слагаемого. mov 43h, 0BFh ; -//- старший байт 4-го слагаемого.
clr a mov r4, a mov r3, a mov r2, a ; очищаем аккумулятор и рабочие регистры. mov r7, #4 ; задаем счетчик цикла, равный числу слагаемых.
sum: ; цикл подсчета суммы. результат получаем в виде r2r3r4.
clr c ; очищаем байт переноса. mov a, @r0 ; считываем
младший байт очередного элемента. add a, r4 ; складываем младшие байты суммы и очередного элемента. mov r4, a ; сохраняем результат младшего байта в регистре r4. inc r0 ; подготавливаем младший байт следующего слагаемого.
mov a, @r1 ; считываем старший байт очередного элемента. addc a, r3 ; складываем старшие байты суммы и очередного элемента, с учетом переноса от младшего разряда. mov r3, a ; сохраняем результат старшего байта в регистре r4
. inc r1 ; подготавливаем старший байт следующего слагаемого.
clr a ; очищаем аккумулятор. addc a, r2 ; добавляем к результату перенос от сложения старших байтов. mov r2, a ; сохраняем старший разряд результата.
djnz r7, sum ; цикл продолжается, пока есть элементы.
Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Посетитель - 348326! Ваша ошибка была в том, что, вместо отрицательный чисел, Вы складывали большие положительные Проблема решается сложением (в последнем случае) не с 0, а с сформированным знаковым байтом очередного числа
Код:
;Сложение N (N<16) двухбайтных чисел. ;Числа должны располагаться во внутренней или внешней памяти, ;начиная с определенного адреса. результат должен фиксироваться ;в регистрах R0 - R7 или ячейках внутренней памяти. NAME LABORATORNAJA 1
DSEG AT 30h ;задаем начало сегмента внутренней памяти данных с адреса 30h. CSEG AT 0h ;задаем начало сегмента памяти програм
м с адреса 0h.
mov r0, #30h mov r1, #40h ;задаем начальные адреса ячеек внутренней памяти ;для хранения младших и старших байтов (соответственно) складываемых чисел.
mov 30h, 0FFh ;сохраняем в ячейке с адресом #30h младший байт 1-го слагаемого. mov 31h, 0F2h ;-//- младший байт 2-го слагаемого. mov 32h, 01Fh ;-//- младший байт 3-го слагаемого. mov 33h, 0ABh ;-//- младший байт 4-го слагаемого.
mov 40h, 0F3h ;сохраняем в ячейке с адресом #40h старший байт 1-го слагаемого. mov
41h, 0FFh ;-//- старший байт 2-го слагаемого. mov 42h, 053h ;-//- старший байт 3-го слагаемого. mov 43h, 0BFh ;-//- старший байт 4-го слагаемого.
clr a mov r4, a mov r3, a mov r2, a ; очищаем аккумулятор и рабочие регистры. mov r7, #4 ; задаем счетчик цикла, равный числу слагаемых.
sum: ;цикл подсчета суммы. результат получаем в виде r2r3r4.
clr c ;очищаем байт переноса. mov a, @r0 ;считываем младший байт очередного элем
ента. add a, r4 ;складываем младшие байты суммы и очередного элемента. mov r4, a ;сохраняем результат младшего байта в регистре r4. inc r0 ;подготавливаем младший байт следующего слагаемого.
mov a, @r1 ;считываем старший байт очередного элемента.
;сформируем третий, знаковый байт слагаемого mov r5, #0 ;считаем пока, что положительное число jnb acc.7, add_hi ;проверим знаковый разряд старшего байта dec r5 ;r5 = 0ffh - распространяем знаковый разряд (dec на С не влияет)
add_hi: ;складываем
старший байт
addc a, r3 ;складываем старшие байты суммы и очередного элемента, с учетом переноса от младшего разряда. mov r3, a ;сохраняем результат старшего байта в регистре r4. inc r1 ;подготавливаем старший байт следующего слагаемого.
mov a, r5 ;знаковый, третий байт слагаемого addc a, r2 ;добавляем к результату перенос от сложения старших байтов. mov r2, a ;сохраняем старший разряд результата.
djnz r7, sum ;ц
икл продолжается, пока есть элементы.
NOP END
----- Люби своего ближнего, как самого себя
Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 10.12.2010, 05:35
Номер ответа: 264623 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 264623
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.