我是新来的,我将代码从 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/