Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Уродский вопрос про параметры функций


Автор: SomeNoOp 19.7.2007, 18:23
Доброе время суток! Извините за столь уродский вопрос, но почему если при вызове какой-нибудь функции нужно в параметре указать 0, то в стек забивают не 0, а регист, равный нулю. Это что-то дает? Иными словами я про разницу между:

push 0
call Function

и:

xor eax, eax
push eax
call Function

Автор: ILyAHA 19.7.2007, 18:59
А где ты нашел этот уродский код? smile 
Если у процедуры нет параметров, то и в стэк ничего не надо ложить.

Автор: spin2 19.7.2007, 19:13
Потому что в стек можно положить либо значение регистра, либо значение ячейки памяти...

Автор: SomeNoOp 19.7.2007, 19:16
А разница какая? Быстрее работает? Меньше места занимает? Если бы 0 был ячейкой памяти, то разница была бы очевидна, но ведь 0 это не адрес ячейки памяти, это константа. Или я не прав?

Автор: ILyAHA 19.7.2007, 19:47
Извиняюсь за чуш которую написал в начале. Непонял вопроса  smile 

Цитата

xor eax, eax
push eax


Здесь используется низкоуровневая оптимизация.

В книге Зубкова написано так:
Цитата

Используйте регистр ЕАХ всюду, где возможно. Команды с непосредственным операндом, с операндом — абсолютным адресом переменной и команды XCHG с регистрами занимают на один байт меньше, если другой операнд — регистр ЕАХ.


Набор этих команд дает оптимизацию выполнения на 10-20%.

А вообще почитай книгу Зубкова -  Assembler для Dos, Windows и Unix

Автор: ILyAHA 19.7.2007, 20:03
А вообще
Цитата

push 0

лучше неписать
Некоторые ассемблеры, например masm, могут воспринять это как ошибку.

Автор: SomeNoOp 20.7.2007, 11:17
Исчерпывающе, всем спасибо!

Автор: setty 20.7.2007, 11:32
ниразу масм не выдавал ошибки по поводу использования push 0 (2 байта)
использованием же 
xor eax, eax        2 байта
push eax        1 байт
можно выиграть в размере при вызовах функции где больинство параметров должно иметь нулевое значение
к примеру 
Код
        push    offset pinf        ;lppiProcInfo
        push    offset sinf        ;lpsiStartInfo
        push    eax            ;lpszCurdir
        push    eax            ;lpvEnviroment
        push    eax            ;fdwCreate
        inc    eax
        push    eax            ;fInheritHandles = yeah
        dec    eax
        push    eax            ;lpsaThread
        push    eax            ;lpsaProcess
        push    edi            ;lpzszCommandLine "cmd.exe"
        push    eax            ;lpszImageName 
        call    CreateProcess


однако выигрышь довольно скромен ) 

Автор: SomeNoOp 23.7.2007, 20:20
Действительно скромен, но все-таки он есть (=. Как я понел, если в функцию нужно передать параметры и только в ожном из параметров нужно передовать 0, то выгоднее писать push 00h, чем xor eax, eax push eax. Это правда?

Автор: W4FhLF 23.7.2007, 20:40
Цитата(SomeNoOp @  23.7.2007,  20:20 Найти цитируемый пост)
Это правда?


Что значит выгоднее? В плане размера? Почему бы не проверить самому?

Код

33C0            XOR EAX,EAX
50              PUSH EAX
50              PUSH EAX


Код

6A 00           PUSH 0
6A 00           PUSH 0
...


Как видишь, выгода начинается с 3х и более параметров. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)