Во-первых я не уверен, должно ли это быть частью потока, я вчера запустил на блоке и стеке, но я думаю вопрос, который я задаю, здесь очень отличается.
Я, пытаясь понять, каков точно Cygwin через Википедию и Google, у меня нет большой удачи. Я только что начал программирование блока на Linux с помощью gcc газового ассемблера. Я использую машину на работе во время ланча, который только имеет Windows на ней. Я хотел практиковать некоторый ассемблер, программирующий здесь, таким образом, я думал, что Cygwin смог помогать.
По ошибке я полагал, что код, который я писал в Linux, мог просто быть скомпилирован и выполнен в использовании Windows Cygwin. Cygwin позволяет мне компилировать прекрасный код:
as someAssmProg.as -o someAssmProg.o
ld someAssmProg.o -o someAssmProg
Но если я пытаюсь выполнить код под Cygwin,
./someAssmProg
Я добираюсь, "необработанное win32 исключение произошло" сообщение
Теперь я предполагаю, что это вызвано тем, что код, который я пишу, предназначается для Linux. Я думал хотя, что Cygwin будет иметь дело с этим. Cygwin просто действительно предназначен, чтобы использоваться для разработки Приложений Windows в командной строке стиля Unix путь?
Снова я знаю, что это, вероятно, очевидно для большинства людей здесь, но я действительно смущен!
P.S. я попробовал AndLinux прежде за Windows, но это - вполне значительная установка.
Cygwin является слоем во время выполнения, который обеспечивает библиотеки и программное обеспечение от мира Unix/Linux в Windows. Это не позволит Вашему ассемблерному коду работать, поскольку ОС является все еще Windows внизу, таким образом, все прерывания, и т.д. все еще Windows, не Linux, версии. Кроме того, если Вы действительно хотите выполнить ассемблер в Windows, необходимо сделать вещи существенно иначе, чем Вы делаете в Linux (или DOS, в этом отношении).
Можно полностью выполнить программы сборки в Cygwin. Я предполагаю, что Ваша загрузка перестала работать, потому что существует набор материала, который должен произойти между тем, когда Windows выполняет процесс и когда Вы добираетесь до main
функция. Когда gcc дадут блок как вход, он свяжется в соответствующем шаблонном коде для генерации допустимого исполняемого файла.
Вот демонстрационная программа сборки. Сохраните его как hello.s:
.intel_syntax noprefix
.section .text
.globl _main
_main:
enter 0, 0
// welcome message
push OFFSET s_HelloWorld
call _printf
pop eax
// add three numbers
push 2
push 4
push 5
call _addThree
add esp, 3 * 4
// print returned value
push eax
push OFFSET s_PercentD
call _printf
add esp, 2 * 4
xor eax, eax
leave
ret
// Add three numbers
_addThree:
enter 0, 0
mov eax, DWORD PTR [ebp + 8]
add eax, DWORD PTR [ebp + 12]
add eax, DWORD PTR [ebp + 16]
leave
ret
.section .rdata
s_HelloWorld:
.ascii "Hello, world.\n\0"
s_PercentD:
.asciz "%d\n"
затем выполните его с
$ gcc -mno-cygwin hello.s -o hello && ./hello
Hello, world.
11
Ссылка для инструкций по сборке Вашего процессора содержится в Руководстве Программиста Архитектуры AMD64. Соглашение о вызовах C документируется в эту страницу из интернет-Архива; возможно, можно ли найти подобный, который все еще имеет изображения?
Обратите внимание, что Cygwin только сделает 32-разрядный блок прямо сейчас; (непотребитель) мир составляет все 64 бита теперь, и в 64-разрядном режиме на современных процессорах у Вас есть намного больше регистров и различных соглашений о вызовах.
Лучший способ сделать это действительно состоит в том, чтобы установить VM (использующий VirtualBox или somesuch) с полной установкой Linux под ним. Это кажется, что это может быть слишком тяжело для соответствия требованиям, но это - единственное предложение, которое я имею в данный момент.