Redirect to new edition!

К оглавлению

ИНСТРУКЦИЯ push
Помещает данные в стек.
 
Помещает данные в стек.
 
СИНТАКСИС
 
 
 
push reg
con,reg
 
АРГУМЕНТЫ
 
 
 
reg — регистры общего назначения или константа.
 
ОПИСАНИЕ
 
Данная инструкция используется для помещения в вершину стека значений, хранящихся в регистрах общего назначения EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI или констант, предворяемых символом '$'. В основном, она используется при выполнении операций вызова подпрограммы и передачи ей аргументов или возвращения результата работы функции (подпрограммы).
Для архитектуры x86-32 разрядность регистров стека EBP и ESP устанавливается согласно конфигурации по-умолчанию, соответственно 32 разряда, поэтому push в исходном коде ассемблера следует писать 'pushl'.
B архитектуре x86-64 инструкция push манипулирует с 64-х разрядным стеком. Таким образом, push в исходном коде ассемблера следует писать как 'pushq'. В тоже время, 32-х и 16-ти разрадные операции со стеком в данной архитектуре запрещены.
 
 
pushl %eax# неправильная инструкция
pushq %rax# однобайтовая инструкция
# кодируется так, как pushl %eax в
# 32-х разрядной
pushq %r10# двухбайтовая инструкция
кодируется как pushl предществ. REX
 
При использовании в GCC экспериментальной 16-ти разрядной поддержки (только для x86 архитектуре) наряду с указанием в коде ассемблера директив .code16 или .code16gcc, устанавливаемой обычно опцией компилятора --code16gcc, следует писать как 'pushw'. При этом, если используется .code16gcc нужно помнить, что в отличии от .code16 'pusha' и 'pushf' имеют размерность 32 разряда.
 
.code16gcc
.
.
.
pushw %bx# сохранение регистра BX
 
Взамен инструкции push обычно пользуются одной последовательностью, состоящей из двух инструкций – sub и mov, как это показано ниже.
 
#pushl %eax
subl $4,%esp# увеличение стека на 4 адреса
movl %eax,(%esp)# сохранение EAX в вершине стека
 

К оглавлению