【问题标题】:Printf problem with gcc on mmixmmix 上 gcc 的 Printf 问题
【发布时间】:2011-06-30 12:43:19
【问题描述】:

我根据http://www.bitrange.com/mmix/install.html为mmix编译了gcc 4.6.0。在我尝试了他们简单的 hello world 或任何其他对 printf 的调用超过第一个字符串之后,只有第一个字符串被打印出来。例如

lada@:~/f/c> cat hellommix.c
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
  printf ("hello, %s\n", argc > 1 ? argv[1] : "world");
  exit (0);
}

lada@:~/f/c> mmix-gcc hellommix.c 
lada@:~/f/c> mmix ./a.out "abc"
hello, lada@:~/f/c> 

生成的程序集如下所示:

# 1 "hellommix.c"
! mmixal:= 8H LOC Data_Section
        .text ! mmixal:= 9H LOC 8B
        .section        .rodata
        .p2align 2
        LOC @+(4-@)&3
LC:0    IS @
        BYTE "world",#0
        .p2align 2
        LOC @+(4-@)&3
LC:1    IS @
        BYTE "hello, %s",#a,#0
        .text ! mmixal:= 9H LOC 8B
        .p2align 2
        LOC @+(4-@)&3
        .global main
main    IS @
        SUBU $254,$254,24
        STOU $253,$254,16
        ADDU $253,$254,24
        GET $2,rJ
        SET $3,$0
        SUBU $0,$253,24
        STOU $1,$0,0
        SUBU $0,$253,12
        STTU $3,$0,0
        SUBU $0,$253,12
        LDT $0,$0,0
        SLU $0,$0,32
        SR $0,$0,32
        CMP $0,$0,1
        BNP $0,L:2
        SUBU $0,$253,24
        LDO $0,$0,0
        LDO $0,$0,8
        JMP L:3
L:2     IS @
        GETA $0,LC:0
L:3     IS @
        GETA $5,LC:1
        SET $6,$0
        PUSHJ $4,printf
        PUT rJ,$2
        SETL $5,0
        PUSHJ $4,exit

        .data ! mmixal:= 8H LOC 9B

【问题讨论】:

  • 我不知道这个环境,但你可能会遇到缓冲问题。许多环境是行缓冲的,并在换行符'\n'上清空缓冲区。尝试将 '\n' 附加到最后一个 printf。
  • 谢谢,但这并不能解决问题。
  • 这只是在黑暗中拍摄,但mmix-gcc hellommix.c -o hellommix 后跟mmix hellommix "abc" 效果更好吗? (这与您发布的链接中的示例更匹配,并且符合警告:警告:永远不要使用相对路径(../dir),始终使用绝对路径(/path/to/目录)

标签: c gcc assembly mmix


【解决方案1】:

试试这些:

  • 在退出前输入fflush (stdout);。 (虽然通常情况下,posix'man 3 exit 告诉所有缓冲区都已刷新;也许某些特定于 mmix)
  • 转储所有参数,看看有什么。

-

for (int x=0; x!=argc; ++x) {
    printf ("arg %d: \"%s\"\n", x, argv[x]);
}

【讨论】:

  • 感谢您的建议。遗憾的是,没有比这更好的了。也许在 gcc-4.6 中对于 mmix 有一些回归。对于带有 for 循环的代码,我得到输出 "arg arg hello," ,即甚至没有打印换行符。
  • 奇怪。我会认为 glibc(或者不是 glibc,你平台上的 C 库)是错误的,而不是 gcc 本身。也许尝试适当的错误跟踪器或邮件列表?
  • 另外说明:开发人员认为 mmix 支持成熟吗? (只是一个想法)
  • 不,一点也不成熟。也许它在新版本的 gcc 中被破坏了。
  • @VladimirF:我猜这更可能是 libc 实现问题,可能将 exit(3) 与不刷新缓冲区的原始系统调用 _exit(2)exit_group(2) 混合在一起。 (当人们调用 printf 时,这是手写 asm 中的一个常见问题,尤其是没有尾随换行符以在行缓冲模式下刷新,然后以原始 asm 系统调用退出,而不是 call exit)。无论如何,我希望编译器/库在被问到这个问题后的 10 年内得到修复!
【解决方案2】:

输入代码:

setbuf(stdout,NULL); 

在变量声明之后。

像这样,只需添加setbuf(stdout,NULL);这个代码。仅在第一个顶部。然后你就可以做代码了。

【讨论】:

    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2018-08-02
    相关资源
    最近更新 更多