当前位置: 首页 > 面试题库 >

在汇编中使用printf会导致输出空

夹谷俊远
2023-03-14
问题内容

我尝试printf从我的汇编代码中使用,这是一个最小示例,应仅打印hello到stdout:

.section  .rodata
hello:
    .ascii  "hello\n\0"
.section .text
    .globl _start        
_start:
    movq $hello, %rdi #first parameter
    xorl %eax, %eax #0 - number of used vector registers
    call printf        
#exit   
    movq $60, %rax
    movq $0, %rdi
    syscall

我用

gcc -nostdlib try_printf.s -o try_printf -lc

当我运行它时,它似乎可以正常工作:该字符串hello已打印出来,退出状态为0

XXX$ ./try_printf
hello
XXX$ echo $?
0
XXX$

但是当我尝试捕获文本时,很明显,某些功能无法正常工作:

XXX$ output=$(./try_printf) 
XXX$ echo $output

XXX$

变量output应具有值hello,但为空。

我的用法有printf什么问题?


问题答案:

使用 诸如printf之类的stdio函数后,请使用call exit而不是原始_exitsyscall。

正如Michael解释的那样,可以动态链接C库。这也是《自下而上编程》一书中介绍的方式(请参见第8章)。

但是,重要的是exit从C库调用以结束程序而不是绕过程序,这是我错误地通过调用来完成的exit- syscall。正如Michael所暗示的,exit会像冲洗流一样进行大量清理。

这是发生了什么事:作为解释这里的C-库缓冲区的如下标准流:

  1. 没有缓冲用于标准错误。
  2. 如果标准输出/输入是终端,则它是行缓冲的。
  3. 如果标准输出/输入不是终端,则它是完全缓冲的,因此在写入结束时需要刷新。

确定哪种情况适用于何时printf首次为流调用。

因此,如果printf_try直接在终端中调用,则可以看到程序的输出,因为hello\n在末尾(在行缓冲模式下触发刷新),并且它是一个终端,也就是2.
case。

printf_try通过调用$(./printf_try)意味着stdout不再是终端(实际上我不知道它是临时文件还是内存文件),因此3.情况有效-需要显式刷新,即调用C - exit



 类似资料:
  • 问题内容: 我需要显示数组中包含价格的商品列表,并希望调整价格。我几乎可以正常工作,但需要改进。下面是代码和输出。任何想法如何使所有价格一致?到目前为止,有些工作没有完成。提前致谢。 输出: 问题答案: 您可以尝试以下示例。请在宽度前使用“-”以确保左缩进。默认情况下,它们将右缩进;这可能不适合您的目的。 格式字符串语法:http : //docs.oracle.com/javase/7/docs

  • 问题内容: 我有以下代码可以打印传递给的参数数量。请注意该部分中的。我已经包括了新行,就像 C中一样 ,但是它不是打印新行而是打印: 参数数量:1 \ n 我的代码是: 我知道在0和“ Number …”之后包含10 将打印它,但我想这样做。我用 NASM 汇编代码,然后通过 GCC 将其链接以创建我的可执行文件。 问题答案: 当您在 NASM中 对字符串使用双引号或双引号时,它不接受 C 样式转

  • 问题内容: 我在玩耍以获得更好的itertools感觉,所以我按数字对元组列表进行了分组,并试图得到结果组的列表。但是,当我将结果转换为列表时,会得到一个奇怪的结果:除了最后一组以外的所有内容都是空的。这是为什么?我以为将迭代器转换为列表效率不高,但永远不会改变行为。我猜列表是空的,因为遍历了内部迭代器,但是何时/何地发生? 问题答案: 从 文档中 : 返回的组本身就是一个与共享底层可迭代对象的迭

  • 我正在使用四核处理器的Windows7,SP1上运行Java1.8.0_45。有事吗?

  • 我正在尝试使用Java中的函数设置输出格式。 输出格式如下所示: 在每行输出中,应该有两列:第一列包含字符串,并使用完全字符左对齐。第二列包含整数,以数字表示;如果原始输入少于三位数,则必须用零填充输出的前导数字。 Java·       100 cpp         065 python     050 =============================================

  • 我用ASP.NET c#和angular 8开发了一个web API。我尝试在服务器端(使用NPOI)将一些数据从Oracle导出到Excel文件,并在客户端下载。我可以看到内存流有数据,但是在“返回响应”中,它没有返回给客户端,而是再次调用了函数。这是我的代码: 超文本标记语言: 键入脚本: API 控制器: DAL:(生成excel的最后一个函数。) 这是我在chrome调试器中看到的:[Ne