Вставка ассемблерного кода в Си-программу - C (СИ)

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

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

Пытаюсь написать hello world используя 2 языка(извращение имхо)... Не могу понять, что происходит... Пишу так:
#include <stdio.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
void main()
{
char msg[] = "Hello, world.\r\n$ ";
_asm {
mov     ah, 9h
mov     dx, OFFSET msg
int     21h
mov    ah,4ch
int    21h
}
 
}
Говорит, что
Project xxxx raised exception class yyyyy with message 'zzzzzz'. Process stopped. Use Step or Run to continue.
Наставьте на путь истинный...
В общем, проблема в 21 прерывании... Оно пытается прочесть данные, но не может. А мне надо вывести через asm... Что делать?
Ой, забыл исправить сообщение(вставил из хелпа просто)...
Необработанное исключение в "0x000313c7" в "asmC.exe": 0xC0000005: Нарушение прав доступа при чтении "0xffffffff".
Это из Visual Studio... Но суть одна и та же. Я что-то делаю не так...

Решение задачи: «Вставка ассемблерного кода в Си-программу»

textual
Листинг программы
#include <stdio.h>
 
int main()
{
    char msg[] = "Hello, world.\r\n";
    _asm
    {
        lea        eax, msg
        push       eax
        call       puts
        pop        eax
    }
}

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

  1. Подключение стандартной библиотеки для работы с консолью (stdio.h).
  2. Объявление массива символов с сообщением Hello, world..
  3. Начало ассемблерного блока.
  4. Передача в регистр eax адреса массива msg.
  5. Отправка в стек адреса eax (для функции puts).
  6. Вызов функции puts.
  7. Возвращение из функции и очистка стека (pop eax).
  8. Конец ассемблерного блока.
  9. Выход из функции main.

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

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