Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с отрицательными числами в асме.....
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Potter
Само число находится в РОН. Я так понимаю что у каждомго регистра общего назначения имеется где-то бит определяющий знак числа. Но я могу очень грубо ошибаться. Поправте пожалуйста......

Задача собственно простая: В в двух регистрах общего назначения хранится два числа. Числа могут быть положительные а могут быть отрицательные. Надо эти два числа сложить. Подскажите пожалуйста как это зделать?

И еще маленький вопросик... Как работать с портами и как их настраивать я знаю... Вот что-то только у меня не получается нормально работать с портом F в меге 128. Подскажите пожалуйста чего я незнаю....

Заранее огромнешее спасибо за помощь....
aesok
Цитата(Potter @ Feb 5 2007, 15:07) *
И еще маленький вопросик... Как работать с портами и как их настраивать я знаю... Вот что-то только у меня не получается нормально работать с портом F в меге 128. Подскажите пожалуйста чего я незнаю....



Скорее всего дело в фюзе M103C.

Анатолий.
SasaVitebsk
Цитата(Potter @ Feb 5 2007, 16:07) *
Само число находится в РОН. Я так понимаю что у каждомго регистра общего назначения имеется где-то бит определяющий знак числа. Но я могу очень грубо ошибаться. Поправте пожалуйста......

Задача собственно простая: В в двух регистрах общего назначения хранится два числа. Числа могут быть положительные а могут быть отрицательные. Надо эти два числа сложить. Подскажите пожалуйста как это зделать?

И еще маленький вопросик... Как работать с портами и как их настраивать я знаю... Вот что-то только у меня не получается нормально работать с портом F в меге 128. Подскажите пожалуйста чего я незнаю....

Заранее огромнешее спасибо за помощь....


Бит отрицательного числа нигде не хранится. Его просто не существует. Само отрицательное число (как и дробное кстати), - это наше представление о числах. То есть в одном байте можно хранить число от 0 до 255, или от -128 до +127. В этом смысле признаком отрицательного числа является старший бит. Но, практически им не пользуются, так как вся арифметика выполняется и так. Если требуется больший диапазон, то используют несколько байтов по той же схеме.

Принцип прост. "-1" - 0xff. Отриц. число преобразуется в положительное путём инверсии с прибавлением 1 (и наоборот также). Можете это проверить. Такая операция для байта есть на ASMе AVR. Для двухбайтовых этой командой не пользуются применяют как я описал.

Если Вы сложите -1 (0xff) и 1 (1), то получите искомое число 0. Если (-1) + (-1) = (-2) (0xfe). То же будет и с вычитанием. С умножением и делением всё несколько сложнее, но тоже можно на пальцах вычислить. Есть также особенности при работе с переносами.

По поводу порта F? - никаких особенностей нет. Я не слышал. Проверь может ф-ции альтернативные у пинов. Например JTAG. А какие проблемы у Вас???
mse
Цитата(Potter @ Feb 5 2007, 15:07) *
Само число находится в РОН. Я так понимаю что у каждомго регистра общего назначения имеется где-то бит определяющий знак числа. Но я могу очень грубо ошибаться. Поправте пожалуйста......

Задача собственно простая: В в двух регистрах общего назначения хранится два числа. Числа могут быть положительные а могут быть отрицательные. Надо эти два числа сложить. Подскажите пожалуйста как это зделать?

И еще маленький вопросик... Как работать с портами и как их настраивать я знаю... Вот что-то только у меня не получается нормально работать с портом F в меге 128. Подскажите пожалуйста чего я незнаю....

Заранее огромнешее спасибо за помощь....

Ну, дык, и складывай. Тока в этом случае у отрицательного числа в старшем разряде должна быть "1". Ну, типа, так принято. Дополнительный код и всё такое.
Для 8-бит числа для преобразования "+" <->"-" есть команда NEG. В АВР, ессно.
Wild007
Цитата
Вот что-то только у меня не получается нормально работать с портом F в меге 128

В режиме совместимости с mega103 порт F действует только на ввод. Проверьте.
Potter
Проблемма с портом собствено следущая: Мне надо настроить порт на ввод и потом считывать состояния порта.

Настраиваю порт командой

ldi r16,0x00
out DDRF, r16

А компилятор выдает ошибку.

На сщет отрицательных чисел я понял. Старший бит определяет знак. И мы можем хранить число от -127 до 127 в любом РОН.

/*
Для 8-бит числа для преобразования "+" <->"-" есть команда NEG. В АВР, ессно.
*/

/*
Принцип прост. "-1" - 0xff. Отриц. число преобразуется в положительное путём инверсии с прибавлением 1 (и наоборот также). Можете это проверить. Такая операция для байта есть на ASMе AVR. Для двухбайтовых этой командой не пользуются применяют как я описал.
*/

А вот это мне не совсем ясно... Можно чуть чуть по подробнее.... Мне надо выполнять команды только сложения и вычитаня....
mse
Цитата(Potter @ Feb 5 2007, 15:54) *
/*
Принцип прост. "-1" - 0xff. Отриц. число преобразуется в положительное путём инверсии с прибавлением 1 (и наоборот также). Можете это проверить. Такая операция для байта есть на ASMе AVR. Для двухбайтовых этой командой не пользуются применяют как я описал.
*/
А вот это мне не совсем ясно... Можно чуть чуть по подробнее.... Мне надо выполнять команды только сложения и вычитаня....

;О) Ну, типа, так: "0х1" ->"0xfe" ->"0xff". Можно проще: 0-0x1=0xff
Вариаццыи на тему для 16р арифметики:
Код
    com xl
    com xh
    adiw xl,1
...
    sub rx,rx
    sub ry,ry
    sub rx,rsl
    sbc ry,rsh
...

Это смена знака, если непонятно. ;О)
ahulap
Цитата(Potter @ Feb 5 2007, 14:54) *
Настраиваю порт командой

ldi r16,0x00
out DDRF, r16

А компилятор выдает ошибку.

В меге часть регистров находится в памяти - для них используются команды lds/sts вместо in/out.
Посмотрите файл m128def.inc, там такие регистры обозначены как memory mapped.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.