2014-09-24 3 views
0

Я начала меня в программировании на ассемблере, я делаю некоторые алгоритмы и количество регистров общего назначения недостаточно для тогоIA32-x86 Использование регистров специального назначения, как регистры общего назначения

Есть ли способ использовать специальные регистры (eip, eflags) в качестве регистров общего назначения в asm?

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

Возможно ли это?

+3

Вы можете написать 'eip', выполнив' jmp value'. И вы можете прочитать из него 'call foo; foo: pop eax; 'Но у первого, вероятно, есть побочные эффекты, которые вам не нужны. :) Короче говоря, вы не сможете использовать 'eip' и' eflags' для других целей. (и большинство арифметических инструкций будут неявно записываться в 'eflags') – Mysticial

+2

Практически вы не можете использовать регистры не по назначению.Если вы новичок в ассемблере, вы, вероятно, еще не знаете, как организовать свой код, чтобы свести к минимуму давление в регистре. И в некоторых местах вы просто придерживаетесь требований конкретного алгоритма. Как правило, если вы тщательно кода, ваш код будет в основном работать достаточно быстро. Код разумно, сначала запустите его, * затем * беспокойтесь о том, слишком ли он медленный. –

+0

Вы можете сохранить некоторые бит 'ah'' 'eflags' с' sahf', и вы можете загрузить их в 'ah' с' lahf'. Вы также можете хранить данные в виде флагов с 'popf', но это может иметь нежелательные побочные эффекты. И в коде реального режима (устаревший или загрузчик) вы можете блокировать прерывания с помощью 'cli', а затем хранить' esp' где-то, использовать 'esp' в качестве общего назначения, загружать исходное значение' esp' и разрешать прерывания с помощью 'sti'. Вы можете использовать 'eip' для хранения некоторых данных, например. с 'jmp eax' /' call eax', если все используемые значения (цели перехода) имеют действительный код. Во всяком случае, для практических целей вам лучше следовать совету Иры Бакстер. – nrz

ответ

0

Короткий ответ - нет.

Если вы используете программу, использование eip в качестве реестра общего назначения, безусловно, невозможно, как если бы вы «писали» в eip, ваша программа будет переходить на выполнение инструкций по этому адресу (примерно), что, вероятно, не будет работа. Что касается EFLAGS, у него есть несколько бит, которые либо зарезервированы, либо управляют различными вещами, которые вы не хотите менять, а это значит, что это не будет работать как регистр общего назначения. Поскольку вы, похоже, намерены не использовать память для сохранения значений, вы можете использовать esp и ebp (будьте осторожны, если вы вообще используете стек). Помимо этого, большинство регистров, которые, как я полагаю, вы используете, требуют уровня разрешений 0 для записи и снова, имели бы весьма вероятные отрицательные последствия, если бы вы использовали их в качестве регистров общего назначения.

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

+0

В реальном режиме и в виртуальном режиме регистры сегментов (DS, ES, FS и GS и, возможно, SS - если SP пропущен) также могут использоваться для хранения общих данных. Однако операции, которые могут выполняться с этими регистрами, очень ограничены. –

2

Разумное повторное использование регистра общего назначения, которое уже доступно для вас, скорее всего, будет вашим лучшим выбором. Подумайте очень внимательно о своем алгоритме.

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

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

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

2

Короткий ответ: Нет. Эти регистры не предназначены для написания явно.

Вам необходимо либо переписать свой алгоритм, лучше распределить регистры, справиться с интеллектуально разливными/перезагружаемыми регистрами в память, чтобы свести к минимуму воздействие на производительность, или, если возможно, использовать регистры XMM для перемещения регистров INT в/из или делать цепочки обучения на стороне XMM. Другой вариант - использовать 64 бит для использования дополнительных регистров, доступных.

0

Помню, что я использовал регистр отладки dr0 для dr3 для хранения данных. Но я не уверен, как быстро они будут использоваться. Возможно, переименование регистров внутри ЦП (для создания микроопераций) позволяет ему также работать.

Смежные вопросы