2013-03-29 3 views
3

Я компилирую свой код с помощью gcc и смотрю на сборку, что именно делает этот код?shrl vs sarl .. x86 Assembly gnu

shrl $20, %edx 
leal (%edx,%eax), %eax 
sarl 1, %eax 

Говорят, что переменная Х в регистре EDX, и Y находится в EAX и оба (32-разрядное целое). Что здесь происходит??

Я знаю, что 'srl $ 20,% edx' сдвигает% eax справа 20 бит, так же, как: eax/(2^20) , а затем sarl - это то же самое, что и sarl 1,% eax '= eax/(2^1). Правильно ли это, и если да, то что делает leal?

ответ

9

Предполагая, что sarl 1, %eax действительно должен быть sarl $1, %eax, то все это приравнивает к:

x = ((unsigned int) x) >> 20; 
y = (x + y) >> 1 

leal инструкция означает: eax = eax + edx. Это может быть полезно вам link, так же как this one.