Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 01.11.2020
Сообщений: 10
1

Сложение чисел со знаком Atmega128

06.05.2021, 21:50. Показов 1165. Ответов 4
Метки нет (Все метки)

Необходимо реализовать следующее выражение: -260+1 в коде ассемблера для мк Atmega128 в программе MicroChip Studio 7. С ассемблером впервые познакомился сегодня, весь день ломал голову как это написать, результат получился следующий:
Код
	.include "m128def.inc" ; подключение заголовочного файла Atmega128, в котором хранятся адреса и имена регистров
	.def tmp=R16 ; назначаем регистру символическое имя
start:
	; инициализация стека
	ldi tmp, low(ramend) ; младший байт конечного адреса ОЗУ в R16
	out SPL, tmp ; установка младшего байта указателя стека
	ldi tmp, high(ramend) ; старший байт конечного адреса ОЗУ в R16
	out SPH, tmp ; установка старшего байта указателя стека

	ldi tmp,0 ; загружаем число 0 в регистр R16
	ldi R17, -255 ; загружаем число -255 в регистр R17
	ldi R18, -5 ; загружаем число -5 в регистр R20
	adc R17,R18 ; складываем -255 и -5
	sub tmp,R17 ; вычитаем -255 из 0
	push tmp ; помещаем сумму в стек
	ldi R19,1 ; загружаем число 1 в регистр R19
	add tmp,R19 ; складываем R16 с числом 1
	mov R0,tmp ; полученыый результат заносим в регистр R0
rjmp start
Число -260 в регистр не влазит, так как мк восьмиразрядный, появилась мысль взять числа -255 и -5 и сложить их, возникает переполнение, но результат ни к чему не приводит. Как правильно реализовать код так и не понял. Подскажите пожалуйста, как реализовать это выражение, а то мыслей больше вообще пока нет
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2021, 21:50
Ответы с готовыми решениями:

Определение суммы массива из N целых чисел со знаком (ATmega128)
найти сумму массива из N целых чисел со знаком, представленных в дополнительном коде и...

MMX-сложение чисел со знаком
вобщем используя MMX нужно сложить два массива в третий .686 .model flat,stdcall .MMX option...

Сложение двух чисел со знаком
Нужно написать программу,которая складывает 2 переменные 32-разрядные со знаком. Используем...

Написать программу на Ассемблере,которая реализует символьное сложение целых десятичных чисел со знаком , соде
Написать программу на Ассемблере,которая реализует символьное сложение целых десятичных чисел со...

4
Модератор
Эксперт по электронике
8402 / 6243 / 840
Регистрация: 14.02.2011
Сообщений: 21,654
06.05.2021, 22:53 2
Цитата Сообщение от AndreX_ Посмотреть сообщение
появилась мысль взять числа -255
покажи его в двоичном коде
0
464 / 242 / 51
Регистрация: 21.09.2008
Сообщений: 839
07.05.2021, 12:13 3
Пары 8-разрядных регистров R18:R17 хватит на отображение отрицательных чисел в диапазоне -32768..+32767, включая 0. Старший бит R18 будет признаком отрицательности целого числа, представленного в дополнительном коде. Подробности здесь.
0
0 / 0 / 0
Регистрация: 01.11.2020
Сообщений: 10
07.05.2021, 13:37  [ТС] 4
Спасибо! Насколько я понимаю, мне необходимо число 260 (0000 0001 0000 0100) разбить на сумму (255+5) так как 260 я записать не могу. В результате суммы этих двух чисел у меня в регистре R17 будет храниться старший бит числа 260 (0000 0001), а в регистре R16 младший (0000 0100), соответственно дальнейшее прибавление единички будет с участием регистра R16 (0000 0100 + 0000 0001 = 0000 0101). Правильно ли я понимаю? Вопрос теперь только в том, как реализовать это в коде.. Пишу вот так, но понимаю что пишу не правильно. В чем может быть ошибка, куда смотреть? Опыта с ассемблером вообще нет, поэтому даётся тяжеловато
Код
        .include "m128def.inc" ; подключение заголовочного файла Atmega128, в котором хранятся адреса и имена регистров
        ldi R16, low(ramend) ; младший байт конечного адреса ОЗУ в R16
	out SPL, R16 ; установка младшего байта указателя стека
	ldi R17, high(ramend) ; старший байт конечного адреса ОЗУ в R17
	out SPH, R17 ; установка старшего байта указателя стека

        ldi R17, 255 ; загружаем число 255 в регистр R17
	ldi R16, 5 ; загружаем число 5 в регистр R26
	adc R17,R16 ; складываем 255 и 5
	neg R17 ; меняем знак суммы
	
	ldi R19,1 ; загружаем число 1 в регистр R19
	add R16,R19 ; складываем R16 с числом 1
	mov R0,R16 ; полученыый результат заносим в регистр R0
rjmp start
0
464 / 242 / 51
Регистрация: 21.09.2008
Сообщений: 839
07.05.2021, 18:46 5
Лучший ответ Сообщение было отмечено AndreX_ как решение

Решение

AndreX_, настройка регистровой пары (в данном случае SPH:SPL, но принцип применим и к другим) должна выполняться в определённой последовательности: сначала записывают значение в старшую половину регистра (SPH), затем младшую часть (в SPL). Чтение выполняется наоборот: сначала читают младшую часть регистровой пары, затем старшую часть. Это указано в технической документации на микроконтроллер. Ваш пример можно переписать так:
C
1
2
3
4
5
6
7
8
9
10
11
.include "m128def.inc"
 
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
start:
ldi R25,high(-260) ; старшая часть числа
ldi R24,low(-260) ; младшая часть числа
adiw R25:R24,1 ; добавить 1
jmp start
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2021, 18:46

Найти количество отрицательных и положительных чисел в массиве 8-разрядных чисел со знаком
Пожалуйста, мне нужна помощь в завершении этой программы, она предназначена для поиска количества...

Найти количество чисел, попадающих в заданный диапазон в массиве 16-разрядных чисел со знаком
помогите выполнить. Найти количество чисел, попадающих в заданный диапазон в массиве 16-разрядных...

Получить файл g из чисел исходного файла, в котором не было бы двух соседних чисел с одинаковым знаком
Выполнить задания для текстового и бинарного файлов. Компоненты файла f – целые числа, ...

Получить файл из чисел исходного файла, в котором не было бы двух соседних чисел с одинаковым знаком
5. Компоненты файла f – целые числа, положительных чисел столько же, сколь-ко отрицательных....

Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие.
Есть множество задач анализа данных, записанных в файле, которые можно решить за "линию", не...

Является ли введенный с клавиатуры символ знаком препинания, знаком арифметического действия, специальным символом?
Только учусь писать. Не могу сообразить никак... Проверить, является ли введенный с клавиатуры...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.