Oct 19

对照一下两段代码 不指定

felix021 @ 2009-10-19 00:22 [IT » 程序设计] 评论(6) , 引用(0) , 阅读(6122) | Via 本站原创 | |
    unsigned int a = 1;
    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


阿牛如果有兴致的话,不妨研究一下AT&T的汇编。



欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
Miuc Homepage
2010-10-4 22:36
GCC编译器在处理一个运算时,如果出现了一个符号而另一个无符号,将会默认隐式转换为无符号处理。

-----

考虑如上条件,第一次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.
boluor
2009-10-26 22:30
我要是决定拿那个offer了就开始研究...
sandy
2009-10-20 09:24
说到那题,其实和汇编什么的关系不大,关键看编译器如何看待比较数。也就是说编译器决定要不要使用符号位的问题。

PS:还是比较看不惯GCC下的AT&T汇编。。
felix021 回复于 2009-10-20 10:18
我只是觉得看汇编代码最直观。
ivan Homepage
2009-10-19 22:06
不是的吧leal  -8(%ebp), %eax   ; 这行应该是把b的地址放到eax里面,下一行就就对b减一了。
用leal做运算,起码得把数据放到寄存器里面吧。
felix021 回复于 2009-10-20 02:55
嗯,的确。我之前没有去仔细看过AT&T的汇编。
不过看起来和Intel的汇编,LEA是同一个意思:Load Effective Address。
那么addl的确是被优化掉了。
Me999 Email Homepage
2009-10-19 13:14
汇编语言??反正我只看懂:
L2:
......
jmp L2
这应该是循环!

movl  $1, -4(%ebp)
    movl  $0, -8(%ebp)
这应该是初始化!

然后就看不懂了!!
!!!!!
这是第1500条评论,纪念一下!!
!!!!!
ivan Homepage
2009-10-19 08:11
死循环了吧。cool

没有看到a + b对应的语句,优化掉了?
felix021 回复于 2009-10-19 13:15
movl  -4(%ebp), %eax  ; EAX = a
  leal  -8(%ebp), %eax   ; EAX += b
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]