Как запустить преобразованный код .asm из .c, используя 'gcc' в Emu8086 - PullRequest
0 голосов
/ 27 ноября 2018

Я новичок здесь, и я преобразовал код с языка 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

1 Ответ

0 голосов
/ 27 ноября 2018

Emu8086 делает то, что говорит на жестяной банке: он эмулирует процессор Intel 8086.Сборка, созданная GCC, предназначена для вашего хост-компьютера (поскольку вы не сказали этого делать иначе), который, очевидно, использует набор инструкций x86-64.8086 не может понять большинство этих инструкций.Вам необходимо выполнить кросс-компиляцию в 16-битный исполняемый файл реального режима x86.Опция -m16 в GCC генерирует 16-битный код, но, по-видимому, все еще использует 32-битные регистры (EAX и т. Д.).Поэтому вам нужно будет найти компилятор, предназначенный для базового набора инструкций 8086.

...