首页 > 解决方案 > 管道到 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 +++

标签: cassemblyx86-64nasm

解决方案


%s格式用于打印 C 字符串,要求以零字节结尾。您缺少msg.

section .data
    frmt db "%s", 0xa, 0x0
    msg: db "TEST", 0x0
    len:  equ $ - msg

似乎也不需要len您从未使用过的变量。


推荐阅读