【问题标题】:ASM printf weird behaviourASM printf 奇怪的行为
【发布时间】:2013-11-14 14:40:18
【问题描述】:

这段代码在屏幕上打印Hello

.data
    hello: .string "Hello\n"
    format: .string "%s" 
.text
    .global _start 
    _start:

    push $hello
    push $format
    call printf

    movl $1, %eax   #exit
    movl $0, %ebx
    int $0x80

但如果我从 hello 字符串中删除 '\n',如下所示:

.data
    hello: .string "Hello"
    format: .string "%s" 
.text
    .global _start 
    _start:

    push $hello
    push $format
    call printf

    movl $1, %eax   #exit
    movl $0, %ebx
    int $0x80

程序不工作。有什么建议吗?

【问题讨论】:

  • 定义“不起作用”.
  • 它不打印“Hello”
  • 你确定它不会被你的shell提示符覆盖吗?如果你使用一个很长的字符串(但仍然没有\n)怎么办?
  • 长字符串不起作用,我确信它不会打印任何东西。我只是尝试在室友电脑上运行这两种变体,但都没有成功。
  • @迈克尔。我正在使用gcc -nostartfiles filename 命令编译代码。

标签: assembly x86 asmx nasm


【解决方案1】:

退出系统调用(相当于 C 中的 _exit)不会刷新标准输出缓冲区。

输出换行符会导致行缓冲流上的刷新,如果它指向终端,则 stdout 将是。

如果您愿意在 libc 中调用 printf,那么以同样的方式调用 exit 应该不会感到难过。在你的程序中使用int $0x80 并不会让你成为一个裸机坏蛋。

您至少需要push stdout;call fflush 才能退出。或push $0;call fflush。 (fflush(NULL) 刷新所有输出流)

【讨论】:

    【解决方案2】:

    您需要清理传递给printf 的参数,然后刷新输出缓冲区,因为您的字符串中没有新行:

    .data
        hello: .string "Hello"
        format: .string "%s" 
    .text
        .global _start 
        _start:
    
        push $hello
        push $format
        call printf
        addl $8, %esp
        pushl stdout
        call fflush
        addl $4, %esp
        movl $1, %eax   #exit
        movl $0, %ebx
        int $0x80
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多