左移運算的小題目
阿新 • • 發佈:2017-06-06
class 匯編 cnblogs ret void 數據 sig 取數 計算機
int main(void) { unsigned char a = 0xa5; unsigned char b; b = ~a >> 1+2+3; return 0; }
通過查看匯編的過程發現了自己的理解的錯誤,計算機是把整個EAX寄存器全部翻轉的。最後再截取數據
0x00000000004004d6 <+0>: push %rbp 0x00000000004004d7 <+1>: mov %rsp,%rbp 0x00000000004004da <+4>: movb $0xa5,-0x2(%rbp) 0x00000000004004de <+8>: movzbl -0x2(%rbp),%eax ;eax = 0x000000a5 0x00000000004004e2 <+12>: not %eax ;eax = 0xffffff5a => 0x00000000004004e4 <+14>: sar $0x6,%eax ;eax = 0xfffffffd 0x00000000004004e7 <+17>: mov %al,-0x1(%rbp) ;al = 0xfd 0x00000000004004ea <+20>: mov $0x0,%eax 0x00000000004004ef <+25>: pop%rbp 0x00000000004004f0 <+26>: retq
先是計算not,再計算sar.
在不清楚順序的時候最好使用括弧,切記
左移運算的小題目