2015-01-03 5 views
2

Поскольку вызывающее соглашение функции утверждает, какие регистры сохраняются, может ли регистр использоваться как счетчик циклов?Могу ли я использовать регистр в качестве счетчика циклов?

Сперва подумал, что регистр ecx используется как счетчик циклов, но после выяснения, что функция stdcall, которую я использовал, не сохранил значение ecx, иначе я думал бы.

Есть ли какой-либо реестр, который гарантирован (по большей части используемые соглашения о звонках как минимум), который необходимо сохранить?

Примечание: У меня нет проблем с использованием переменной стека в качестве счетчика циклов, я просто хочу убедиться, что это единственный способ.

+0

вы можете нажать 'ecx' в стек и восстановить его перед вами' ret', или вы могли бы просто использовать другой регистр –

+1

'нажимной ECX 'перед созданием' stdcall' и 'pop ecx' после возврата вызова каждый раз через цикл. – lurker

ответ

2

Вы можете использовать любой регистр общего назначения, а иногда и другие, как счетчик циклов (просто не указатель стека, конечно, ☺).

Либо использовать один петли вручную, т.е. заменить ...

loop label 

... с ...

dec ebp 
jnz label 

... который быстрее в любом случае (потому что AMD (и более поздних версий Intel, когда они догнали, МГц) искусственно замедлил команду loop, так как в противном случае скомпилировано программное обеспечение Windows® и некоторое программное обеспечение Turbo Pascal).

Или вы просто сохранить счетчик между:

label: 
    push ecx 
    call func 
    pop ecx 
    loop label 

Оба являются стандартными стратегиями.

2

Есть ли какой-либо реестр, который гарантирован (по большей части используемые соглашения о звонках как минимум), который необходимо сохранить?

Вы можете выбрать любой свободный регистр в своем собственном коде, если ваш код цикла не вызовет никакого внешнего объекта.

Если ваш код цикла вызовет внешний объект, где единственным гарантированным договором является ABI и соглашение о вызове, то вы должны сохранять/восстанавливать свои регистры и делать выбор регистров в каждом конкретном случае.

Цитирования отличной бумаги Agner тумана в Calling conventions for different C++ compilers and operating systems:

6 использования Регистра

правил для использования регистра зависит от операционной системы, как показан в таблице 4. регистры скреста регистры, которые могут быть используется для временного хранения без ограничений (также называемых регистрами-хранителями или летучими регистрами). Регистры сохранения Callee - это регистры, которые необходимо сохранить перед их использованием и восстановить после их использования (также называемые энергонезависимыми регистрами). Вы можете полагаться на эти регистры, имеющие одинаковое значение после вызова, как перед вызовом ...

enter image description here

...

Смотрите также: