assembly - 如何使用汇编写入标准输出?

标签 assembly x86 stdout freebsd

我在尝试编写文本“嗨!”时遇到了麻烦。在“标准输出”中。我使用 Freebsd 系统调用的默认调用约定(FreeBSD 开发人员手册:11.3.1)和我的新手汇编技能编写了这段代码。

这是代码(at&t格式):

.data
        str:
        .ascii "hi!"

.text

.globl main

main:
        pushl $0x3      # size
        pushl $str      # *buf
        pushl $0x1      # fd
        movl $0x4,%eax  # write
        int $0x80

        movl $0x1,%eax
        movl $0x0,%ebx
        int $0x80

该系统是一个 FreeBSD 9 x86。

最佳答案

学习这一点的一种简单方法是让 C 编译器为您生成一个汇编程序模板。我们从 C 中的等价物开始:

main()
{
        write(1, "hi!\n", 4);
        return 0;
}

然后我们让编译器为我们创建汇编代码:
cc -S hello.c

生成的汇编代码应该准备好进行汇编(并与 C 库链接)。
    .file   "hello.c"
    .section    .rodata
.LC0:
    .string "hi!\n"
    .text
    .p2align 4,,15
.globl main
    .type   main, @function
main:
.LFB2:
    pushq   %rbp
.LCFI0:
    movq    %rsp, %rbp
.LCFI1:
    movl    $4, %edx
    movl    $.LC0, %esi
    movl    $1, %edi
    movl    $0, %eax
    call    write
    movl    $0, %eax
    leave
    ret
.LFE2:
    .size   main, .-main
    .section    .eh_frame,"a",@progbits
.Lframe1:
    .long   .LECIE1-.LSCIE1
.LSCIE1:
    .long   0x0
    .byte   0x1
    .string "zR"
    .uleb128 0x1
    .sleb128 -8
    .byte   0x10
    .uleb128 0x1
    .byte   0x3
    .byte   0xc
    .uleb128 0x7
    .uleb128 0x8
    .byte   0x90
    .uleb128 0x1
    .align 8
.LECIE1:
.LSFDE1:
    .long   .LEFDE1-.LASFDE1
.LASFDE1:
    .long   .LASFDE1-.Lframe1
    .long   .LFB2
    .long   .LFE2-.LFB2
    .uleb128 0x0
    .byte   0x4
    .long   .LCFI0-.LFB2
    .byte   0xe
    .uleb128 0x10
    .byte   0x86
    .uleb128 0x2
    .byte   0x4
    .long   .LCFI1-.LCFI0
    .byte   0xd
    .uleb128 0x6
    .align 8
.LEFDE1:
    .ident  "GCC: (GNU) 4.2.1 20070831 patched [FreeBSD]"
    .section    .note.GNU-stack,"",@progbits

目前还不清楚(对我而言)您真正需要 .size 指令之外的尾随内容有多少,但这应该会让您有所了解。

关于assembly - 如何使用汇编写入标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14678783/

相关文章:

汇编编程 : NASM VS MASM code

c - 从汇编代码到 C 代码

assembly - 使用bx寄存器保存索引可以吗?

algorithm - 用于在多核 x86 CPU 上进行测试的并行算法基准测试工具

assembly - x86 汇编添加不同大小的操作数

c - c 中的 fflush(stdout)

windows - 将 stderr 重定向到文件,但保持屏幕上的所有输出完好无损 (as_is)。 [Windows XP - BAT 文件]

assembly - ARM/AArch64 上的 DIVQ 对应项(使用双宽度除数缩小除法)?

linux - 如何将(两个)管道指令的输出传递给文件?

caching - super 队列和行填充缓冲区的语义是什么?