Учим двоичную систему счисления, в частности, представление отрицательных чисел в дополнительном коде. А когда выучим, тогда узнаем, что для числа размером один байт -1 = 255.AndreyE писал(а):Бегущий огонек v1.0 из обучалки
2) возможно это из-за непонимания этого пункта - почему при вычитании из 0 вдруг получается 255, а не -1?
Ассемблер (ASM) для AVR в вопросах и ответах
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
- Реклама
- GRafGRay
- Прорезались зубы
- Сообщения: 223
- Зарегистрирован: Вт окт 02, 2007 14:43:23
- Откуда: Ростов-на-Дону
- Контактная информация:
Господа что-то я где-то прощёлкал и не могу вкурить
почему после операции вычитания устанавливается флаг отрицательного значения?
Код: Выделить всё
ldi Temp,238
subi Temp,100
При наличии отсутствия пропитанных шпал - это будет не трамвай а одно горе!
- Реклама
- GRafGRay
- Прорезались зубы
- Сообщения: 223
- Зарегистрирован: Вт окт 02, 2007 14:43:23
- Откуда: Ростов-на-Дону
- Контактная информация:
мне тупо нужно посчитать арифметическую разницу, остаток будет использоваться для дальнейших вычислений
что касательно первого варианта, то вот такой пример у меня работает:
я собственно по выполнинии этого макроса получаю искомую разницу,
но меня смущает что на его вылнение затрачивается <b>temp2</b> тактов
для второго варианта я так понимаю прийдётся остаток сравнивать с числом 127, и если он больше то принудительно стирать флаг отрицательного числа?
в таком разе второй вариант видимо будет предпочтительней
P.S.: в моём случае <b>temp1</b> заведомо больше <b>temp2</b> и не превышает 255, так же <b>temp2</b> не отрицательно
что касательно первого варианта, то вот такой пример у меня работает:
Код: Выделить всё
; тра-та-та ... тра-та-та
.macro vichitanie
dec @0
dec @1
breq PC+2
rjmp PC-3
.endmacro
; тра-та-та ... тра-та-та
vichitanie temp1,temp2
; тра-та-та ... тра-та-та
но меня смущает что на его вылнение затрачивается <b>temp2</b> тактов
для второго варианта я так понимаю прийдётся остаток сравнивать с числом 127, и если он больше то принудительно стирать флаг отрицательного числа?
в таком разе второй вариант видимо будет предпочтительней
P.S.: в моём случае <b>temp1</b> заведомо больше <b>temp2</b> и не превышает 255, так же <b>temp2</b> не отрицательно
При наличии отсутствия пропитанных шпал - это будет не трамвай а одно горе!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18547
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
я бы очень советовал не поступать тупо, ибо макрос, тупо 123 или сколько там раз отнимает 1 и переменной, уже есть верх тупизны. извините.GRafGRay писал(а):мне тупо нужно посчитать арифметическую разницу, остаток будет использоваться для дальнейших вычислений
нормлаьно получить разницу можно как раз тем способом, что вы изначально показали:
Код: Выделить всё
subi Temp, 123P.S. вообще-то понятие "отрицательное число" - это такааааая абстракция в мире двоичной математики...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Мне кажется человек ответил как раз ёмко и по делу. А к словам придираться это "Вы, сударь, к словам придираетесь?Вы сударь к словам придираетесь? Выше я писал, что этот макрос работает, но считаю что его использовать не есть хорошо.
ЗЫ: Прошу извинения за оффтоп. Не сдержался.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Это если число со знаком, а если число изначально может принимать только положительные значения (например число пришедших импульсов) то 0..255SII писал(а):"Не отрицательно" для переменных размером байт означает, что они содержат значение от 0 до +127. Поэтому, если надо хранить значение, превышающее +127, надо переходить к двухбайтовым переменным (там верхний предел равен +32767).
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
Совершенно верно. Но человек же написал про "отрицательно", значит, он рассматривает числа как имеющие знак. Хотя мой совет, который я дал в начале страницы, в силе остаётся по-любому: надо хорошо учить двоичную систему и представление чисел в ней. Если с этим разобраться, то подобные вопросы сами собой отпадут, ну а если не разобраться, то лично я не представляю, как можно программировать на асме...GP1 писал(а):Это если число со знаком, а если число изначально может принимать только положительные значения (например число пришедших импульсов) то 0..255SII писал(а):"Не отрицательно" для переменных размером байт означает, что они содержат значение от 0 до +127. Поэтому, если надо хранить значение, превышающее +127, надо переходить к двухбайтовым переменным (там верхний предел равен +32767).
потыкайте пожалуйста носом где почитать про работу с массивами в eeprom.
просто еепром читать и писать умею, а хочется прочитать из 1 ячейки и в зависимости от того что там прочиталось считать 2 другие. т.е. чтото типа
только читать не из ПЗУ а из еепрома.
просто еепром читать и писать умею, а хочется прочитать из 1 ячейки и в зависимости от того что там прочиталось считать 2 другие. т.е. чтото типа
Код: Выделить всё
перед этим погрызено мышами
;Считываем из ЕЕПРОМ в регистр 21 номер режима этот адрес хранится в ячейке 61
LDI R16,61 ; Загружаем адрес ячейки
RCALL EERead ; вызываем процедуру чтения. После которой
; в R21 будет считанный байт.
;Теперь читаем из PWMwidth +№ режима то что надо записать в таймер
ldi ZH,High(PWMwidth*2) ;загрузка адреса 0-го
ldi ZL,Low(PWMwidth*2) ;элемента в рег. пару Z
ldi Temp1,0
add ZL,R21 ;прибавление
adc ZH,Temp1 ;внутр. адреса
lpm ;загрузка из ПЗУ
mov Temp,R0 ;копирование
out ocr0a,temp
;Теперь читаем из PWMwidth1 +№ режима то что надо записать в таймер
ldi ZH,High(PWMwidth1*2) ;загрузка адреса 0-го
ldi ZL,Low(PWMwidth1*2) ;элемента в рег. пару Z
ldi Temp1,0
add ZL,R21 ;прибавление
adc ZH,Temp1 ;внутр. адреса
lpm ;загрузка из ПЗУ
mov Temp,R0 ;копирование
out ocr0b,temp
дальше опять погрызено мышами
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
А в чём тогда проблема? Считываете нужную ячейку, сравниваете с заданным, в зависимости от результата считываете ещё две, записывая их куда угодно, хоть в ОЗУ, хоть в РОН...просто еепром читать и писать умею
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Код: Выделить всё
main:
ldi r16, xx ; загружаем адреса
ldi r17, xx
rcall ReadEEP ; считываем данные
cpi r18, xx ; сравниваем с константой прочитанное из EEP
breq Label1 ; если равно, то переходим
rjmp main
Label1:
ldi r16, xx ; загружаем адреса
ldi r17, xx
rcall ReadEEP; считываем данные
mov data1, r18 ; копируем
ldi r16, xx ; загружаем адреса
ldi r17, xx
rcall ReadEEP; считываем данные
mov data1, r18 ; копируем
rjmp main
ReadEEP:
sbic EECR, EEWE ; ждать завершения записи
rjmp ReadEEP
out EEARL, r16 ; загрузка мл. байта адреса
out EEARH, r17 ; загрузка ст. байта адреса
ldi r16, 1 ; Разрешение чтения
out EECR, r16
in r18, EEDR ; чтение
ret
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Доброго времени!
Подскажите пожалуйста, требуется организовать цикл из 8 обработок, в котором в зависимости от результата в регистре флагов устанавливался в 0 или 1, бит с номером равным итерации в регистре. Т.е. если идет 6 итерация и результат положителен, то ставим бит 6 в 1. При итерации 7 и отрицательном рез-те, сбрасываем бит 7. Команды установки и сброса знаю, но вот выделить номер бита из регистра не получается:( Спасибо заранее.
Подскажите пожалуйста, требуется организовать цикл из 8 обработок, в котором в зависимости от результата в регистре флагов устанавливался в 0 или 1, бит с номером равным итерации в регистре. Т.е. если идет 6 итерация и результат положителен, то ставим бит 6 в 1. При итерации 7 и отрицательном рез-те, сбрасываем бит 7. Команды установки и сброса знаю, но вот выделить номер бита из регистра не получается:( Спасибо заранее.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже



