Сумма положительного и отрицательного даёт 0. Проверим:
                                
; al =       01011011 (двоичное)
shr al, 3 ; al= 00001011
Это означает: сдвиг всех битов регистра al на 3 разряда вправо. Так что al станет 00001011. 
Биты слева заполняются нулями, а биты справа выдвигаются (исчезают). Последний выдвинутый бит, становится значением флага переноса CF.
                                
;al = 10100110
sar al, 3
;al = 11110100
sar al, 2
;al = 11111101
;bl = 00100110
sar bl, 3
;bl = 00000010
Последний выдвинутый бит, становится значением флага переноса CF.
                                
rol операнд, количество_сдвигов ; циклический сдвиг операнда влево
ror операнд, количество_сдвигов ; циклический сдвиг операнда вправо
rcl операнд, количество_сдвигов ; циклический сдвиг операнда влево через флаг переноса
rcr операнд, количество_сдвигов ; циклический сдвиг операнда вправо через флаг переноса
                                
Задача: дано некое однобайтное число. Нужно инвертировать его биты. То есть в итоге первый бит должен стать восьмым, второй – седьмым и так далее.
                                
pop
push
                                
mov ax, 4560h
push ax
mov ax, 0FFFFh
push ax
                                
Обратите внимание, что команда pop не чистит стек
                                
SomeProc proc
...ещё код...
Ret ; обязательно
SomeProc endp
Вызов процедуры
Call SomeProc
Параметры процедуры должны быть выложены в стек перед её вызовом в обратном порядке.
                                
STDCALL указывать необязательно. DWORD тип. Возможны типы, например WORD, BYTE и т. д..
 Вызов процедуры:
Invoke testproc, 1d, 2d, 3d,
При этом ещё на этапе компиляции будут проверено количество параметров и их тип, что подстрахует вас от ошибок.
Для этого нужно сначала объявить прототип: 
Invoke <функция>, <параметр1>, <параметр2>, <параметр3>
                                
ebp+8,esp →
ebp →
ebp +8 
ebp +0C 
ebp +4 
→
                                
Внутри процедуры происходит следующее:
В стек помещается содержимое EBP;
Содержимое ESP помещается в EBP;
В стек записываются локальные переменные в порядке следования;
Выполняется основная часть процедуры
Перед выходом из процедуры происходит следующее:
Вызывается команда Leave. Она эквивалента помещению значения EBP в ESP (в этот момент вершина стека уходит за локальные переменные). Затем из стека выталкивается сохранённое значение EBP в EBP. 
Вызывается команда ret в ходе работы которой вершина стека отодвигается за передаваемые параметры и происходит извлечения адреса возврата из стека и помещение его в EIP.
                                
Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть