





Код: Выделить всё
ldi r16,high(RAMEND) ; Main program start
out SPH, r16 ; Set Stack Pointer to top of RAM
ldi r16, low(RAMEND) ;
out SPL, r16 ;
Код: Выделить всё
sbrc temp,0Код: Выделить всё
sbrc temp,1Код: Выделить всё
unsigned: ldi r18,$e8
ldi r19,$03
clr r20 ;Count result
div_1000: movw r0,r16 ;Division 1000's
sub r0,r18
sbc r1,r19
brcs ok_1000
inc r20
movw r16,r0
rjmp div_1000 ; Go again
ok_1000: mov r16,r20 ; Store result
Сколько регистров потребуется, во столько и надо записывать. Не обязательно использовать регистры, оперативка для чего, аж целый 1кБ.Dimon11 писал(а):Это получается сразу в несколько регистров такое число записывать?
Никоим образом. Именно константе 40000 присваивается имя max. Ведь в дальнейшем она употребляется с команде CPI, работающей с непосредственным операндом, т.е. с константой. Затем, если при отладке понадобится изменить это значение, за ним не придётся гоняться по всему листингу, достаточно заменить один раз в директиве .equzero648 писал(а):Присваиваем не имя числу, а наверно, все таки, значение присваиваем переменной с именем max.![]()
Ну, не знаю, как там написано в определениях констант и имен для препроцессоров, но считаю логично, так как, Я, считаю, все что справа присваивается тому, что слева. Хотя приходилось писать код для моторолы, там все наоборот, но только в командах.Jack_A писал(а): Никоим образом. Именно константе 40000 присваивается имя max.
Как минимум, это определение он точно знает, походу.прослушавшему ( или прогулявшему ) курс лекций по данному предмету.
Ну зачем же так радикально?zero648 писал(а):Теперь на счет точности вычислений, относительно этой константы 37.5, чтобы её повысить, в смысле точность, вместо 37 умножай на 37500, а потом дели на 1000, будет намного точнее.
Ошибки не будет, вы сами должны об этом позаботится, нужно просто при переполнении r20 складывать переполнения в другой свободный регистр командой ADC rxx,rnn, где rnn=0Dimon11 писал(а):досчитало до 50000, умножаем на 30, получается 1500000...Почему не выдает ошибки, то что регистр R20 переполнен (куда сохраняет результат произведения)?
Мк, а равно и компилятору, по барабану ошибки при переполнении. Нужно самому такие ситуации отслеживать. Как и указал предыдущий оратор.Dimon11 писал(а):Почему не выдает ошибки...?
Код: Выделить всё
; заданная скорость света
Vo:
.DB BYTE4(300000000),BYTE3(300000000)
.DB BYTE2(300000000),BYTE1(300000000)
Код: Выделить всё
LDI R20,BYTE4(300000000)
LDI R21,BYTE3(300000000)
LDI R22,BYTE2(300000000) ;HIGH(300000000)
LDI R23,BYTE1(300000000) ;LOW(300000000)
Проще в десятичную систему, раскидать разряды по регистрам, можно в BCD формат упаковать, так регистров в два раза меньше потребуется для хранения.Его надо как то преобразовывать в другую систему исчисления или т.п ?