Технический форум по робототехнике.
GrayHunter » 12 апр 2011, 09:33
Подскажите, пожалуйста (очень желательно на
примерах) как
сравнить и как
очистить/обнулить 32-разрядное число (3 байта) на Ассемблере
?Прибавлять единицу (1) уже умею:
- Код: Выделить всё • Развернуть
lds Temp1, Time
lds Temp2, Time+1
lds Temp3, Time+2
ldi Temp4, 1
add Temp1, Temp4
clr Temp4
adc Temp2, Temp4
adc Temp3, Temp4
sts Time, Temp1
sts Time+1, Temp2
sts Time+2, Temp3
blindman » 12 апр 2011, 09:41
32 разрядное число - это 4 байта
GrayHunter » 12 апр 2011, 09:59
имеется то, что в коде выше - трёх байтовый "Time". Нужно его сравнивать с другим числом, чтобы когда он ("Time") будет равен или больше числу "86400", то чтобы происходило его ("Time") обнуление и, например, "ldi Temp_5, 1".
Уже всё написал, кроме этого момента. Подскажите, пожалуйста.
blindman » 12 апр 2011, 10:00
Точно так же как со сложением, только вместо add/adc - cp/cpc.
GrayHunter » 12 апр 2011, 10:07
Сравнение:
а как мне число "86400" записать? Тоже в 3-х байтовую переменную? Если да, то как это число в неё поместить?
(буду очень рад, если напишите примеры - уже столько искал, но всё бесполезно)
Очищение/обнуление:
правильно ли я понял, что надо так:
- Код: Выделить всё • Развернуть
ldi Temp, 0
sts Time, Temp
sts Time+1, Temp
sts Time+2, Temp
blindman » 12 апр 2011, 10:11
Переведи в 16-ричную или двоичную систему, разбей на байты.
GrayHunter » 12 апр 2011, 10:15
Боюсь показаться нахлебником, но я честно
страрался и во всём, кроме
сравнения и
обнуления 3-х байтовых переменных, разобрался. Пытался, но не получается, мало информации (точнее, примеров). Пожалуйста, помогите с кодом этого момента, а то жалко, что программа из 300 строк простаивает... (уверен, что опытные быстро с этим справятся, а я уже четвёртые сутки мучаюсь)
Radist » 12 апр 2011, 10:17
Ищете примеры для атмела, application notes, - там все есть
пусть одно число лежит в этих регистрах R19:R18:R17:R16
второе в этих R23:R22:R21:R20
Обнуляем первое число
clr r16
clr r17
clr r18
clr r19
записываем туда 86400 (15180 HEX)
ldi r16, $80
ldi r17, $51
ldi r18, $01
сравниваем второе число с первым
cp r20, r16
cpc r21, r17
cpc r22, r18
cpc r23, r19
Затем делается условный переход по анализам флагов Z и/или C
GrayHunter » 12 апр 2011, 10:22
Спасибо
Большое.
Маленький момент хотел бы уточнить:
записываем туда 86400 (15180 HEX)
ldi r16, $80
ldi r17, $51
ldi r18, $01
а r19?
ведь мы его используем в сравнении...может в него что-то записать? а то мало ли кто знает, что там... или там по-умолчанию ноль (0)?
Radist » 12 апр 2011, 10:31
Нет никакого умолчания. А ноль там потому, что строчкой выше я его туда записал. И он там будет до тех пор, пока я или еще кто туда не запишет что-нибудь другое. Или выключит питание.
GrayHunter » 12 апр 2011, 10:47
Не заметил
СПАСИБО
dccharacter » 12 апр 2011, 10:50
ребят, я традиционно (заранее ведь знаю!!!) не в тему.
но. есть тип - long int. Это 4 байта. обнулить его можно присвоив переменной ноль. Сравнить можно, сравнив две переменные такого типа. Переполнение по третьему байту можно сделать, применив маску.
- Код: Выделить всё • Развернуть
volatile long int a=100;
volatile long int b = 27089;
long int mask = 0x00FFFFFF;
while(a<b)
{
a = (a++)&mask;
}
boez » 12 апр 2011, 10:56
dccharacter писал(а):ребят, я традиционно (заранее ведь знаю!!!) не в тему
ГрейХантер принципиально хочет на асме. Ну ладно, может мы хоть толпой его убедим, что си рулит
Я там в исходной теме немножко ответил, до того как заметил эту. Ну тут я смотрю тоже ответили.
dccharacter » 12 апр 2011, 10:57
А ЧО, В АСМЕ НЕТ ТИПОВ???
мааааааать
бежим все, врассыпную!!!!!!!!
Angel71 » 12 апр 2011, 10:58
о прошлогодних птичках. простенький пример:
- Код: Выделить всё • Развернуть
uint32_t a = 100, b = 100, c = 0;
if(a == b) c = 200;
сколько вам понадобиться времени, чтоб на асме переделать вот в такой код?
- Код: Выделить всё • Развернуть
int a = -100, b = 100, c = 0;
if(a < b) c = 99;
а если это будет не пара строчек, а сотни или тысячи? вы просто задумайтесь, на что вы тратите столько времени, когда для ваших текущих задач асм не даст никаких преимуществ. за то время, пока вы узнаёте, как 2 числа сравнить и присвоить легко можно было весь каркас программы написать, а может и больше.
Последний раз редактировалось
Angel71 12 апр 2011, 11:00, всего редактировалось 1 раз.