我尝试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
而不是原始_exit
syscall。
正如Michael解释的那样,可以动态链接C库。这也是《自下而上编程》一书中介绍的方式(请参见第8章)。
但是,重要的是exit
从C库调用以结束程序而不是绕过程序,这是我错误地通过调用来完成的exit- syscall
。正如Michael所暗示的,exit会像冲洗流一样进行大量清理。
这是发生了什么事:作为解释这里的C-库缓冲区的如下标准流:
确定哪种情况适用于何时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