Oct
19
unsigned int a = 1;
int b = 0;
while (a + b >= 0) {
b--;
}
int b = 0;
while (a + b >= 0) {
b--;
}
#gcc -S a.c -o a.S
然后看到对应这些代码
movl $1, -4(%ebp)
movl $0, -8(%ebp)
L2:
movl -4(%ebp), %eax
leal -8(%ebp), %eax
decl (%eax)
jmp L2
movl $0, -8(%ebp)
L2:
movl -4(%ebp), %eax
leal -8(%ebp), %eax
decl (%eax)
jmp L2
阿牛如果有兴致的话,不妨研究一下AT&T的汇编。
欢迎扫码关注:
转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php 。
-----
考虑如上条件,第一次b= 0x00 00 00 00 所以隐式转换成无符号还是0,
b-1 = 0x11 11 11 11 注意这里的首位1是负权,所以是 - 2^31 + 2^30 +... + 2^0 = -1
转换成无符号数 (unsigned) b = 4294967295 = 0x 11 11 11 11
(unsigned) b + 1 = 0x 00 00 00 00 (上溢)
对于无符号数来说,无论如何都是大于等于零的。
所以我们会看到 B一直在 -1.
PS:还是比较看不惯GCC下的AT&T汇编。。
用leal做运算,起码得把数据放到寄存器里面吧。
不过看起来和Intel的汇编,LEA是同一个意思:Load Effective Address。
那么addl的确是被优化掉了。
L2:
......
jmp L2
这应该是循环!
movl $1, -4(%ebp)
movl $0, -8(%ebp)
这应该是初始化!
然后就看不懂了!!
!!!!!
这是第1500条评论,纪念一下!!
!!!!!
没有看到a + b对应的语句,优化掉了?
leal -8(%ebp), %eax ; EAX += b