c - 管道到 hexdump 时,用汇编编写的程序没有输出
问题描述
我想知道为什么汇编版本在管道输入时没有显示任何输出hexdump
?
源代码(printf.c):
#include <stdio.h>
// gcc -o printf printf.c && ./printf
int main() {
const char *frmt = "%s\n";
char *msg = "TEST";
printf(frmt, msg);
return 0;
}
输出到 STDOUT:
$ ./printf
TEST
管道到hexdump
:
$ ./printf | hexdump -v -C
00000000 54 45 53 54 0a |TEST.|
00000005
追踪:
$ strace -ttT -f -e trace="write" ./printf
17:44:33.841789 write(1, "TEST\n", 5TEST
) = 5 <0.000050>
17:44:33.842320 +++ exited with 0 +++
源代码(printf.nasm):
; nasm -g -f elf64 printf.nasm && ld printf.o -o printf && ./printf
extern printf
global main
section .text
main:
mov rdi, frmt
mov rsi, msg
xor rax, rax
call printf
jmp exit
exit:
mov rax, 60
xor rdi, rdi
syscall
section .data
frmt db "%s", 0xa, 0x0
msg: db "TEST"
len: equ $ - msg
输出到 STDOUT:
$ ./printf
TEST
管道到hexdump
(无输出):
$ ./printf | hexdump -v -C
追踪:
$ strace -ttT -f -e trace="write" ./printf
17:46:00.828887 write(1, "TEST\n", 5TEST
) = 5 <0.000050>
17:46:00.829282 +++ exited with 0 +++
解决方案
%s
格式用于打印 C 字符串,要求以零字节结尾。您缺少msg
.
section .data
frmt db "%s", 0xa, 0x0
msg: db "TEST", 0x0
len: equ $ - msg
似乎也不需要len
您从未使用过的变量。
推荐阅读
- python - 如何使用系统托盘/任务栏图标制作跨平台 Kivy 应用程序,即使应用程序未聚焦/处于任务栏模式,它也会检测键盘输入
- google-cloud-platform - 从客户端浏览器访问永久 GCS 对象?
- python - 用 time-a-half 重写加班工资计算,并创建一个名为 computepay 的函数,该函数接受两个参数(小时和费率0
- python - 根据日期条件创建列,但出现此错误 AttributeError: 'SeriesGroupBy' object has no attribute 'sub'?
- html - $('.classitem').submit(function(event){event.preventDefault}) 不起作用
- java - Android/Java:显示宽度/高度不考虑缺少导航栏
- excel - 在不是单元格引用的 Excel 数组的每一行或每一列中查找最大值
- r - 通过archive.org将推文下载(随机样本)到R中
- html - 我想将我的段落居中,但它不起作用
- kodi - 在哪里可以找到所有 Kodi 软件版本的存储库?