ASM + C++ Как вывести в консоль ? - Assembler

Узнай цену своей работы

Формулировка задачи:

Прикрепил файл .asm к проекту на с++ а в примере, который скачал указан лишь вывод в окно windows. А как вывести на консоль ? Вот код файла асм и файла с++ с++
#include "stdafx.h"
 
extern "C"
{
    void hello_world_asm();
};
 
int main(int argc, char** argv)
{
    hello_world_asm();
    
    _getch();
    return 0;
}
asm
PUBLIC hello_world_asm
 
_TEXT   SEGMENT
 
EXTERN MessageBoxA: PROC
EXTERN GetForegroundWindow: PROC
 
hello_world_asm PROC
 
    push rbp ; save frame pointer
    mov rbp, rsp ; fix stack pointer
    sub rsp, 8 * (4 + 2) ; allocate shadow register area + 2 
    
    call GetForegroundWindow
    mov rcx, rax
 
    mov rdx, offset hello_msg
    mov r8, offset info_msg
    mov r9, 0 ; MB_OK
 
    and rsp, not 8 ; align stack to 16 bytes prior to API call
    
    call MessageBoxA
 
    mov rsp, rbp
    pop rbp
 
    ret 
hello_world_asm ENDP
 
_TEXT   ENDS

_DATA SEGMENT
    hello_msg db "HELLO ASM WORLD", 0
    info_msg  db "Info", 0
    buf dw 2048 DUP ('eb')
_DATA ENDS
 
END

Решение задачи: «ASM + C++ Как вывести в консоль ?»

textual
Листинг программы
.686P
.MODEL Flat,StdCall
OPTION CASEMAP:NONE
 
INCLUDE         \MASM32\INCLUDE\WINDOWS.INC
INCLUDE         \MASM32\INCLUDE\KERNEL32.INC
INCLUDE         \MASM32\INCLUDE\USER32.INC
INCLUDE         \MASM32\INCLUDE\MSVCRT.INC
 
INCLUDELIB      \MASM32\LIB\KERNEL32.LIB
INCLUDELIB      \MASM32\LIB\USER32.LIB
INCLUDELIB      \MASM32\LIB\MSVCRT.LIB
 
.DATA
 
Text            DB      'Hello world!',0
 
.CODE
 
Start:
 
                invoke  crt_printf, ADDR Text
                invoke  ExitProcess, NULL
 
END             Start

Объяснение кода листинга программы

В данном коде происходит следующее:

  1. Определение модели и настройка опций для сборки.
  2. Подключение необходимых файлов заголовков, содержащих объявления функций и структур.
  3. Подключение библиотек, которые будут использоваться при сборке.
  4. Определение секции .DATA, где объявляется переменная Text типа DB (байтовая строка) и инициализируется со значением Hello world!.
  5. Определение секции .CODE, содержащей исполняемый код программы.
  6. Метка Start, которая является точкой входа в программу.
  7. Вызов функции crt_printf с аргументом - адресом переменной Text. Эта функция используется для вывода форматированной строки в стандартный поток вывода.
  8. Вызов функции ExitProcess с аргументом NULL для завершения программы.
  9. Завершение программы и метка END Start.

Оцени полезность:

5   голосов , оценка 3.4 из 5
Похожие ответы