Вопрос по Асму.
Proc1:
…....
PopB
…....
Ret
Start Program:
…........
PushbB
Call proc1
…...
будет работать также как
PushbB
PopB
в одной процедуре(программе)?..
либо значение B будет портиться вызовом Call который вроде же пишет в стек адрес возврата?
З.ы. Просто у меня в модуле с этим по-другому, вот интересует...
2. Подскажите простейший код как на асме эффективно реализовывается CASE OF.
DprToLvt (PasToLvt)
Re: DprToLvt (PasToLvt)
Нет конечно-же. PUSH B / RET отправит процессор по адресу в регистре BC.sas9568635 wrote:будет работать также как
PushbB
PopB
в одной процедуре(программе)?..
POP B, если ничего не положить в стек, вытащит адрес возврата из процедуры в регистр BC.sas9568635 wrote:либо значение B будет портиться вызовом Call который вроде же пишет в стек адрес возврата?
Простейший:sas9568635 wrote:2. Подскажите простейший код как на асме эффективно реализовывается CASE OF.
CPI Value1
JNZ Next1
...
JMP EndOfCase
Next1:
CPI Value2
JNZ Next2
...
Но он не самый компактный, и не самый быстрый, если много альтернатив.
Быстрее и компактнее делать при помощи процедуры бинарного поиска по таблице (значение-адрес), которую обычно размещают после вызова этой процедуры.
-
sas9568635
- Posts: 372
- Joined: 20 Apr 2012, 16:00
- Location: Конотоп
Re: DprToLvt (PasToLvt)
Спасибо!b2m wrote:Нет конечно-же. PUSH B / RET отправит процессор по адресу в регистре BC.
Т.е. другими словами правильно делать так?:
m1:
.......
PushB
.......
PushD
.......
PopD;
PopB;
Ret
StartProrgam:
.......
PushB
.......
Call m1
.......
PopB;
.......
Главное что-бы и Pop и Push не "переламовало" вызовом Call и Ret?!... Я правильно понимаю?
С безусловными переходами(JNZ, JZ,JMP) такого нет? Я правильно понимаю?
При Push содержимое регистровой пары не меняется?! Я правильно понимаю?
Всякие там переполнения стека меня как новичка ещё не скоро каснётся?! Я правильно понимаю?
Ой!...b2m wrote: ....Быстрее и компактнее делать при помощи процедуры бинарного поиска по таблице (значение-адрес), которую обычно размещают после вызова этой процедуры.
Спасибо!
Re: DprToLvt (PasToLvt)
Надеюсь, что даsas9568635 wrote:Я правильно понимаю?
-
sadfsdfsdaf
- Posts: 227
- Joined: 07 Dec 2010, 16:54
Re: DprToLvt (PasToLvt)
Никак, это очень сложный оператор и простейших решений нет.sas9568635 wrote: 17 Sep 2013, 07:352. Подскажите простейший код как на асме эффективно реализовывается CASE OF.
Если количество вариантов мало и они сильно разрежены, то могут скомпилировать линейную последовательность сравнений с условными переходами.
Если количество вариантов велико и они сильно разрежены, то компилируют дерево двоичного поиска на серии сравнений и условных переходов.
Если вне зависимости от количества вариантов они компактны, то компилируют таблицу подстановки (которую разыменовывают исходным значением, использую его как индекс).
И, наконец, для смешанного варианта очень большого переключателя применяются все 3 способа, когда исходный переключатель разбивают на подблоки и к каждому подблоку применяют свою стратегию реализации. Плюс по каждому варианту могут быть разные способы реализации, т.к. при компиляции будут доступны в каждом случае разные свободные регистры (для неортогональной системы команд) и могут быть разные требования к памяти и коду (например, избыток памяти данных или избыток памяти кода). Вплоть до компиляции обычного вызовы процедуры с параметрами.
Не удивлюсь, если там экспоненциальная сложность (оптимизация двоичных выражений во всяком случае такой точно является).
По крайней мере, я умудрялся завешивать компилятор Си++, когда генерировал ему на вход свой код (используя Си в качестве эдакого ассемблера для реализации своей системы).
Who is online
Users browsing this forum: No registered users and 1 guest

