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

Циклы: складывать два произвольных числа до тех пор, пока их сумма не превысит 1000

06.07.2020, 10:05. Просмотров 1182. Ответов 28

Добрый деyь! Была посталена задача сделать программу которая будет складывать два произвольных числа до тех пор пока их сумма не привысит 1000. Желательно сделать на микроконтроллере Atmga16. Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2020, 10:05
Ответы с готовыми решениями:

Цикл: Вводите числа до тех пор пока произведение не превысит число 1000 или сумма чисел не превысит число 152
Прошу помочь, мне нужно в школу принести задачи, а в паскале я не очень разбираюсь 1. Вводите...

Составить программу вывода на экран положительных чисел, кратных 3 до тех пор, пока сумма не превысит 1000.
Помогите.Составить программу вывода на экран положительных чисел, кратных 3 до тех пор, пока сумма...

Суммировать числа до тех пор, пока сумма не превысит 15.
Имеется массив А из N произвольных чисел - А(N), среди которых есть положительные, отрицательные и...

Выписывать числа Фибоначчи до тех пор, пока их сумма не превысит 100
Составить процедуру, которая записывала числа фибоначчи( f0=f1=1, f(n)=f(n-1)+f(n-2)) начиная с...

28
4054 / 1773 / 206
Регистрация: 06.10.2010
Сообщений: 3,961
06.07.2020, 11:07 2
Наверное как-то так
Assembler
1
2
3
a:add r1,r2
  cpi r1,1000
brlo a
1
0 / 0 / 0
Регистрация: 13.10.2019
Сообщений: 43
06.07.2020, 11:20  [ТС] 3
Спасибо
0
Модератор
3506 / 3007 / 545
Регистрация: 07.10.2015
Сообщений: 6,327
06.07.2020, 11:26 4
NikitaKocher, т.е. складывать сумму двух чисел? Или к одному добавлять второе, пока не превысится 1000?
0
0 / 0 / 0
Регистрация: 13.10.2019
Сообщений: 43
06.07.2020, 11:31  [ТС] 5
к одному добавлять второе, пока не превысится 1000
0
Модератор
3506 / 3007 / 545
Регистрация: 07.10.2015
Сообщений: 6,327
06.07.2020, 11:38 6
NikitaKocher, как вариант:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.equ    N = 43
.equ    M = 56
 
    ldi     XL, low(N)
    ldi     XH, high(N)
    ldi     YL, low(M)
    ldi     YH, high(M)
    ldi     ZL, low(1000)
    ldi     ZH, high(1000)
    jmp     add_cmp
add_continue:
    mov     r24, XL
    add     XL, YL
    adc     XH, YH
add_cmp:
    cp      XL, ZL
    cpc     XH, ZH
    brlo    add_continue
    breq    add_ret
    movw    XL, r24
add_ret:
Добавлено через 2 минуты
NikitaKocher, чуть подправил... Писал на коленке...
0
0 / 0 / 0
Регистрация: 13.10.2019
Сообщений: 43
06.07.2020, 11:41  [ТС] 7
Спасибо. а можете пожалуйста пояснить что означает .equ? я просто ранее с таким не сталкивался, как впринципе и с low(), high(). Поясните пожалуйста эти 3 момента.
0
Модератор
3506 / 3007 / 545
Регистрация: 07.10.2015
Сообщений: 6,327
06.07.2020, 11:43 8
NikitaKocher, еще чуть подправил.
В предыдущем варианте было в Х число, превышающее 1000.
0
0 / 0 / 0
Регистрация: 13.10.2019
Сообщений: 43
06.07.2020, 11:45  [ТС] 9
так понял, если вас не затруднит, можете пожалуйста написать комментарии к строкам кода. я большинство пониямаю но некоторые нет. Спасибо.
0
Модератор
3506 / 3007 / 545
Регистрация: 07.10.2015
Сообщений: 6,327
06.07.2020, 11:47 10
NikitaKocher, .equ - называем число символьной строкой. Везде, где встретится строка (в данном случае, N или M) подставится соответствующее число
low() и high() выделяет из 16-битной константы, соответственно, младший и старший байт

Добавлено через 1 минуту
NikitaKocher, что именно непонятно?
Давай сделаем так: сначала напиши сам, как понимаешь, где непонятно, пометь.
Я потом проверю и дополню
0
0 / 0 / 0
Регистрация: 13.10.2019
Сообщений: 43
06.07.2020, 11:47  [ТС] 11
вот я просто так написал, но проблема в том что регистр не может принимать значение больше 255 и вот тут проблема. все делал на atmega16

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.include "n16def.inc" 
 
.dseg 
.org 0x30 
.cseg 
.org
 
LDI R0, 10
LDI R1, 11
LDI R2, 1000
MOV R3, R1
RJUMP Start
Start: ADD R3, R0
CP R2, R1
BREQ Finish
JMP Start
Finish: NOP
RET
0
Модератор
3506 / 3007 / 545
Регистрация: 07.10.2015
Сообщений: 6,327
06.07.2020, 11:49 12
Еще надо подправить:
Assembler
12
movw     r24, XL
0
0 / 0 / 0
Регистрация: 13.10.2019
Сообщений: 43
06.07.2020, 11:50  [ТС] 13
это в вашем коде или в моём?

UPD. Понял в вашем
0
Модератор
3506 / 3007 / 545
Регистрация: 07.10.2015
Сообщений: 6,327
06.07.2020, 11:51 14
Цитата Сообщение от NikitaKocher Посмотреть сообщение
проблема в том что регистр не может принимать значение больше 255
NikitaKocher, вот именно поэтому я и использовал регистровые пары

Добавлено через 37 секунд
Цитата Сообщение от NikitaKocher Посмотреть сообщение
это в вашем коде или в моём?
Разве в твоем коде такое есть?
0
0 / 0 / 0
Регистрация: 13.10.2019
Сообщений: 43
06.07.2020, 11:54  [ТС] 15
ну да я что то ступил. вот я и не понимаю как использовать регистровые пары. в интеренете сложно найти информацию по данной теме

Добавлено через 2 минуты
ну так что там по моему коду, много ли там ошибок?
0
901 / 541 / 81
Регистрация: 15.05.2012
Сообщений: 3,168
06.07.2020, 11:58 16
Assembler
1
cpi r1,1000
Вот незадача - регистр восьмиразрядный.
0
Модератор
3506 / 3007 / 545
Регистрация: 07.10.2015
Сообщений: 6,327
06.07.2020, 12:00 17
NikitaKocher, сначала держи комменты к моему коду:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.equ    N = 43              ;первая контстанта
.equ    M = 56              ;вторая
 
    ldi     XL, low(N)      ;загружаем младший байт первой константы в пару XL
    ldi     XH, high(N)     ;старший байт - в XH (XH:XL = N)
    ldi     YL, low(M)      ;аналогично, YH:YL = M
    ldi     YH, high(M)
    ldi     ZL, low(1000)   ;ZH:ZL = 1000 - предельная константа
    ldi     ZH, high(1000)
    jmp     add_cmp         ;идем на проверку условия выхода из цикла
add_continue:
    movw    r24, XL         ;сохраним пару XH:XL в R25:R24
    add     XL, YL          ;low(sum) = low(sum) + low(M)
    adc     XH, YH          ;high(sum) = high(sum) + high(M) + C (учитывается бит переноса)
add_cmp:
    cp      XL, ZL          ;проверяем достижение конца, сравниваем low(sum) и low(1000)
    cpc     XH, ZH          ;и high(sum) c high(1000), с учетом бита переноса
    brlo    add_continue    ;если XH:XL < 1000, то на повтор
    breq    add_ret         ;если ровно 1000, то конец
    movw    XL, r24         ;если больше 1000, то восстановим предыдущее, т.е. до последнего отнимания М
add_ret:
0
0 / 0 / 0
Регистрация: 13.10.2019
Сообщений: 43
06.07.2020, 12:00  [ТС] 18
Спасибо.
0
Модератор
3506 / 3007 / 545
Регистрация: 07.10.2015
Сообщений: 6,327
06.07.2020, 12:05 19
NikitaKocher, вот твой код
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
    LDI R0, 10      ;команду LDI можно применять только к старшим регистрам r16-r31 !!!!!
    LDI R1, 11      ;аналогично!!!!!!!!!!!!
    LDI R2, 1000    ;аналогично!!!!!!!!!!!!
    MOV R3, R1
    RJUMP Start     ;зачем пустая команда? :)
Start:
    ADD R3, R0      ;добавляем младший байт. Все ок
    CP R2, R1       ;сравниваем младшие байты, а старшие? :)
    BREQ Finish     ;а если больше? :)
    JMP Start
Finish:
    NOP
    RET
Сейчас подправлю
0
0 / 0 / 0
Регистрация: 13.10.2019
Сообщений: 43
06.07.2020, 12:07  [ТС] 20
Так интересно где же я прогадал.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2020, 12:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Организовать ввод чисел до тех пор, пока их сумма не превысит введенного числа m
В VBA немного разбираюсь, но после пары дней раздумий ничего не вышло.... Прошу помощи!...

Вычисление суммы натуральных чисел до тех пор, пока сумма не превысит заданного с клавиатуры числа
Вычисление суммы натуральных чисел до тех пор, пока сумма не превысит заданного с клавиатуры числа

Циклы с постусловием и предусловием. Вычислить сумму квадратов натуральных чисел до тех пор, пока квадрат очередного числа не превысит 81
Практическая работа Задание 2. Вычислить сумму квадратов натуральных чисел до тех пор, пока...

Складывать числа до тех пор, пока не встретится ноль
Складывать числа до встречи 0. Напечатать сумму. Снова суммировать до 0, напечатать новую сумму и...

Сложение чисел до тех пор, пока сумма не превысит заданную величину
Помогите, пожалуйста, найти ошибку! Задание : Организовать цикл типа Do Untill, на шаге которого...

Написать программу ввода произвольных чисел, принимающую ввод до тех пор, пока не будет введён ноль (циклы)
Помогите решить задачу. Условие: Написать программу ввода произвольных чисел до тех пор, пока не...


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

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

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