Меньшая инструкция, чем, “добавляют особенно, 4”

Я снова.

Я имею, многие из "добавляют особенно, 4" в моей программе и я пытаюсь уменьшить ее размер. Есть ли какая-либо меньшая инструкция, которая может заменить, "добавьте особенно, 4"?

5
задан Stephen Canon 10 January 2010 в 20:18
поделиться

7 ответов

pop edx  

или любой другой целочисленный регистр, который вы не против уничтожения.

Это то, какие современные компиляторы на самом деле делают (ZCC и иногда GCC), потому что он часто оптимален для производительности, а также размером кода на современных процессорах.

AN Add Add Esp, 4 после того, как вызова принудил бы стек CPU для вставки UOP Sync Sync, прежде чем делать фактические . Добавить . Если вы иначе не измените использование ESP напрямую, за исключением инструкций стека (например, в рамках режима адресации) перед следующим push / pop / call / ret, вы сохранили UOP с помощью POP ​​.

Эта линия кэша памяти стека будет горячее в кэше (делает груз дешево), если какие-либо другие инструкции стека работают недавно.

5
ответ дан 18 December 2019 в 08:28
поделиться
4648587-

Извините, если это будет звучать тривиально ... но если вам удастся изменить свой код, чтобы несколько добавляют ESP, 4 инструкции подряд, вы можете, конечно, упростить их Например:

add esp, 8

или даже:

add esp, 12

просто убедитесь, что перемещенные инструкции не ссылаются ESP или стек; Или если они ссылаются что-то в стеке, они делают только через реестр EBP .

4
ответ дан 18 December 2019 в 08:28
поделиться

Один из способов сделать это, если у вас есть несколько вызовов функций:

sub esp, 4
mov 0(esp), param
call ...
...
mov 0(esp), param2
call ...
...
add esp, 4

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

2
ответ дан 18 December 2019 в 08:28
поделиться

Попробуйте использовать pop eax

2
ответ дан 18 December 2019 в 08:28
поделиться

Если вы управляете стеком (я предполагаю, что вы есть), вы можете использовать Push EAX и POP ​​EAX , чтобы добавить значения в стек и поддерживать Esp . Вы также можете использовать инструкции, такие как Pusha / Popa , чтобы нажать / POPA , чтобы нажать / POPA , чтобы нажать / popa все GPRS включить / выключить стек и pushf / POPF , чтобы нажать / pop eflags регистрирует вкл. / Выключение стека.

0
ответ дан 18 December 2019 в 08:28
поделиться

Предположим, что декларации

char foo[] = "This is a test";
char *bar  = "This is a test";

в обоих случаях тип строкового литерала » Это тест «является« 15-элементным массивом CHAR ». В большинстве случаев выражения массива неявно преобразуются из типа «N-элементный массив T» на «указатель на T», и выражение оценивается к адресу первого элемента массива. В декларации на бар , это именно то, что происходит.

В Декларации FOO , однако, выражение используется для инициализации содержимого другого массива и поэтому не преобразовано в тип указателя; Вместо этого содержимое скопированного строкового литерала копируется на foo .

-121--1302223-

POPFD добавит 4 на всего в одном байте, с побочным эффектом рандогимирования ваших флагов. Это может быть медленно выполнить; Я не знаю.

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

0
ответ дан 18 December 2019 в 08:28
поделиться
(?:www)?

должен соответствовать www или ничего.

-121--3090734-

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

-121--4321268-

Вопрос может быть лучше: «Почему у вас так много инструкций add esp, 4 , и что вы можете сделать, чтобы их было меньше?» Это несколько необычно делать много небольших приращений к стеку указателя, как это.

Вы перемещаете вещи в/из стека одновременно? Не могли бы вы использовать push / pop вместо этого?

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

Что вы действительно пытаетесь сделать?

5
ответ дан 18 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: