c - 如何在 Emu8086 中使用 'gcc' 从 .c 运行转换后的 .asm 代码

标签 c gcc assembly emu8086 converters

我是新来的,我将代码从 C 语言转换为 asm。但是,它看起来不像是 asm 语言中的普通代码。所以我的问题是如何将代码从 C(或 C++)语言转换为汇编语言,转换后的 asm 代码可以在 Emu8086 上运行。

这是一个简单的 C 代码:

#include<stdio.h>

void Hello(){
printf("Hello world");
}
int main (){
Hello();
return 0;
}

然后我用 gcc -S test.c 转换它,这是答案:

.file   "test1.c"
    .section    .rodata
.LC0:
    .string "Hello world"
    .text
    .globl  Hello
    .type   Hello, @function
Hello:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    leaq    .LC0(%rip), %rdi
    movl    $0, %eax
    call    printf@PLT
    nop
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   Hello, .-Hello
    .globl  main
    .type   main, @function
main:
.LFB1:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $0, %eax
    call    Hello
    movl    $0, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1:
    .size   main, .-main
    .ident  "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
    .section    .note.GNU-stack,"",@progbits

最佳答案

Emu8086 的作用与包装盒上所说的一样:它模拟 Intel 8086 处理器。 GCC 生成的程序集用于您的主机(因为您没有告诉它这样做),它显然使用 x86-64 指令集。 8086 无法理解这些指令中的大部分。您需要将其交叉编译为 x86 16 位实模式可执行文件。 GCC 上的 -m16 选项将生成 16 位代码,但它显然仍使用 32 位寄存器(EAX 等)。因此,您必须找到一个以基本 8086 指令集为目标的编译器。

关于c - 如何在 Emu8086 中使用 'gcc' 从 .c 运行转换后的 .asm 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53503282/

相关文章:

c - 在系统 C/Xilinx X 指定的 Verilog 数据中查找绝对值

c++ - 无法正确创建线程

c - 在数组初始化期间从不兼容的指针类型进行初始化

c++ - gcc/linux : CppuTest shows memory leak using static vectors, 误报?

c - GCC -O2 和 __attribute__((weak))

c - C/Linux 中的多线程埃拉托斯特尼筛法

c - 神秘错误 : expected identifier or ‘(’ before ‘case’

c++ - 从 MSVC 32 位版本解码程序集(作业)。无操作有什么作用?

assembly - 将数据写入绝对地址

linux - 使用 Kdbg 调试汇编代码