Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 15.11.2022
Сообщений: 3
1

Сложить два 6-байтовых числа (Assembler)

15.11.2022, 19:24. Показов 487. Ответов 6

Author24 — интернет-сервис помощи студентам
Нужна помощь. Задача: Сложить два 6-байтовых числа. Никакого опыта в работе с ассемблером.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2022, 19:24
Ответы с готовыми решениями:

[MCU8051] Сложить два числа и вывести на двухразрядный индикатор (язык Ассемблер)
Как сложить два числа представленных в двоично-десятичном коде и вывести на двухразрядный...

Сложить 5 байтовых чисел и занести результат в переменную integer
Нужно сложить 5 байтовый чисел и занести результат в переменную integer. Использовать...

Как сложить два плюс два? если оба числа символьные?
Не могу сложить два числа в символьном виде, что бы получить третье (как сумма двух первых),...

Даны два числа: одно размером dd, другое dw. Сложить эти числа
Дана задачка на ассемблере помогите сделать, а то совсем не шарю Даны два числа одно размером -...

6
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
16.11.2022, 09:29 2
Лучший ответ Сообщение было отмечено cancil как решение

Решение

Сложение двух регистров - команда ADD. Сложение с учетом переноса - ADC. Чтение из памяти (я же не знаю, где у вас числа хранятся) - LDS.
В общем-то, этого достаточно. Остальной код вы должны были писать на уроке.
1
0 / 0 / 0
Регистрация: 15.11.2022
Сообщений: 3
16.11.2022, 09:41  [ТС] 3
В этом и проблема, что никакого кода нам не давали. Просто поставили перед фактом, что нужно сделать вот эту задачу. Никаких подсказок, помощи нам преподаватель не дал. В основном мне бы хотелось узнать как получить 6-байтовое число.
0
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
16.11.2022, 10:34 4
Лучший ответ Сообщение было отмечено cancil как решение

Решение

Цитата Сообщение от cancil Посмотреть сообщение
как получить 6-байтовое число.
В восьмибитном микроконтроллере регистр - 1 байт. Если у вас на входе шестибайтовые числа (или вообще произвольной разрядности), то оно вводится и выводится побайтно, последовательно. Или вообще ввод-вывод производится в последовательном коде, побитно.
Внутри микроконтроллера число располагается в нескольких регистрах (или в ячейках памяти). Математические действия над такими числами производятся по определённым алгоритмам. Например, сложение таких чисел производится так же, как вы складываете на бумажке "в столбик". Разница только в том, что на бумажке у вас один знак - десятичная цифра, а при сложении в микроконтроллере - один байт, т.е. шестнадцатиричная цифра.
Если числа со знаком, то знак - это старший бит этого числа.
При сложении двух шестибайтных чисел без знака (длина числа 48 бит), результат будет занимать 49 бит. То есть под число результата потребуется 7 байт, старшие 6 бит старшего байта будут равны нулю.

Про арифметические операции с многобайтными числами в сети полно разных статей. Вот типичная.
1
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
16.11.2022, 13:19 5
Цитата Сообщение от cancil Посмотреть сообщение
В этом и проблема, что никакого кода нам не давали. Просто поставили перед фактом, что нужно сделать вот эту задачу. Никаких подсказок, помощи нам преподаватель не дал
Не верю. Даже в худшем случае он должен был дать литературу.
Если же вам вместо преподавателя попалось бревно, способное только выйти к проектору и положить на него слайды, идите ругаться.
Но, повторяю: в этот вариант я не верю.
Цитата Сообщение от i8085 Посмотреть сообщение
Если у вас на входе шестибайтовые числа (или вообще произвольной разрядности), то оно вводится и выводится побайтно, последовательно. Или вообще ввод-вывод производится в последовательном коде, побитно.
Скорее, они все на эмуляторе проверяют. Запустили пошаговый режим, записали в ячейки памяти два числа, продолжили выполнение, посмотрели что в ячейках оказалось.
Без понятия как, если я угадал, ТС будет проверять правильность алгоритма. В отладчике ведь ячейки в хексе отображаются, их еще склеить надо.
Цитата Сообщение от i8085 Посмотреть сообщение
а при сложении в микроконтроллере - один байт, т.е. шестнадцатиричная цифра.
Только не шестнадцатеричная, в 256-ричная, конечно. Ну или две шестнадцатеричные за раз.
Цитата Сообщение от cancil Посмотреть сообщение
В основном мне бы хотелось узнать как получить 6-байтовое число.
Как оно будет вводиться? Кодом или руками в отладчике?
Простейший вариант - открываете калькулятор, вводите туда число, нажимаете кнопочку HEX, число становится шестнадцатеричным. Каждую пару цифр переписываете в код / отладчик. Обратно так же.
0
0 / 0 / 0
Регистрация: 15.11.2022
Сообщений: 3
16.11.2022, 13:26  [ТС] 6
Хотите верьте, хотите нет, но вот такой вот у нас преподаватель. Скажу честно, он сам не может решить нашу задачу. Вводиться оно будет кодом.
0
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
16.11.2022, 15:50 7
Лучший ответ Сообщение было отмечено cancil как решение

Решение

Цитата Сообщение от cancil Посмотреть сообщение
он сам не может решить нашу задачу
Не будем здесь это обсуждать.
Эта задача вполне по силам среднестатистическому студенту.
Берёте в интернете пример кода на ассемблере сложения многобайтных чисел и переделываете его под заданную разрядность.

Например вот из этого (сложение двух четырёхбайтных):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
;Подпрограмма сложения четырехбайтных чисел
;Первое число предварительно загружается в регистры varHH, varHL, varLH, varLL
;Второе число предварительно загружается в регистр tmpHH, tmpHL, tmpLH, tmpLL
;Результат сложения в регистрах varHH, varHL, varLH, varLL, результат не должен превышать
;максимального значения для четырехбайтного числа (4294967295)
 
sum           movf        tmpLL,W         ;прибавление числа из регистра tmpLL к числу
              addwf       varLL,F         ;в регистре varLL
              btfss       STATUS,C        ;проверка переполнения регистра varLL
              goto        s1              ;нет переполнения varLL: переход на метку s1
              incfsz      varLH,F         ;переполнение varLL: инкремент varLH с проверкой на переполнение
              goto        s1              ;нет переполнения varLH: переход на метку s1
              incfsz      varHL,F         ;переполнение varLH: инкремент varHL с проверкой на переполнение
              goto        s1              ;нет переполнения varHL: переход на метку s1
              incf        varHH,F         ;переполнение varHL: инкремент varHH
s1            movf        tmpLH,W         ;прибавление числа из регистра tmpLH к числу
              addwf       varLH,F         ;в регистре varLH
              btfss       STATUS,C        ;проверка переполнения регистра varLH
              goto        s2              ;нет переполнения varLH: переход на метку s2
              incfsz      varHL,F         ;переполнение varLH: инкремент varHL с проверкой на переполнение
              goto        s2              ;нет переполнения varHL: переход на метку s2
              incf        varHH,F         ;переполнение varHL: инкремент varHH
s2            movf        tmpHL,W         ;прибавление числа из регистра tmpHL к числу
              addwf       varHL,F         ;в регистре varHL
              btfsc       STATUS,C        ;проверка переполнения регистра varHL
              incf        varHH,F         ;переполнение varHL: инкремент varHH
              movf        tmpHH,W         ;нет переполнения varHL: прибавление числа из регистра tmpHH
              addwf       varHH,F         ;к числу в регистре varHH
              return                      ;выход из подпрограммы
                                          ;
Для удобства регистры только переименуйте.
Первое слагаемое - var1_5, var1_4, var1_3, var1_2, var1_2, var1_0
Второе слагаемое - var2_5, var2_4, var2_3, var2_2, var2_2, var2_0
Результат - (res_6), res_5, res_4, res_3, res_2, res_1, res_0.
И добавьте ещё циклов сложения.
Требование, что результат не больше 48 бит (т.е. влезает в ту же разрядную сетку 6 байт, что и слагаемые), можно оставить.
А можно и полное сложение сделать, без ограничения значений слагаемых, с результатом 49 бит.

Добавлено
Внимательно не посмотрел... Код этого примера не для AVR, а для PIC. Но в вашем задании вроде это требование и не указано... Хотя раздел форума...
Можете найти в сети другой пример под нужный вам контроллер. Принцип сложения тот же самый.
0
16.11.2022, 15:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2022, 15:50
Помогаю со студенческими работами здесь

Два числа заданы на ленте двумя массивами меток Сложить эти числа
4. Два числа заданы на ленте двумя массивами меток. Сложить эти числа. Расстояние между массивами...

Даны два длинных целых числа (256+) требуется сложить эти числа
Даны два длинных целых числа (256+ символов) требуется сложить эти числа,и подсчитать что получилось

Машина Поста: два числа заданы на ленте двумя массивами меток. Сложить эти числа
Два числа заданы на ленте двумя массивами меток. Сложить эти числа. Расстояние между массивами...

Машина Поста. Два числа заданы на ленте двумя массивами меток. Сложить эти числа
Два числа заданы на ленте двумя массивами меток. Сложить эти числа. Расстояние между массивами...

Сложить два числа a, b
1. Сложить два числа a,b var a,b:integer; sum:integer; begin writeln('Введите а и b:');...

Сложить два числа
timex=date +%s timeh=24222222 echo $(($timex+$timeh)) Как будет верным сложить два числа?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru