Re: Задачка

gun-alexei

Есть 8-битный регистр в качестве счётчика для операции задержки..
delay:
mov A, 0ffh
delay_:
dec ACC
sz ACC ; Skip if zero
jmp delay_
ret
Как можно увеличить количество итераций (и можно ли вобще) скажем в k раз не прибегая к дополнительным переменным. Ну вроде как нужна итерационная функия ACC=f(ACC) чтобы она сбрасывала ACC в ноль но за число итераций >> 256...

gun-alexei

А, всё, такое невозможно...

rosali

Прямо сразу весь int в один бит засовывай, чего уж там...

gun-alexei

Да нет, на самом деле можно, если, к примеру, использовать ещё контекст этого же кода, вроде как
ACC = f (ACC, asmcode чёт похожее уже на.
Но это уже изврат...

mysha

легко:
например повторять код
mov A, 0ffh
delay{i}:
dec ACC
sz ACC ; Skip if zero
jmp delay{i}
где i - номер повтора.
вообще в бытие журнала softmarket проводился конкурс
на самый длинный цикл при ограничениях на память,
за счет перекрестных jmp можно очень крутую задержку сделать

gun-alexei

я же вроде говорил условие - цикл один, минимум команд и один регистр..
С перекрёсными ссылками вроде реально, точнее с переходами по адресу: ACC = f (ACC, PC но неочевидно пока...

yolki

минимум комманд - это сколько?
это как "за минимальное количество действий найти максимальное натуральное число"

gun-alexei

трудно обьяснить, я и сам могу nop -ов понатыкать в цикл и увеличить в кратное число раз... (в итоге мне нужна именно задержка)
Но как её увеличить скажем в 100 раз, увеличив код , скажем раза в 4?

mysha

Есть 8-битный регистр в качестве счётчика для операции задержки..
delay:
mov A, 0ffh
delay_:
dec ACC
sz ACC ; Skip if zero
jmp delay_
ret
Как можно увеличить количество итераций (и можно ли вобще) скажем в k раз не прибегая к дополнительным переменным. Ну вроде как нужна итерационная функия ACC=f(ACC) чтобы она сбрасывала ACC в ноль но за число итераций >> 256...
и где здесь про один цикл?

bleyman

А можно стек использовать? Если можно, то на раз делается экспоненциальная задержка

_funclabel:
dec ax
cmp ax, 0
je retLabel
call _funcLabel
call _funcLabel
retLabel:
inc ax
ret
Вот типа. Стек, естественно, тоже жрётся линейно от глубины. А без стека я даже чо-та не представляю.
Да, если интерес не чисто теоретический, то а) есть eax, в 16битном режиме праграммируют лохи; б) push cx и двойной цикл будет работать гораздо клевее.

hashion

Не, ну ёжику понятно, что можно операторов понапихать, тогда вобще регистры не нужны...

mysha

закон сохранения энергии - либо переменные, либо операторы...
вопрос только как получше преобразовать одни в другие

Dasar

Теоретически - длина задержки у тебя может быть: k*2^n
где k - это время одной итерации в задержке
а n - это кол-во бит памяти, отданное под хранение состояния.
засчет наращивания кода (косвенно используя как память - регистр ip (номер текущей инструкции
задержку теоретически можно увеличить еще в 2^m раз (где m-это размер регистра ip)
соответственно, получается, что наращивание кода - дает только линейное увеличение задержки,
т.к. для того, чтобы, например, задействовать три бита регистра ip и увеличить время задержки в 8 раз - надо написать 8 кусков кода, .

yolki

где там вообще про ах речь шла? про 16-битные регистры? с чего вообще взял, что это i86 архитектура?

bleyman

Да я уже понял.
Я даже ассемблер визуально опознал - после того как пост запостил.
Вот Даркгрей вроде правильно написал. Ну то есть мысль такая: пусть есть n участков кода (участком кода назовём последовательность инструкций, в которой первая инструкция помечена меткой, а все джампы указывают на начальные метки других участков кода, а в конце как бы есть неявный джамп на следующий участок кода) и m состояний регистра. Тогда вся система в целом может иметь не более чем m*n состояний. В нашем "обобщенном цикле" эти общие состояния (временная переменная + номер участка кода) не должны повторяться - иначе в силу детерминированности мы никогда из цикла не выйдем. Таким образом количество итераций действительно растёт не быстрее чем линейно от размера кода.
Так что я бы посоветовал чуваку искать таки память и засовывать в неё временные переменные (а лучше даже предыдущее содержимое временных регистров). Двух-трёх лишних байтов должно хватить.
А вообще такое лучше делать через таймер. В этом микропроцессоре же явно должен быть таймер, и не один.

hashion

А вообще такое лучше делать через таймер. В этом микропроцессоре же явно должен быть таймер, и не один.
Один. Он занят. Да и не лучше - это точно.
Всё это правильно. Я это сразу и понял, несколько из других более общих соображений (конечный автомат)..
Но есть альтернатива. Я не могу её пока описать кодом.
Можно использовать нефиксированные метки. Можно загружать PC и прыгать куда угодно. То есть фактически использовать ещё один регистр, но халявный...
Может ещё как-то можно...

hashion

Да, это не 86-я архитектура, это holtek, 8-битный МК. Так что вполне возможны архитектурно-зависимые решения...
Оставить комментарий
Имя или ник:
Комментарий: