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

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

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

Студворк — интернет-сервис помощи студентам
есть код
Code
1
2
3
4
5
6
7
8
9
10
int min = 0, step = 0;
void irq_timer_once_per_min()
{
min+=1;
while (min*164 > step*60)
{
move_motor_one_step();
step+=1;
}
}
проблема со строкой:
Code
1
 (min*164 > step*60)
так вот: значение может быть min 0-60 а step 0-164. т.е. 60*164=9840 - двухбайтовое число
как мне сравнивать двухбайтовое числа в асме для AVR? и умножать в двухбайтовые одно байтовые?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.11.2011, 21:44
Ответы с готовыми решениями:

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

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

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

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

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

Так вот - в АВР есть команда FMUL - ее результат как раз двухбайтовое число в регистрах R0, R1.
Как сравнивать - сходу не скажу. Наверное, как-то побайтно с использованием флагов переноса. Проще откомпилировать Сишный код и посмотреть в окошке дизассемблера при отладке.
на асме - месяц назад начал учить программирование. до си ещё не дошёл
(и не до освоил РТОС на асме от Ди)
FMUL нету в тини2313
по поводу сравнения (спасибо доброму человеку):
Code
1
2
3
4
5
;сравнение R11:R10 с R21:R20
CP     R10,R20
CPC   R11,R21
BREQ EQU
NO_EQU:
сижу проверяю
0
 Аватар для stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
02.11.2011, 23:25
Цитата Сообщение от Orsomum
т.е. 60*164=9840 - двухбайтовое число
как мне сравнивать двухбайтовое числа в асме для AVR? и умножать в двухбайтовые одно байтовые?
Дык в чем сложность? Сначала сравниваешь старшие байты. Если первый байт больше второго- значит и первое двухбайтное число больше. Если первый байт меньше второго- значит и чсло меньше. Если старшие байты равны- переходим к сравнению младших.
А в приведенном коде- просто равны/неравны.
0
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 382
02.11.2011, 23:27
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)
Code
1
2
3
4
5
; цикл 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
Цитата Сообщение от 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
 Аватар для stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
03.11.2011, 00:16
Умножение:http://itm-chan.org/docs/avrlib/mul16.txt
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
03.11.2011, 16:25
Цитата Сообщение от STT
попробовал вникнуть и сфейлил - на выходе 32х байтовое число.

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

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
;-----------------------------------------------------------------------------:
; 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
Обожемой. Зачем из процедуры делать макрос? Для удобства написания? Так для этого можно сделать в макросе заполение регистров значениями, и вызов процедуры.
А макрос, будучи упомянут в тексте несколько раз, заполнит тело программы бесполезными повторами одного и того же кода.
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
05.11.2011, 01:48
переделал
сделал отдельной процерурой вызываемой из вот такого вот макроса:
Code
1
2
3
4
5
6
7
8
9
.MACRO MULD
MOV R16,@1
MOV R17,@0
MOV R18,@2
RCALL mul08s
MOV @0,R17
MOV @1,R16
MOV @2,R18
.ENDMACRO
вот сама процедура
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/*
; 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
Отладчик в помощь.
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
05.11.2011, 12:53
Цитата Сообщение от Гарнист
Отладчик в помощь.
??????????????! (Японский. гугл транслейт в помощь)
я не задал бы это вопрос если бы не потратил 3 часа трассируя эти строчки раз за разом...
раз 10 проверял
теперь ещё и раз 50 трассировал
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
05.11.2011, 15:25
Странно, всегда пользовался Ченовским кодом, и никогда не случалось засады. Вероятно, у вас некорректно подставлены регистры, в процедуру и макрос, и где-то происходит замещение нужного числа ненужным.
Лично я бы предложил бы воздержаться от любой модификации кода Чена, подставить в начало вашей программы регистровые объявления символов var10/var11/var20/lc, и отказаться от макроса в принципе, тем более что авээровский макропроцессор более чем убог. Все эти мувы туда-сюда не несут практического смысла. Проще или сразу назначить нужные регистры, или забить на асм, и писать на сях, или микропаскале - если уж восхотелось красивого синтаксиса.
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
05.11.2011, 15:33
Цитата Сообщение от Гарнист
Странно, всегда пользовался Ченовским кодом, и никогда не случалось засады. Вероятно, у вас некорректно подставлены регистры, в процедуру и макрос, и где-то происходит замещение нужного числа ненужным.
Лично я бы предложил бы воздержаться от любой модификации кода Чена, подставить в начало вашей программы регистровые объявления символов var10/var11/var20/lc, и отказаться от макроса в принципе, тем более что авээровский макропроцессор более чем убог. Все эти мувы туда-сюда не несут практического смысла. Проще или сразу назначить нужные регистры, или забить на асм, и писать на сях, или микропаскале - если уж восхотелось красивого синтаксиса.
только чт попробовал и вторая функция, что считала хорошо
при вбивании в неё значений из первой (A4*02) выдала ту же фигню что и первая хотя первая была закоменчена.
обратное тоже верно - множители второй прекрасно считаются в первом вызове.
то есть выше какого значения процедура начинает выдавать мусор
трассировка. ничего не прошивал
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
05.11.2011, 15:39
Верно же всё. Вы пользуетесь процедурой mul08s, и умножаете -36 на 2. Получается -72, 0но же ff48, что же вы хотите? Пользуйтесь беззнаковым умножением. Если вы хотите, чтобы ваше a4 воспринималось как 164, а не как -36.
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
05.11.2011, 15:53
Цитата Сообщение от Гарнист
Верно же всё. Вы пользуетесь процедурой 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
Можно выкинуть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.11.2011, 17:11
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru