[an error occurred while processing this directive]
Ответ: (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ShiphT 27 августа 2002 г. 15:28
В ответ на: Простите за мою недалёкость, а нельзя ли всё то же самое, но с коменнтариями - буду признателен отправлено REA 26 августа 2002 г. 19:04

комментариями, а не коменнтариями ;)


mov r0, #low(10000)
mov r1, #high(10000)

low(NUMBER) означает что надо взять младший байт числа NUMBER
high(NUMBER) - старший


#define NUM 100000
mov r0, #NUM/10000h
mov r1, #(NUM - NUM/10000h)/100h
mov r3, #(NUM - NUM/10000h).mod.100h

Тут несколько сложней.
Пусть NUM = 0x5AF40C
Если большое число поделить на 65536 (10000h), то результатом
будет самый старший байт (0x5A). (mov r0, #NUM/10000h)
Вторую строчку я несколько неправильно написал, прошу прощения,
должно быть:

mov r1, #((NUM - (NUM/10000h)*10000h)\100h)

т.к. у препроцессора арифметика целочисленная, то
(NUM/10000h)*10000h равно не NUM, а NUM минус средний и младший
байты. Т.е если NUM = 0x5AF40C, то (NUM/10000h)*10000h
равно 0x5A0000, значит
(NUM - (NUM/10000h)*10000h) = 0x5AF40C - 0x5A0000 = 0xF40C
если поделить это на 256 (100h), то получим средний байт (0xF4)
И, наконец, последняя строчка должна быть:

mov r1, #((NUM - (NUM/10000h)*10000h).mod.100h)

Где .mod. означает остаток от деления: 0xF40C/100h = 0xF4, остаток = 0x0C

Теперь попробую воспроизвести для четырехбайтный вариант:


mov r0, #NUM/1000000h
mov r1, #((NUM-(NUM/1000000h)*1000000h)/10000h)
mov r2, #((NUM-(NUM/1000000h)*1000000h-(NUM/10000h)*10000h)/100h)
mov r3, #((NUM-(NUM/1000000h)*1000000h-(NUM/10000h)*10000h).mod.100h)

Это очень громоздко, поэтому пользуйся макроопределениями типа:

#define HIGHHIGH(num) (num/1000000h)
#define HIGHLOW(num) ((num-(num/1000000h)*1000000h)/10000h)
#define LOWHIGH(num) ((num-(num/1000000h)*1000000h-(num/10000h)*10000h)/100h)
#define LOWLOW(num) ((num-(num/1000000h)*1000000h-(num/10000h)*10000h).mod.100h)

а дальше можно писать:

mov r0, #HIGHHIGH(YouNumber)
mov r1, #HIGHLOW(YouNumber)
mov r2, #LOWHIGH(YouNumber)
mov r3, #LOWLOW(YouNumber)

Для трехбайтного соответственно:

mov r0, #HIGHLOW(YouNumber)
mov r1, #LOWHIGH(YouNumber)
mov r2, #LOWLOW(YouNumber)

Но следует учесть, что не все компиляторы 51-го смогут так раскидать
большое число. На три байта еще могут, а на четыре пробовать надо.
Посмотри в доке на комилятор (если такую вдруг найдешь) ограничение на константу. Как правило это двойное слово (4 байта), но может быть
и меньше.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru