免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: jelly2172000
打印 上一主题 下一主题

[C] 代码的输出问题 [复制链接]

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
21 [报告]
发表于 2008-10-15 09:12 |只看该作者
跟printf没关系。
昨天晚上看了一下C和指针,稍微晓得了一些,说说看看对不对。
你的low函数写得有一点问题,不是每个分支都会返回值。
return a; 的作用就是 设置返回数据的寄存器或者堆栈的值,然后还原计数器等.
而你现在return在另一个分支里面是没有的,也就是没有设置正常的返回值,但是函数执行完之后还是会还原计数器.......
那么那个寄存器或者是堆栈里面的值就是不确定的.

不晓得是不是这么一回事??

C和指针滴18章,那里面举的例子就是d0寄存器.

论坛徽章:
0
22 [报告]
发表于 2008-10-15 09:14 |只看该作者

回复 #21 egmkang 的帖子

那为什么你用return a;就会返回寄存器或堆栈的值,不用而里面的值就不确定呢???

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
23 [报告]
发表于 2008-10-15 09:19 |只看该作者

回复 #22 alexhappy 的帖子

在这个函数之前,寄存器或者堆栈里面的值是未知的,只有你正常的return,其值才会被设置成正确的;
如果你不设置的话,printf又从里面取出来,那么那个值就是先前的值,理论上应该是随即的,因为寄存器和堆栈都是不初始化的.

论坛徽章:
0
24 [报告]
发表于 2008-10-15 10:07 |只看该作者
这是一个笔试题。
返回值应该是不确定的,就看编译器了。
但是我就不明白为啥要考这个问题呢?难道就是考查其不确定性。
这是现在的最好的解释了。

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
25 [报告]
发表于 2008-10-15 10:20 |只看该作者
原帖由 jelly2172000 于 2008-10-15 10:07 发表
这是一个笔试题。
返回值应该是不确定的,就看编译器了。
但是我就不明白为啥要考这个问题呢?难道就是考查其不确定性。
这是现在的最好的解释了。


呵呵,他们自己意淫,还要你陪着.....

论坛徽章:
0
26 [报告]
发表于 2008-10-15 15:50 |只看该作者
返回值靠eax確定的。如果你沒指明。那eax就無法確定了。和匯編碼有關系。自己反匯編看看吧

论坛徽章:
0
27 [报告]
发表于 2008-10-15 16:15 |只看该作者
in -'a' + 'A' 是int类型
应该b = (char)(in -'a' + 'A');吧

另外的问题就是没有return ,结果未定义吧.

论坛徽章:
0
28 [报告]
发表于 2008-10-15 21:32 |只看该作者
可以反汇编看看  

可以看到 如果从第一个分支走  将栈空间上的一个位置值移到 %eax 寄存器  
这个地址的值是随机的     故打印的值绝不可能一直是P d什么的

论坛徽章:
0
29 [报告]
发表于 2008-10-15 22:20 |只看该作者

回复 #11 jelly2172000 的帖子

.file        "a.c"
        .text
.globl low
        .type        low, @function
low:
        pushl        %ebp
        movl        %esp, %ebp
        subl        $24, %esp
        movl        8(%ebp), %eax
        movb        %al, -20(%ebp)
        cmpb        $96, -20(%ebp)
        jle        .L2
        cmpb        $122, -20(%ebp)
        jg        .L2
        movzbl        -20(%ebp), %eax
        subb        $32, %al
        movb        %al, -1(%ebp)
        jmp        .L1
.L2:
        movsbl        -20(%ebp),%eax
        movl        %eax, -24(%ebp)
.L1:
        movl        -24(%ebp), %eax
        leave
        ret
        .size        low, .-low
.globl main
        .type        main, @function
main:
        leal        4(%esp), %ecx
        andl        $-16, %esp
        pushl        -4(%ecx)
        pushl        %ebp
        movl        %esp, %ebp
        pushl        %ecx
        subl        $4, %esp
        movl        $101, (%esp)
        call        low
        movsbl        %al,%eax
        movl        %eax, (%esp)
        call        putchar
        movl        $0, %eax
        addl        $4, %esp
        popl        %ecx
        popl        %ebp
        leal        -4(%ecx), %esp
        ret
        .size        main, .-main
        .ident        "GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)"
        .section        .note.GNU-stack,"",@progbits

论坛徽章:
0
30 [报告]
发表于 2008-10-15 22:23 |只看该作者

回复 #28 feixu911 的帖子

subl        $4, %esp
        movl        $101, (%esp)
        call        low
        movsbl        %al,%eax
        movl        %eax, (%esp)
        call        putchar
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP