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

 
 
> Как работать с переменными 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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 16)
_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
GetSmart
сообщение May 21 2006, 11:06
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



А оно вам надо? У АВРов нет команды деления, поэтому будете писать сами процедуры деления и нахождения остатка.

Вы для начала объясните, зачем пытаетесь писать именно на асме не зная его? Чем вас Си неустраивает? Только не говорите об оптимизации. Это при незнании асма не аргумент.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Professor
сообщение May 21 2006, 11:29
Сообщение #6


Участник
*

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



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

Там практически все ссылки не работают....

Цитата(GetSmart @ May 21 2006, 14:06) *
А оно вам надо? У АВРов нет команды деления, поэтому будете писать сами процедуры деления и нахождения остатка.

Вы для начала объясните, зачем пытаетесь писать именно на асме не зная его? Чем вас Си неустраивает? Только не говорите об оптимизации. Это при незнании асма не аргумент.



Этот код это часть проекта на асемблере... Зачем решаю pflfxe в AVRStudio? Дело в том что надо собрать генератор... а добиться нужных частот получилось только написав программу на асемьлере....
Go to the top of the page
 
+Quote Post
_artem_
сообщение May 21 2006, 11:31
Сообщение #7


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

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



Professor, я специально ссылку вам не дал, чтобы вы почитали немного эти ноты ( http://atmel.com/dyn/products/app_notes.asp?family_id=607 )
- тогда большинство ваших вопросов настояших и будуших автоматически отпадет. Но если вы настаиваете то вот они :

http://atmel.com/dyn/resources/prod_documents/doc0938.pdf
http://atmel.com/dyn/resources/prod_documents/AVR204.zip


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

Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 21 2006, 12:15
Сообщение #8


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Так ведь можно прекрасно писать на си с асмовыми вставками. Даже если эти вставки будут представлять основной цикл проги. То есть все настроечные процедуры (расчёты и прочее) проще писать на си. Никто ведь не заставляет делать весь проект на асме или на си.

А проще всего понять как надо сделать что-то на асме - это написать на си и посмотреть в отладчике или листинге, в какие команды это преобразовал компилятор.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Professor
сообщение May 21 2006, 12:41
Сообщение #9


Участник
*

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



Цитата(GetSmart @ May 21 2006, 15:15) *
Так ведь можно прекрасно писать на си с асмовыми вставками. Даже если эти вставки будут представлять основной цикл проги. То есть все настроечные процедуры (расчёты и прочее) проще писать на си. Никто ведь не заставляет делать весь проект на асме или на си.

А проще всего понять как надо сделать что-то на асме - это написать на си и посмотреть в отладчике или листинге, в какие команды это преобразовал компилятор.


Асемблерные вставки в сишный проэкт это первое что я попробывал... дело втом что компилятор перед асемблерной вставкой сохраняет се регистры встеке а птом их извлекает.... это потеря времени... и как следствие сильное падение частоты генератора... Это не подходит... И приходится все делать н аасемблере....

Сообщение отредактировал Professor - May 21 2006, 12:42
Go to the top of the page
 
+Quote Post
defunct
сообщение May 21 2006, 15:11
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Деление 16-ти разрязного числа на 10 можно заменить умножением числа на 0xCCCD и сдвигом произведения вправо на 19.

Цитата
Sha © (17.05.05 12:42) [20]
Для реализации беззнакового деления на 10
надо реализовать следующие алгоритмы:

08 бит: j:=(i*$CD) shr 11;
16 бит: j:=(i*$CCCD) shr 19;
32 бит: j:=(i*$CCCCCCCD) shr 35;
Go to the top of the page
 
+Quote Post
Professor
сообщение May 21 2006, 17:41
Сообщение #11


Участник
*

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



[/quote]
Sha © (17.05.05 12:42) [20]
Для реализации беззнакового деления на 10
надо реализовать следующие алгоритмы:

08 бит: j:=(i*$CD) shr 11;
16 бит: j:=(i*$CCCD) shr 19;
32 бит: j:=(i*$CCCCCCCD) shr 35;
[/quote]

Это код на асемблере что-ли?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 21 2006, 18:24
Сообщение #12


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Professor,
Вы можете скомпилить вот это и посмотреть листинг? (*.lst)
Цитата
void WriteChar(unsigned char c)
{
// сами решите куда ложить этот символ
}

void WriteNum(unsigned int Num)
{
unsigned char i,j;

i = 0;
do
{
i++;
j = Num % 10 + '0'; // если '0' не добавлять то будет не символ, а просто число от 0 до 9
asm("push %j");
Num = Num / 10;
} while (Num);
do
{
asm("pop %j");
WriteChar(j); // а можете здесь ложить его куда-нибудь в массив-переменную
} while (--i);
}

Это вывод числа (максимум 5 цифр для AVR) с обрезанием передних нулей. Хотя насчёт AVRStudio не знаю сработает ли значок "%", я компилил в ICCAVR 6.30


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Professor
сообщение May 21 2006, 19:04
Сообщение #13


Участник
*

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



Цитата(GetSmart @ May 21 2006, 21:24) *
Это вывод числа (максимум 5 цифр для AVR) с обрезанием передних нулей. Хотя насчёт AVRStudio не знаю сработает ли значок "%", я компилил в ICCAVR 6.30


Мне нужен код чисто на асемблере... AVRStudio это не сишный компилятор а асемблерный....

Сообщение отредактировал Professor - May 21 2006, 19:04
Go to the top of the page
 
+Quote Post
defunct
сообщение May 21 2006, 19:38
Сообщение #14


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Professor @ May 21 2006, 20:41) *
Цитата

Sha © (17.05.05 12:42) [20]
Для реализации беззнакового деления на 10
надо реализовать следующие алгоритмы:

08 бит: j:=(i*$CD) shr 11;
16 бит: j:=(i*$CCCD) shr 19;
32 бит: j:=(i*$CCCCCCCD) shr 35;


Это код на асемблере что-ли?

Это демонстрация полного нежелания решать свою задачу самостоятельно?

Цитата(Professor @ May 21 2006, 22:04) *
Мне нужен код чисто на асемблере... AVRStudio это не сишный компилятор а асемблерный....

Пишите, алгоритм вам дан.
За вас это никто делать не будет, а уже сделанным вы полностью отбили желание с вами делиться.
Go to the top of the page
 
+Quote Post
Professor
сообщение May 21 2006, 19:43
Сообщение #15


Участник
*

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



[/quote]
Как мед так и ложка побольше?

Скажите спасибо, что я поделился с вами алгоритмом, который не требует операции деления.
[/quote]

Спасибо....
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 21 2006, 20:27
Сообщение #16


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Универсальная MOD / DIV функция. Регистры можно поменять.
Цитата
LDI R25,5
m0:MOV R17,R20 ; это регистры из вашего задания
MOV R16,R21
LDI R18,10 ; это на что делим (на 10)
LDI R19,0
Цитата
CLR R14
CLR R15
LDI R24,0x10
m1: ADD R16,R16
ADC R17,R17
ADC R14,R14
ADC R15,R15
CP R14,R18
CPC R15,R19
BRCS m2
SUB R14,R18
SBC R15,R19
INC R16
m2: DEC R24
BRNE m1

; здесь переносите R15:R14 в ... REZULTAT

MOV R20,R17
MOV R21,R16
dec R25
BRNE m0 ; и далее идёте в начало цикла (цитаты)

Внутри средней цитаты: Параметры: R17:R16 - делимое, R19:R18 - делитель. Выход: R17:R16 - результат. R15:R14 - остаток. Все нечётные регистры - старшие байты значений.

Сообщение отредактировал GetSmart - May 21 2006, 20:50


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 11:48
Рейтинг@Mail.ru


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