@evgeniybaklajanov

Как транслировать программу на языке C или C++ в программу на языке ассемблера MASM/TASM?

Как транслировать программу на языке C или C++ в программу на языке ассемблера MASM/TASM?
У меня всегда получается синтаксис GAS.
Мне препод дал задание, я его сделал, но надо на ассемблере.
Visual Studio долго качается, нужно что-то очень легкое (мне много интернета нельзя :)).
PS 1 Не надо советовать фриланс 2 С прогой на асме я разберусь.
  • Вопрос задан
  • 1635 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега C
Седой и строгий
Во-первых, то что вы называете синтаксисом GAS на самом деле называется синтаксисом AT&T. А используемый в MASM/TASM синтаксис - это синтаксис Intel. Во-вторых, что примерно ждёт от вас препод
.section .data

hello_str:
    .ascii "Hello, world!\n"
    .set hello_str_length, . - hello_str


.section .text

.global main
.type main, @function

main:
    movq    $4, %rax
    movq    $1, %rbx
    movq    $hello_str, %rcx
    movq    $hello_str_length, %rdx
    int     $0x80

    movq    $1, %rax
    movq    $0, %rbx
    int     $0x80

.size main, . - main

Что вы получите в результате трансляции Сишного кода
.file   "test.c"
        .section        .rodata
.LC0:
        .string "Hello, World!"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        subq    $16, %rsp
        movl    %edi, -4(%rbp)
        movq    %rsi, -16(%rbp)
        leaq    .LC0(%rip), %rdi
        call    puts@PLT
        movl    $0, %eax
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Debian 6.3.0-18) 6.3.0 20170516"
        .section        .note.GNU-stack,"",@progbits

Думаю, даже двоечник заметит разницу, не говоря уж о преподавателе. Помимо "лишнего" кода, характерных нечитаемых меток и цифровых смещений, в Сишном коде используются библиотечные вызовы вместо системных.

Но если всё же хотите попытать счастья, то вот что нагуглилось за десять секунд - https://godbolt.org/
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Мне препод дал задание, я его сделал, но надо на ассемблере.

Если задание написать программу на ассемблере, то надо выполнять его именно так, компиляторы генерируют код для машин, а не людей и цель - понять, как оно работает на машинном уровне.

Если всё ещё осталось желание, ищи инструкцию для любого компилятора, для gcc так:
g++ main.cpp -S
или так с intel синтаксисом:
g++ main.cpp -S -masm=intel

Можно даже не скачивать ничего https://godbolt.org/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы