Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2594
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2160
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1324
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1399
Дата выхода:14.12.2010, 21:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:224 / 66
Вопросов / ответов:1 / 1

Вопрос № 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 ; цикл продолжается, пока есть элементы.

NOP
END

Отправлен: 09.12.2010, 21:29
Вопрос задал: Посетитель - 348326 (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Посетитель - 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 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.25 от 13.12.2010

    В избранное