Встроенная сборка с 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 в начале набора инструкций). Но я не совсем уверен, что это проблема.

Есть идеи?

1

Решение

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

3

Другие решения

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

0