реклама на сайте
подробности

 
 
> Как работать с переменными int в асемблере?, Работаю в компиляторе AVRStudio4....
Professor
сообщение May 21 2006, 09:32
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 35
Регистрация: 12-05-06
Из: Украина Харьков
Пользователь №: 17 045



Задача собсветно вот в чем.....
Преременная имеет расширение unsigned int и хранится в двух регистрах......
Хранится к примеру в регистрах r20 и r21 где r20 старший байт а r21 младший.... К примеру они равны числам r20 =0x11, r21 =0xF0.... Получается число 0x11F0 которое в свою очередь в десятичной системе равно 4592..... Также имеется регистор r23..... Мне теперь нужно извлечь из числа 4592 сначала 2 потом 9 потом 5 потом 4.... и заносить эти чила по очереди в регистор r23.... На C++ задача решается просто:

Допустим регистор r23 это переменная unsigned char REZULTAT = 0
а r20 и r21 это переменная unsigned int HISLO = 4592 имеем следующий код:

REZULTAT = HISLO%10; извлекдли 2
HISLO = HISLO/10;
REZULTAT = HISLO%10; извлекдли 9
HISLO = HISLO/10;
REZULTAT = HISLO%10; извлекдли 5
HISLO = HISLO/10;
REZULTAT = HISLO; извлекдли 4

Как решить эту задачу на асемблере? Заранее спасибо за помощь......
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_artem_
сообщение May 21 2006, 09:52
Сообщение #2


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



У атмела в аппликейшн нот уже есть готовая програмка на ассемблере. (see BCD conversion)
Кстати, можно писать на С а потом компилировать и изучать полученный код ....


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
Professor
сообщение May 21 2006, 09:59
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 35
Регистрация: 12-05-06
Из: Украина Харьков
Пользователь №: 17 045



Цитата(_artem_ @ May 21 2006, 12:52) *
У атмела в аппликейшн нот уже есть готовая програмка на ассемблере. (see BCD conversion)


А по подробнее.. где этот код?
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 21 2006, 10:58
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Professor @ May 21 2006, 17:59) *
Цитата(_artem_ @ May 21 2006, 12:52) *

У атмела в аппликейшн нот уже есть готовая програмка на ассемблере. (see BCD conversion)


А по подробнее.. где этот код?




Код
/****************************************************************************
Вывод шестнадцатиричного числа на два индикатора
Выполняет преобразование шестнадцатиричного числа в неупакованное десятичное
и выводит в два индикатора по указателю. Если число отрицательное то функция
возвращает 1, иначе 0
****************************************************************************/
void View_Hex_To_2_Leds(signed char data, char volatile*pbuf)
{ signed char tens;
    char count;

    // преобразуем число в положительное, если оно отрицательное
    g_System_Flags &= ~fNEGATIVE;
if(data < 0)
    { data = ~data + 1;
       g_System_Flags |= fNEGATIVE;
    }

    // счетчик десятков = -1
tens = -1;

    // подсчитываем количество единиц и десятков в числе
    do
    {   tens++;
        data -= 10;
    }
    while(data >= 0);
    data += 10;

    // теперь data содержит единицы, а tens десятки шестнадцатиричного числа,



........................




Это я использовал в программе таймера. Смысл преобразования в том, что из числа (разрядность которого уже известно), последовательно вычитаются сначала, допустим, десятки тысяч, потом единицы, потом сотни единиц, десятки единиц, в остатке остаются единицы. Для каждого разряда организуется счетчик, число которого в конце цикла и есть искомое число. Вот ссылка на русский сайт Атмел: http://atmel.ru/Articles/Articles.htm - сдесь очень много всего полезного начинающим, как раз и статья про преобразования HEX 2 BCD и даже че то с дробями)



http://atmel.ru/Articles/Atmel13.htm - это оно то что Вам надо, главное, все на ASM


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Professor   Как работать с переменными int в асемблере?   May 21 2006, 09:32
|- - Professor   [/quote] http://atmel.ru/Articles/Atmel13.htm - эт...   May 21 2006, 11:29
- - GetSmart   А оно вам надо? У АВРов нет команды деления, поэто...   May 21 2006, 11:06
- - _artem_   Professor, я специально ссылку вам не дал, чтобы в...   May 21 2006, 11:31
- - GetSmart   Так ведь можно прекрасно писать на си с асмовыми в...   May 21 2006, 12:15
|- - Professor   Цитата(GetSmart @ May 21 2006, 15:15) Так...   May 21 2006, 12:41
- - defunct   Деление 16-ти разрязного числа на 10 можно заменит...   May 21 2006, 15:11
|- - Professor   [/quote] Sha © (17.05.05 12:42) [20] Для реализ...   May 21 2006, 17:41
|- - defunct   Цитата(Professor @ May 21 2006, 20:41) Ци...   May 21 2006, 19:38
|- - Professor   [/quote] Как мед так и ложка побольше? Скажите сп...   May 21 2006, 19:43
- - GetSmart   Professor, Вы можете скомпилить вот это и посмотре...   May 21 2006, 18:24
|- - Professor   Цитата(GetSmart @ May 21 2006, 21:24) Это...   May 21 2006, 19:04
- - GetSmart   Универсальная MOD / DIV функция. Регистры можно по...   May 21 2006, 20:27


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016