Re: Задачка
А, всё, такое невозможно...
Прямо сразу весь int в один бит засовывай, чего уж там...
ACC = f (ACC, asmcode чёт похожее уже на.
Но это уже изврат...
например повторять код
mov A, 0ffh
delay{i}:
dec ACC
sz ACC ; Skip if zero
jmp delay{i}
где i - номер повтора.
вообще в бытие журнала softmarket проводился конкурс
на самый длинный цикл при ограничениях на память,
за счет перекрестных jmp можно очень крутую задержку сделать
С перекрёсными ссылками вроде реально, точнее с переходами по адресу: ACC = f (ACC, PC но неочевидно пока...
это как "за минимальное количество действий найти максимальное натуральное число"
Но как её увеличить скажем в 100 раз, увеличив код , скажем раза в 4?
Есть 8-битный регистр в качестве счётчика для операции задержки..и где здесь про один цикл?
delay:
mov A, 0ffh
delay_:
dec ACC
sz ACC ; Skip if zero
jmp delay_
ret
Как можно увеличить количество итераций (и можно ли вобще) скажем в k раз не прибегая к дополнительным переменным. Ну вроде как нужна итерационная функия ACC=f(ACC) чтобы она сбрасывала ACC в ноль но за число итераций >> 256...
Вот типа. Стек, естественно, тоже жрётся линейно от глубины. А без стека я даже чо-та не представляю.
_funclabel:
dec ax
cmp ax, 0
je retLabel
call _funcLabel
call _funcLabel
retLabel:
inc ax
ret
Да, если интерес не чисто теоретический, то а) есть eax, в 16битном режиме праграммируют лохи; б) push cx и двойной цикл будет работать гораздо клевее.
Не, ну ёжику понятно, что можно операторов понапихать, тогда вобще регистры не нужны...
вопрос только как получше преобразовать одни в другие
где k - это время одной итерации в задержке
а n - это кол-во бит памяти, отданное под хранение состояния.
засчет наращивания кода (косвенно используя как память - регистр ip (номер текущей инструкции
задержку теоретически можно увеличить еще в 2^m раз (где m-это размер регистра ip)
соответственно, получается, что наращивание кода - дает только линейное увеличение задержки,
т.к. для того, чтобы, например, задействовать три бита регистра ip и увеличить время задержки в 8 раз - надо написать 8 кусков кода, .
где там вообще про ах речь шла? про 16-битные регистры? с чего вообще взял, что это i86 архитектура?
Я даже ассемблер визуально опознал - после того как пост запостил.
Вот Даркгрей вроде правильно написал. Ну то есть мысль такая: пусть есть n участков кода (участком кода назовём последовательность инструкций, в которой первая инструкция помечена меткой, а все джампы указывают на начальные метки других участков кода, а в конце как бы есть неявный джамп на следующий участок кода) и m состояний регистра. Тогда вся система в целом может иметь не более чем m*n состояний. В нашем "обобщенном цикле" эти общие состояния (временная переменная + номер участка кода) не должны повторяться - иначе в силу детерминированности мы никогда из цикла не выйдем. Таким образом количество итераций действительно растёт не быстрее чем линейно от размера кода.
Так что я бы посоветовал чуваку искать таки память и засовывать в неё временные переменные (а лучше даже предыдущее содержимое временных регистров). Двух-трёх лишних байтов должно хватить.
А вообще такое лучше делать через таймер. В этом микропроцессоре же явно должен быть таймер, и не один.
А вообще такое лучше делать через таймер. В этом микропроцессоре же явно должен быть таймер, и не один.Один. Он занят. Да и не лучше - это точно.
Всё это правильно. Я это сразу и понял, несколько из других более общих соображений (конечный автомат)..
Но есть альтернатива. Я не могу её пока описать кодом.
Можно использовать нефиксированные метки. Можно загружать PC и прыгать куда угодно. То есть фактически использовать ещё один регистр, но халявный...
Может ещё как-то можно...
Да, это не 86-я архитектура, это holtek, 8-битный МК. Так что вполне возможны архитектурно-зависимые решения...
Оставить комментарий
gun-alexei
Есть 8-битный регистр в качестве счётчика для операции задержки..delay:
mov A, 0ffh
delay_:
dec ACC
sz ACC ; Skip if zero
jmp delay_
ret
Как можно увеличить количество итераций (и можно ли вобще) скажем в k раз не прибегая к дополнительным переменным. Ну вроде как нужна итерационная функия ACC=f(ACC) чтобы она сбрасывала ACC в ноль но за число итераций >> 256...