К оглавлению

ИНСТРУКЦИЯ sub
 
Осуществляет операцию вычитания с целочисленными значениями (или операндами).
 
СИНТАКСИС
 
 
SUB reg,reg
SUB con,reg
SUB con,mem
SUB mem,reg
SUB reg,mem
 
АРГУМЕНТЫ
 
 
 
reg — регистры общего назначения
con — константа (операнд)
mem — адрес памяти
 
ОПИСАНИЕ
 
В первом аргументе инструкции sub указывается регистр, адрес памяти или предворяемым символом '$' константа (операнд), выступающие в роли вычитаемого целочисленного значения. Во втором аргументе – только регистр и адрес памяти, потому что выполнение операции вычитания из уменьшаемого целочисленного значения может быть выполнена только с хранящим его доступной по записи области данных, как показано ниже с возможным сочетанием комбинаций передачи аргументов инструкции sub.
 
SUB reg,reg #1) из регистра в регистр
SUB con,reg #2) константное значение в регистр
SUB con,mem #3) константное значение в адрес памяти
SUB mem,reg #4) из адреса памяти в регистр
SUB reg,mem #5) из регистра в адрес памяти
 
В языке программирования GNU C инструкции sub соответствует оператор совмещенный с присваиванием вычитания '–=' как показано в примере ниже.
 
 # struct {
.comm   subtract_op,5,1 # int minuend;
 # unsigned char subtrahend;
 # } __attribute__ ((__packed__)) subtract_op;
 
main:
pushl%ebp# int main (void)
movl%esp, %ebp# {
movl$131071, subtract_op# subtract_op.minuend = 131071;
movb$127, subtract_op+4# subtract_op.subtrahend = 127;
movlsubtract_op, %edx
movzblsubtract_op+4, %eax
movzbl%al, %eax
movl%edx, %ecx
subl%eax, %ecx# subtract_op.minuend -=
movl%ecx, %eax# subtract_op.subtrahend;
movl%eax, subtract_op
movlsubtract_op, %eax# return subtract_op.minuend;
popl%ebp# }
ret
При этом, в данном примере производится операция целочисленного приведения к 32-м разрядам значения уменьшаемого (minuend) и вычитаемого (subtrahend) c использованием инструкции movzl.
Кроме целочисленных операций со значениями sub используется при выделении кадра стека функции как показано на следующем примере.
 
func:# static int func ( int value )
pushl%ebp# {
movl%esp, %ebp
movl8(%ebp), %eax# return value;
popl%ebp
ret# }
 
main:# int main ( void )
pushl%ebp# {
movl%esp, %ebp
andl$-16, %esp
subl$16, %esp
movl$0, (%esp)# return func(0);
callfunc
leave
ret# }
 
Здесь инструкция sub используется для выделения кадра стека равного 16-ти байт с предварительной операцией выравнивания с использованием инструкции and и последующей передачей нулевого значения вызываемой функции GNU C (подпрограммы) func().
 
 

К оглавлению



Сайт создан в системе uCoz