Быстрый вопрос здесь:
Я пытаюсь поэкспериментировать со встроенной сборкой с помощью 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
в начале набора инструкций). Но я не совсем уверен, что это проблема.
Есть идеи?
Те int 0x21
инструкции для MS-DOS а не винда. Они означают что-то другое в программе Windows, в результате чего вы загорелись.
Я работаю в основном в C ++ Builder, но я также запрограммировал ассемблер и nasm для производственного кода (в основном на микро). Моя рекомендация не приближаться к C ++ builder для чего-то, что вам не нужно. Обучение может быть искусством, и то, как вы учитесь, во многом зависит от результата. Интеграция C ++ Builder со сборкой — обходной путь через Южный Комптон. Даже если это не так, как вы обычно работаете, это окупится большим временем, чтобы выучить нос в чистой командной строке.