Cygwin: развитие ассемблера? - PullRequest
       23

Cygwin: развитие ассемблера?

5 голосов
/ 18 февраля 2009

Во-первых, я не уверен, должно ли это быть частью потока I стартовал вчера на сборке и стеке но думаю вопрос, который я здесь задаю, совершенно другой.

Я пытался понять, что именно Cygwin , через Википедия и Google, мне не очень повезло. Я только начал программирование на Linux с использованием gcc газосборщик. Я использую машину на работе во время обеда, на нем только винда. Я хотел попрактиковаться в сборке языковое программирование здесь, поэтому я подумал, что 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, но это довольно сложная установка.

Ответы [ 4 ]

7 голосов
/ 18 февраля 2009

Cygwin - это уровень времени выполнения, который предоставляет библиотеки и программное обеспечение из мира Unix / Linux для Windows. Это не позволит запустить ваш ассемблерный код, поскольку ОС все еще находится под Windows, поэтому все прерывания и т. Д. Все еще являются версиями для Windows, а не для Linux. Кроме того, если вы действительно хотите запустить ассемблер в Windows, вам придется действовать совсем не так, как в Linux (или DOS).

3 голосов
/ 24 февраля 2009

Вы можете полностью запустить программы сборки в 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-битных режимах у вас гораздо больше регистров и различные соглашения о вызовах.

1 голос
/ 18 февраля 2009

Лучший способ сделать это - это установить виртуальную машину (используя VirtualBox или что-то подобное) с полной установкой Linux. Похоже, это может быть слишком тяжелым, чтобы удовлетворить ваши требования, но это единственное предложение, которое я имею на данный момент.

0 голосов
/ 23 марта 2017

привет, у меня была похожая проблема, но я смог разобраться с помощью -mconsole Опция в этом сеансе cygwin: файл foo.c сначала компилируется, а затем запускается с отладчиком gdb. Надеюсь, это поможет вам

$ cat foo.c
int main( void )
{
        __asm__ ( "mov $5, %rax" );
        return 0;
}
$ make
gcc -ggdb -Wall -mconsole -o foo.o -c foo.c
gcc -ggdb -o foo foo.o -lm
$ gdb ./foo.exe
GNU gdb (GDB) (Cygwin 7.10.1-1) 7.10.1
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-cygwin".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./foo.exe...done.
(gdb) l
1       int main( void )
2       {
3               __asm__ ( "mov $5, %rax" );
4               return 0;
5       }
(gdb) b 3
Breakpoint 1 at 0x1004010ed: file foo.c, line 3.
(gdb) r
Starting program: /cygdrive/c/C++/C/foo.exe
[New Thread 6724.0x13d0]
[New Thread 6724.0x1890]
[New Thread 6724.0x8e0]
[New Thread 6724.0xd84]

Breakpoint 1, main () at foo.c:3
3               __asm__ ( "mov $5, %rax" );
(gdb) info registers rax
rax            0x0      0
(gdb) s
4               return 0;
(gdb) info registers rax
rax            0x5      5
(gdb) c
Continuing.
[Thread 6724.0x1890 exited with code 0]
[Thread 6724.0x8e0 exited with code 0]
[Thread 6724.0xd84 exited with code 0]
[New Thread 6724.0x1368]
[Inferior 1 (process 6724) exited normally]
(gdb)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...