Я снова.
Я имею, многие из "добавляют особенно, 4" в моей программе и я пытаюсь уменьшить ее размер. Есть ли какая-либо меньшая инструкция, которая может заменить, "добавьте особенно, 4"?
pop edx
или любой другой целочисленный регистр, который вы не против уничтожения.
Это то, какие современные компиляторы на самом деле делают (ZCC и иногда GCC), потому что он часто оптимален для производительности, а также размером кода на современных процессорах.
AN Add Add Esp, 4
после того, как вызова
принудил бы стек CPU для вставки UOP Sync Sync, прежде чем делать фактические . Добавить
. Если вы иначе не измените использование ESP напрямую, за исключением инструкций стека (например, в рамках режима адресации) перед следующим push / pop / call / ret, вы сохранили UOP с помощью POP
.
Эта линия кэша памяти стека будет горячее в кэше (делает груз дешево), если какие-либо другие инструкции стека работают недавно.
Извините, если это будет звучать тривиально ... но если вам удастся изменить свой код, чтобы несколько добавляют ESP, 4
инструкции подряд, вы можете, конечно, упростить их Например:
add esp, 8
или даже:
add esp, 12
просто убедитесь, что перемещенные инструкции не ссылаются ESP
или стек; Или если они ссылаются что-то в стеке, они делают только через реестр EBP
.
Один из способов сделать это, если у вас есть несколько вызовов функций:
sub esp, 4
mov 0(esp), param
call ...
...
mov 0(esp), param2
call ...
...
add esp, 4
, то есть повторно использовать стек, выделенный для первого параметра в течение нескольких вызовов функций.
Если вы управляете стеком (я предполагаю, что вы есть), вы можете использовать Push EAX
и POP EAX
, чтобы добавить значения в стек и поддерживать Esp
. Вы также можете использовать инструкции, такие как Pusha / Popa
, чтобы нажать / POPA , чтобы нажать / POPA , чтобы нажать / popa все GPRS включить / выключить стек и pushf / POPF
, чтобы нажать / pop eflags регистрирует вкл. / Выключение стека.
Предположим, что декларации
char foo[] = "This is a test";
char *bar = "This is a test";
в обоих случаях тип строкового литерала » Это тест
«является« 15-элементным массивом CHAR ». В большинстве случаев выражения массива неявно преобразуются из типа «N-элементный массив T» на «указатель на T», и выражение оценивается к адресу первого элемента массива. В декларации на бар
, это именно то, что происходит.
В Декларации FOO
, однако, выражение используется для инициализации содержимого другого массива и поэтому не преобразовано в тип указателя; Вместо этого содержимое скопированного строкового литерала копируется на foo
.
POPFD
добавит 4 на
всего в одном байте, с побочным эффектом рандогимирования ваших флагов. Это может быть медленно выполнить; Я не знаю.
Конечно, он поможет увидеть код или знать, какие ваши требования действительно .
(?:www)?
должен соответствовать www или ничего.
-121--3090734-Для получения очень чистого, удобного и тонкого способа работы с сеансом см. сообщение . Вы удивитесь, как просто это может быть.
-121--4321268- Вопрос может быть лучше: «Почему у вас так много инструкций add esp, 4
, и что вы можете сделать, чтобы их было меньше?» Это несколько необычно делать много небольших приращений к стеку указателя, как это.
Вы перемещаете вещи в/из стека одновременно? Не могли бы вы использовать push
/ pop
вместо этого?
Или вам действительно нужно обновлять указатель стека так часто, или вы могли бы уйти от перемещения его один раз в начале блока кода, чтобы освободить место в стеке, затем восстановить его один раз в конце процедуры?
Что вы действительно пытаетесь сделать?