Встроенная сборка с Borland/Embarcadero

Быстрый вопрос здесь:

Я пытаюсь поэкспериментировать со встроенной сборкой с помощью Embarcadero C++ Builder XE3 на 32-битной Windows 7, специально для того, чтобы начать переучивать сборку с возможностью будущего прагматического применения.

До сих пор я был в состоянии написать набор инструкций в простом консольном проекте, который прекрасно компилируется с использованием всего синтаксиса C++ Builder, имеющегося в моем распоряжении:

int _tmain(int argc, _TCHAR* argv[]) {
    _asm{
        mov dl, 0x24
        mov ah, 2 // Print character
        int 0x21 // Dos Interrupt - Run operation in AH

        mov dl, 0x25
        mov ah, 2 // Print character
        int 0x21 // Dos Interrupt - Run operation in AH

        mov dl, 0x26
        mov ah, 2 // Print character
        int 0x21 // Dos Interrupt - Run operation in AH

        mov dl, 0x27
        mov ah, 2 // Print character
        int 0x21 // Dos Interrupt - Run operation in AH

        int 0x20 // terminate COM
    }

    return 0;
}

Это компилируется нормально, и эти инструкции работают прямо в NASM и в среде Windows DEBUG. Что я ожидаю, так это простая запись в консоль: $%&' с последующим успешным завершением.

Тем не менее, когда я пытаюсь запустить Project1.exe через командную строку я сразу получаю стандартное всплывающее окно ошибки Win7, которое исчезает через несколько секунд и завершает программу.

Работая с отладкой, я, кажется, успешно достигаю первого int 0x21 прежде чем он зависает, в этот момент Borland дает мне сообщение:

Project Project1.exe поднял класс исключения $C00000005 с сообщением "нарушение прав доступа по адресу 0x00401213: чтение адреса 0xffffffff".

Моя теория заключается в том, что я неправильно инициализирую сегмент со смещением 256 байт (NASM будет использовать что-то вроде org 0x100 в начале набора инструкций). Но я не совсем уверен, что это проблема.

Есть идеи?

2 ответа

Решение

Те int 0x21 Инструкции для MS-DOS, а не Windows. Они означают что-то другое в программе Windows, в результате чего вы загорелись.

Я работаю в основном в C++ Builder, но я также запрограммировал ассемблер и nasm для производственного кода (в основном на микро). Моя рекомендация не приближаться к C++ builder для чего-то, что вам не нужно. Обучение может быть искусством, и то, как вы учитесь, во многом зависит от результата. Интеграция C++ Builder со сборкой - обходной путь через Южный Комптон. Даже если это не так, как вы обычно работаете, это окупится большим временем, чтобы выучить нос в чистой командной строке.

Другие вопросы по тегам