标签:翻转 color 取数 unsigned span 自己的 oid 再计算 寄存器
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.
在不清楚顺序的时候最好使用括弧,切记
标签:翻转 color 取数 unsigned span 自己的 oid 再计算 寄存器
原文地址:http://www.cnblogs.com/hinice/p/6953624.html