roboforum.ru

Технический форум по робототехнике.

Возможно ли сравнение 32-разрядных чисел

Возможно ли сравнение 32-разрядных чисел

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

Re: Возможно ли сравнение 32-разрядных чисел

blindman » 12 апр 2011, 09:41

32 разрядное число - это 4 байта

Re: Возможно ли сравнение 32-разрядных чисел

GrayHunter » 12 апр 2011, 09:59

имеется то, что в коде выше - трёх байтовый "Time". Нужно его сравнивать с другим числом, чтобы когда он ("Time") будет равен или больше числу "86400", то чтобы происходило его ("Time") обнуление и, например, "ldi Temp_5, 1".

Уже всё написал, кроме этого момента. Подскажите, пожалуйста.

Re: Возможно ли сравнение 32-разрядных чисел

blindman » 12 апр 2011, 10:00

Точно так же как со сложением, только вместо add/adc - cp/cpc.

Re: Возможно ли сравнение 32-разрядных чисел

GrayHunter » 12 апр 2011, 10:07

Сравнение:
а как мне число "86400" записать? Тоже в 3-х байтовую переменную? Если да, то как это число в неё поместить?
(буду очень рад, если напишите примеры - уже столько искал, но всё бесполезно)

Очищение/обнуление:
правильно ли я понял, что надо так:
Код: Выделить всёРазвернуть
ldi Temp, 0
sts Time, Temp
sts Time+1, Temp
sts Time+2, Temp

Re: Возможно ли сравнение 32-разрядных чисел

blindman » 12 апр 2011, 10:11

Переведи в 16-ричную или двоичную систему, разбей на байты.

Re: Возможно ли сравнение 32-разрядных чисел

GrayHunter » 12 апр 2011, 10:15

Боюсь показаться нахлебником, но я честно страрался и во всём, кроме сравнения и обнуления 3-х байтовых переменных, разобрался. Пытался, но не получается, мало информации (точнее, примеров). Пожалуйста, помогите с кодом этого момента, а то жалко, что программа из 300 строк простаивает... (уверен, что опытные быстро с этим справятся, а я уже четвёртые сутки мучаюсь)

Re: Возможно ли сравнение 32-разрядных чисел

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

Re: Возможно ли сравнение 32-разрядных чисел

GrayHunter » 12 апр 2011, 10:22

Спасибо Большое.

Маленький момент хотел бы уточнить:
записываем туда 86400 (15180 HEX)
ldi r16, $80
ldi r17, $51
ldi r18, $01

а r19?
ведь мы его используем в сравнении...может в него что-то записать? а то мало ли кто знает, что там... или там по-умолчанию ноль (0)?

Re: Возможно ли сравнение 32-разрядных чисел

Radist » 12 апр 2011, 10:31

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

Re: Возможно ли сравнение 32-разрядных чисел

GrayHunter » 12 апр 2011, 10:47

Не заметил :oops:

СПАСИБО :good:

Re: Возможно ли сравнение 32-разрядных чисел

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;
}

Re: Возможно ли сравнение 32-разрядных чисел

boez » 12 апр 2011, 10:56

dccharacter писал(а):ребят, я традиционно (заранее ведь знаю!!!) не в тему

ГрейХантер принципиально хочет на асме. Ну ладно, может мы хоть толпой его убедим, что си рулит :)
Я там в исходной теме немножко ответил, до того как заметил эту. Ну тут я смотрю тоже ответили.

Re: Возможно ли сравнение 32-разрядных чисел

dccharacter » 12 апр 2011, 10:57

А ЧО, В АСМЕ НЕТ ТИПОВ???
мааааааать
бежим все, врассыпную!!!!!!!!

Re: Возможно ли сравнение 32-разрядных чисел

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 раз.


Rambler\'s Top100 Mail.ru counter