0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
|
|
1 | |
Сравнение и умножение двухбайтовых чисел в асме02.11.2011, 21:44. Показов 16389. Ответов 18
Метки нет (Все метки)
есть код
Код
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) как мне сравнивать двухбайтовое числа в асме для AVR? и умножать в двухбайтовые одно байтовые?
0
|
02.11.2011, 21:44 | |
Ответы с готовыми решениями:
18
Умножение дробных чисел в асме Побитовое сравнение двухбайтовых целых чисел со знаком Сложение двухбайтовых чисел Сумма двухбайтовых чисел Сложение двухбайтовых чисел с помощью команды DAD |
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 нету в тини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
А в приведенном коде- просто равны/неравны.
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
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 |
0
|
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
|
|
03.11.2011, 16:25 | 8 |
Сообщение от STT
понял что неправильно поставил вопрос кто может подсказать алгоритм умножения байтовых чисел и результате получить двухбайтовое?
0
|
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
|
|
03.11.2011, 17:25 | 9 |
0
|
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
|
|
03.11.2011, 20:58 | 10 |
Сообщение от Гарнист
немного потупил и решил сделать макро Код
;-----------------------------------------------------------------------------: ; 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 и 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 часа трассируя эти строчки раз за разом...
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 |
Сообщение от Гарнист
при вбивании в неё значений из первой (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 |
Сообщение от Гарнист
Спасибо! а нижнюю функцию могу выкинуть? за ненадобностью.
0
|
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
|
|
05.11.2011, 17:11 | 19 |
Можно выкинуть.
0
|
05.11.2011, 17:11 | |
05.11.2011, 17:11 | |
Помогаю со студенческими работами здесь
19
Не понимаю, как сделать сортировку двухбайтовых чисел Переписать элементы одномерного массива целых двухбайтовых чисел A Найти сумму и произведение данных целых двухбайтовых чисел Программа умножения двух двухбайтовых чисел. Assembler КР580 Дополните пожалуйста эти методы! скалярное произведение векторов, умножение на скаляр, сравнение векторов, сравнение Как переделать программу умножения для двухбайтовых чисел (КР580)? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |