Size: a a a

Ассемблер

2021 August 22

d

disba1ancer in Ассемблер
т.е. уменьшение esp и пачка мовов, быстрее чем пачка пушей?
источник

E

Entusiast in Ассемблер
Нет, если нужно контролировать указатель - тогда будет лучше push. Он имеет тоже самое, что mov+sub внутри - 2 микрооперации на mov/sub, однако за счёт того, что push - 1 байт, он поможет сохранить производительность кода за счёт моп-кэша (uop-cache)

К примеру, иногда можно вместо:
push
push
push
call
Сделать:
mov dword[esp], 
mov dword[esp+4],
mov dword[esp+8],
call
источник

d

disba1ancer in Ассемблер
я имел ввиду одно изменение esp на пачку мовов
источник

E

Entusiast in Ассемблер
Не понял... Пример можно?
источник

d

disba1ancer in Ассемблер
.global I686_CallRealModeInterrupt
I686_CallRealModeInterrupt:
       sub     esp, 24
       mov     20[esp], ebx
       mov     16[esp], ebp
       mov     12[esp], esi
       mov     8[esp], edi

       mov     dword ptr 4[esp], offset 0f
       mov     dword ptr [esp], offset realmod_int_entry
       jmp     I686_EnterRealMode

0:      mov     ebx, 12[esp]
       mov     ebp, 8[esp]
       mov     esi, 4[esp]
       mov     edi, 0[esp]
       add     esp, 16
       ret
источник

E

Entusiast in Ассемблер
Внутри push - два действия - mov+sub
push
push
push
3*2 = 6 uop

Ты хочешь это заменить, насколько я понял, так:
sub
mov
mov
mov
mov - 1 uop, sub - 1 uop
источник

d

disba1ancer in Ассемблер
4 против 6?
источник

E

Entusiast in Ассемблер
Да, тут второй вариант будет работать быстрее
источник

E

Entusiast in Ассемблер
Нашёл по поводу этого:

; Example 2.2. Instructions split into µops
push eax
call func
The PUSH EAX instruction may be split into two µops which can be represented as SUB
ESP,4
and MOV [ESP],EAX. The advantage of this is that the SUB ESP,4 µop can be executed even if the value of EAX is not ready yet. The CALL operation needs the new value
of ESP, so the CALL would have to wait for the value of EAX if the PUSH instruction was not
split into µops. Thanks to the use of µops, the value of the stack pointer almost never
causes delays in normal programs.
источник

E

Entusiast in Ассемблер
Это с P1, включая MMX
Т.е push может не разбиться на uop, и call придётся ждать
Если же разделить это на:
sub
mov
Тогда sub выполнится не ожидая EAX
источник

ВВ

Вячеслав Васютин... in Ассемблер
В смысле, заполнить регистры для функции, потом заполнить еще, но только в стэке, а потом вытянуть адресса из стэка и передать их в регистры? Или как? Я просто обсолютный ноль в асм. Вроде читаю, стараюсь, но, кажется все к херам, так как ничего толком не могу..
источник

E

Entusiast in Ассемблер
Ну я же выше скинул статью, где написано про работу со стэком
источник

ВВ

Вячеслав Васютин... in Ассемблер
Да, я почитал. Но это же не работа с функциями, я никогда не работал. Передать в стэк адресса/значения я могу, как и вытянуть их.
источник

E

Entusiast in Ассемблер
Ну так вот передай адрес\значение, вызови функцию, а в функции вытяни это значение
источник

s

s54816 in Ассемблер
А вот что думает интел:
| Num Of |                    Ports pressure in cycles                     |    |
|  Uops  |  0  - DV  |  1  |  2  -  D  |  3  -  D  |  4  |  5  |  6  |  7  |    |
---------------------------------------------------------------------------------
|   2^   |           |     |           |           | 1.0 |     |     | 1.0 | CP | push eax
|   2^   |           |     | 1.0       |           | 1.0 |     |     |     | CP | push ecx
|   2^   |           |     |           | 1.0       | 1.0 |     |     |     | CP | push edx
Total Num Of Uops: 6
Latency: 5 Cycles

| Num Of |                    Ports pressure in cycles                     |    |
|  Uops  |  0  - DV  |  1  |  2  -  D  |  3  -  D  |  4  |  5  |  6  |  7  |    |
---------------------------------------------------------------------------------
|   1    | 0.3       | 0.3 |           |           |     | 0.3 | 0.3 |     |    | sub esp, 0xc
|   2^   |           |     | 0.5       | 0.5       | 1.0 |     |     |     | CP | mov dword ptr [esp], eax
|   2^   |           |     | 0.5       | 0.5       | 1.0 |     |     |     | CP | mov dword ptr [esp+0x4], ecx
|   2^   |           |     | 0.5       | 0.5       | 1.0 |     |     |     | CP | mov dword ptr [esp+0x8], edx
Total Num Of Uops: 7
Latency: 7 Cycles
источник

s

s54816 in Ассемблер
Чтобы таблица читалась, её придётся скопировать куда-нибудь, где моноширинный шрифт.
источник

E

Entusiast in Ассемблер
И такое бывает
источник

E

Entusiast in Ассемблер
На практике, на самом деле, будет казаться, что они одинаковы по скорости, если это не Pentium 1/Pentium MMX
источник

s

s54816 in Ассемблер
На практике на фоне переключения в реалмод там вообще не о чем думать.
источник

E

Entusiast in Ассемблер
Не, думать всегда нужно))

Processor:Instruction uops latency

GoldMont+:
 sub r, r/i          1     1
 mov m, r            1     2

 push                1     5


Pentium 4:
 sub r, r/i          1     0.5
 mov m, r            1     1

 push                2     1

Silvermont:
 sub r, r/i          1     1
 mov m, r            1     3

 push                1     8

Sandy Bridge:
 sub r, r/i          1     1
 mov m, r            1     3

 push                1     1

Zen3:
 sub r, r/i          1     1
 mov m, r            1     0-3

 push                1     6

AMD K7:
 sub r, r/i          1     1
 mov m, r            1     2

 push                1     5
источник