C语言精彩编程百例 第6个例子 移位运算
#include<stdio.h>
void main()
{
unsigned a,b,c,d;
int n;
a=64;
n=2;
b=a>>(6-n);
printf("b=%d\n",b);
c=a<<n;
printf("c=%d\n",c);
d=(a>>(n-1)|a<<(n+1));
printf("d=%d\n",d);
}
变量赋值部分
movl $64, -4(%ebp) # a
movl $2, -20(%ebp) # n
b=a>>(6-n);
movl $6, %eax
movl %eax, %ecx
subl -20(%ebp), %ecx # 6-n
movl -4(%ebp), %eax # eax=a
shrl %cl, %eax # a>>(6-n) 右移6-n次
movl %eax, -8(%ebp) # b = a>>(6-n)
c=a<<n;
movb -20(%ebp), %cl # n 直接入cl寄存器
movl -4(%ebp), %eax # a
sall %cl, %eax # shl 左移AT&T写法是sall
movl %eax, -12(%ebp) # c=a<<n
d=(a>>(n-1)|a<<(n+1));
movl -20(%ebp), %ecx # n
decl %ecx # n-1
movl -4(%ebp), %eax # a
movl %eax, %edx # edx =a
shrl %cl, %edx # edx = a>>(n-1)
movl -20(%ebp), %ecx # n
incl %ecx # n+1
movl -4(%ebp), %eax # a
sall %cl, %eax # eax = a<<(n+1)
orl %edx, %eax # eax = (a>>(n-1)) | (a<<(n+1))
movl %eax, -16(%ebp) # d = eax