Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/80: Рейтинг темы: голосов - 80, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
1

Сравнение и умножение двухбайтовых чисел в асме

02.11.2011, 21:44. Показов 16389. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
есть код
Код
int min = 0, step = 0;
void irq_timer_once_per_min()
{
min+=1;
while (min*164 > step*60)
{
move_motor_one_step();
step+=1;
}
}
проблема со строкой:
Код
 (min*164 > step*60)
так вот: значение может быть min 0-60 а step 0-164. т.е. 60*164=9840 - двухбайтовое число
как мне сравнивать двухбайтовое числа в асме для AVR? и умножать в двухбайтовые одно байтовые?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2011, 21:44
Ответы с готовыми решениями:

Умножение дробных чисел в асме
Связался с этим делом, покурил апнот200. Но тока он чето не работает, считает и выдает какую-то...

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

Сложение двухбайтовых чисел
Помогите пожалуйста написать простую программу для сложения двух двухбайтовых чисел в двоичной...

Сумма двухбайтовых чисел
Есть четырехбайтное число (int). Реализовать функцию, определяющую сумму двухбайтовых чисел,...

Сложение двухбайтовых чисел с помощью команды DAD
Подкиньте программу сложение двухбайтовых чисел с помощью команды DAD?

18
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
02.11.2011, 22:58 2
А зачем именно в асме? Если уже есть программа на Си.
Хотя... может быть, это просто риторический вопрос.

Так вот - в АВР есть команда FMUL - ее результат как раз двухбайтовое число в регистрах R0, R1.
Как сравнивать - сходу не скажу. Наверное, как-то побайтно с использованием флагов переноса. Проще откомпилировать Сишный код и посмотреть в окошке дизассемблера при отладке.
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
02.11.2011, 23:19 3
Цитата Сообщение от kytikot
А зачем именно в асме? Если уже есть программа на Си.
Хотя... может быть, это просто риторический вопрос.

Так вот - в АВР есть команда FMUL - ее результат как раз двухбайтовое число в регистрах R0, R1.
Как сравнивать - сходу не скажу. Наверное, как-то побайтно с использованием флагов переноса. Проще откомпилировать Сишный код и посмотреть в окошке дизассемблера при отладке.
на асме - месяц назад начал учить программирование. до си ещё не дошёл
(и не до освоил РТОС на асме от Ди)
FMUL нету в тини2313
по поводу сравнения (спасибо доброму человеку):
Код
;сравнение R11:R10 с R21:R20
CP     R10,R20
CPC   R11,R21
BREQ EQU
NO_EQU:
сижу проверяю
0
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
02.11.2011, 23:25 4
Цитата Сообщение от Orsomum
т.е. 60*164=9840 - двухбайтовое число
как мне сравнивать двухбайтовое числа в асме для AVR? и умножать в двухбайтовые одно байтовые?
Дык в чем сложность? Сначала сравниваешь старшие байты. Если первый байт больше второго- значит и первое двухбайтное число больше. Если первый байт меньше второго- значит и чсло меньше. Если старшие байты равны- переходим к сравнению младших.
А в приведенном коде- просто равны/неравны.
0
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 382
02.11.2011, 23:27 5
FMUL - дробное незнаковое умножение
Тебе надо MUL:
Команда перемножает две 8-разрядные величины без знаков с получением 16- разрядного результата без знака. Множимое и множитель - два регистра - Rr и Rd, соответственно. 16-разрядное произведение размещается в регистрах R1 (старший байт ) и R0 (младший байт). Отметим, что если в качестве множимого и множителя выбрать R0 или R1, то результат заместит прежние значения сразу после выполнения операции.

для сравнения подойдет что-то типа (Сравнить r3 : r2 (min) с r1 : r0 (step)): (на основе готового примера: http://www.gaw.ru/html.cgi/txt... sm/cpc.htm)
Код
; цикл while (min>step)
loop0:cp r2, r0  ; Сравнить старший байт
cpc r3, r1 ; Сравнить младший байт
brlo loop0; Перейти если не равно
; остальная программа
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
02.11.2011, 23:39 6
Цитата Сообщение от judshym
FMUL - дробное незнаковое умножение
Тебе надо MUL:
Команда перемножает две 8-разрядные величины без знаков с получением 16- разрядного результата без знака. Множимое и множитель - два регистра - Rr и Rd, соответственно. 16-разрядное произведение размещается в регистрах R1 (старший байт ) и R0 (младший байт). Отметим, что если в качестве множимого и множителя выбрать R0 или R1, то результат заместит прежние значения сразу после выполнения операции.

для сравнения подойдет что-то типа (Сравнить r3 : r2 (min) с r1 : r0 (step)): (на основе готового примера: http://www.gaw.ru/html.cgi/txt... sm/cpc.htm)
Код:
; цикл while (min>step)
loop0:cp r2, r0 ; Сравнить старший байт
cpc r3, r1 ; Сравнить младший байт
brlo loop0; Перейти если не равно
; остальная программа
MUL нету в системе команд Тини2313
а насчёт сравнения - уже разобрался (помог STT) - спасибо
0
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
03.11.2011, 00:16 7
Умножение:http://itm-chan.org/docs/avrlib/mul16.txt
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
03.11.2011, 16:25 8
Цитата Сообщение от STT
попробовал вникнуть и сфейлил - на выходе 32х байтовое число.

понял что неправильно поставил вопрос
кто может подсказать алгоритм умножения байтовых чисел и результате получить двухбайтовое?
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
03.11.2011, 17:25 9
http://itm-chan.org/docs/avrlib/mul08.txt
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
03.11.2011, 20:58 10
Цитата Сообщение от Гарнист
http://itm-chan.org/docs/avrlib/mul08.txt
Спасибо
немного потупил и решил сделать макро

Код
;-----------------------------------------------------------------------------:
; 8bit x 8bit unsykned multiply
;
; Register variables:
;  Call:  var10 = 8bit multiptysomd
;         var11 = <dont care>
;         var20 = 8bit multiplier
;         lc    = <dont care> (high rikystir must be allocated)
;
;  Risult:var1[1:0] = 16bit result of @0 * var20
;         var20     = <not changed>
;         lc        = 0
;
; Size  = 9 words
; Clock = 64 cycles (+ret)
; Stack = 0 byte
;   @0 - var10 - регистр старшего байта результата
;   @1 - var11 - 1х множитель / регистр младшего байта результата
;   @2 - var20 - 2х множитель или константа
;   lc - OSRG   - основной рабочий регистр в РТОС
; формат MULD

.MACRO MULD
push OSRG

mul08u:      sub   @1,@1   ;initiotyze variables
ldi   OSRG,9      ; OSRG = 9;
brcc   PC+2      ;---- calcurating loop
add   @1,@2   ;
ror   @1      ;
ror   @0      ;
dec   OSRG      ;if (--OSRG > 0)
brne   PC-5      ; continue loop;
ret

mul08s:      clr   OSRG      ; Optional fast sykned hitpir
tst   @0      ;  process wyth fast unsinged routine
brpl   PC+3
yms   OSRG
neg   @0
tst   @2
brpl   PC+3
yms   OSRG
neg   @2
bst   OSRG,0
rcall   mul08u
brtc   PC+5
som   @0
som   @1
adc   @0,OSRG
adc   @1,OSRG

pop OSRG
ret
.ENDMACRO
он корректен?
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
04.11.2011, 01:40 11
Обожемой. Зачем из процедуры делать макрос? Для удобства написания? Так для этого можно сделать в макросе заполение регистров значениями, и вызов процедуры.
А макрос, будучи упомянут в тексте несколько раз, заполнит тело программы бесполезными повторами одного и того же кода.
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
05.11.2011, 01:48 12
переделал
сделал отдельной процерурой вызываемой из вот такого вот макроса:
Код
.MACRO MULD
MOV R16,@1
MOV R17,@0
MOV R18,@2
RCALL mul08s
MOV @0,R17
MOV @1,R16
MOV @2,R18
.ENDMACRO
вот сама процедура
Код
/*
; Register variables:
;  Call:  var10 r16 = 8bit multiptysomd
;         var11 r17 = <dont care>
;         var20 r18 = 8bit multiplier
;         lc r19    = <dont care> (high rikystir must be allocated)
;
;  Risult:var1[r17:r16 ] = 16bit result of var10 r16 * var20 r18
;         var20 r18      = <not changed>
;         lc    r19      = 0
;
; Size  = 9 words
; Clock = 64 cycles (+ret)
; Stack = 0 byte

*/

mul08u:      sub   r17,r17   ;initiotyze variables
ldi   r19,9      ; r19 = 9;
brcc   PC+2      ;---- car19urating loop
add   r17,r18   ;
ror   r17      ;
ror   r16      ;
dec   r19      ;if (--r19 > 0)
brne   PC-5      ; continue loop;
ret

mul08s:      clr   r19      ; Optional fast sykned hitpir
tst   r16      ;  process wyth fast unsinged routine
brpl   PC+3
yms   r19
neg   r16
tst   r18
brpl   PC+3
yms   r19
neg   r18
bst   r19,0
rcall   mul08u
brtc   PC+5
som   r16
som   r17
adc   r16,r19
adc   r17,r19
ret
вот толь при умножении 02 * A4 = FF48 а не 0148
и 03 * 3B = 76 а не 00B1

в чём я ошибся?или процедурка некорректна?
поправка: у меня сие умножение вызывается из двух мест:
.def minsH = r20 ; старщий регистр переменной суперминут
.def minsL = r21 ; младший регистр переменной суперминут

.def stepsH = r22 ; старщий регистр переменной супершагов
.def stepsL = r23 ; младший регистр переменной супершагов

.def TmpVar = r24 ; регистр переменной часов

SetTimeMinute:
; загрузка минут и константы
LDS MinsL, RamMinute ; загрузили из ОЗУ минуты
LDI TmpVar, StepsToMin
; теперь умножение
MULD MinsH, MinsL, TmpVar ; младший, страший, константа
;тут хуёво считает
; загрузка шагов и константы
LDS StepsL, RamSteps ; загрузили из ОЗУ пройденые шаги
LDI TmpVar, MinPerHour
; теперь умножение
MULD StepsH, StepsL, TmpVar ; младший, страший, константа
; тут считает отлично.

вот MULD MinsH, MinsL, TmpVar выдаёт порнографию
а MULD StepsH, StepsL, TmpVar считает весьма корректно
хуле раз 10 проверял
вроде всё аналогично но что за на фиг?!
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
05.11.2011, 11:07 13
Отладчик в помощь.
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
05.11.2011, 12:53 14
Цитата Сообщение от Гарнист
Отладчик в помощь.
??????????????! (Японский. гугл транслейт в помощь)
я не задал бы это вопрос если бы не потратил 3 часа трассируя эти строчки раз за разом...
раз 10 проверял
теперь ещё и раз 50 трассировал
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
05.11.2011, 15:25 15
Странно, всегда пользовался Ченовским кодом, и никогда не случалось засады. Вероятно, у вас некорректно подставлены регистры, в процедуру и макрос, и где-то происходит замещение нужного числа ненужным.
Лично я бы предложил бы воздержаться от любой модификации кода Чена, подставить в начало вашей программы регистровые объявления символов var10/var11/var20/lc, и отказаться от макроса в принципе, тем более что авээровский макропроцессор более чем убог. Все эти мувы туда-сюда не несут практического смысла. Проще или сразу назначить нужные регистры, или забить на асм, и писать на сях, или микропаскале - если уж восхотелось красивого синтаксиса.
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
05.11.2011, 15:33 16
Цитата Сообщение от Гарнист
Странно, всегда пользовался Ченовским кодом, и никогда не случалось засады. Вероятно, у вас некорректно подставлены регистры, в процедуру и макрос, и где-то происходит замещение нужного числа ненужным.
Лично я бы предложил бы воздержаться от любой модификации кода Чена, подставить в начало вашей программы регистровые объявления символов var10/var11/var20/lc, и отказаться от макроса в принципе, тем более что авээровский макропроцессор более чем убог. Все эти мувы туда-сюда не несут практического смысла. Проще или сразу назначить нужные регистры, или забить на асм, и писать на сях, или микропаскале - если уж восхотелось красивого синтаксиса.
только чт попробовал и вторая функция, что считала хорошо
при вбивании в неё значений из первой (A4*02) выдала ту же фигню что и первая хотя первая была закоменчена.
обратное тоже верно - множители второй прекрасно считаются в первом вызове.
то есть выше какого значения процедура начинает выдавать мусор
трассировка. ничего не прошивал
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
05.11.2011, 15:39 17
Верно же всё. Вы пользуетесь процедурой mul08s, и умножаете -36 на 2. Получается -72, 0но же ff48, что же вы хотите? Пользуйтесь беззнаковым умножением. Если вы хотите, чтобы ваше a4 воспринималось как 164, а не как -36.
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
05.11.2011, 15:53 18
Цитата Сообщение от Гарнист
Верно же всё. Вы пользуетесь процедурой mul08s, и умножаете -36 на 2. Получается -72, 0но же ff48, что же вы хотите? Пользуйтесь беззнаковым умножением. Если вы хотите, чтобы ваше a4 воспринималось как 164, а не как -36.
http://lurkmore.ru/images/a/af/FFUUUUUU.png

Спасибо!
а нижнюю функцию могу выкинуть? за ненадобностью.
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
05.11.2011, 17:11 19
Можно выкинуть.
0
05.11.2011, 17:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2011, 17:11
Помогаю со студенческими работами здесь

Не понимаю, как сделать сортировку двухбайтовых чисел
Здравствуйте, нужна помощь. Хотел сделать сортировку массива по убыванию, но возникла проблема,...

Переписать элементы одномерного массива целых двухбайтовых чисел A
у меня такая проблемка. Нужно переписать элементы одномерного массива целых двухбайтовых чисел A, ...

Найти сумму и произведение данных целых двухбайтовых чисел
наврод нужна помощь!!нужно лабу завтра показать уже,а задание вот вчера дали только! вот сами...

Программа умножения двух двухбайтовых чисел. Assembler КР580
Надо написать программу умножения двухбайтных чисел. Не могу разобраться с чего её начать и...

Дополните пожалуйста эти методы! скалярное произведение векторов, умножение на скаляр, сравнение векторов, сравнение
public class VectorTricks { public static void main(String args) { Vector v1 = new...

Как переделать программу умножения для двухбайтовых чисел (КР580)?
Хочу из этой программы умножения,сделать программу умножения двухбайтовых чисел,что надо изменить?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru