Cygwin:汇编语言开发?

时间:2009-02-18 14:31:37

标签: assembly cygwin

首先,我不确定这是否应该成为我的主题 我昨天在assembly and the stack开始了,但我想 我在这里问的问题是完全不同的。

我一直试图了解Cygwin到底是什么 维基百科和谷歌,我运气不错。 我刚刚开始使用gcc在Linux上进行汇编编程 气体组装商。我正在午餐时使用一台机器 只有Windows就可以了。我想练习一些装配 语言编程在这里,所以我认为Cygwin可能 帮助。

错误地我相信我在Linux中编写的代码 可以使用Cygwin在Windows中编译和运行。 Cygwin允许我编译代码:

as someAssmProg.as -o someAssmProg.o
ld someAssmProg.o -o someAssmProg

但如果我尝试在Cygwin下运行代码,

./someAssmProg

我收到“未处理的win32异常发生”消息

现在我假设这是因为我写的代码是 适用于Linux。我想虽然Cygwin会处理 有了这个。 Cygwin是否真的意味着用于开发 Unix风格命令行方式的Windows应用程序?

我再次知道这对大多数人来说可能是显而易见的 我真的很困惑!

P.S我之前曾尝试AndLinux用于Windows,但这是一个非常大的安装。

4 个答案:

答案 0 :(得分:7)

Cygwin是一个运行时层,它在Windows上提供来自Unix / Linux世界的库和软件。它不允许你的汇编代码运行,因为操作系统仍然是Windows,所以所有的中断等仍然是Windows,而不是Linux版本。另外,如果你真的想在Windows上运行汇编程序,你必须做的事情与在Linux(或DOS)中做的事情有很大不同。

答案 1 :(得分:3)

您可以在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 Architecture Programmer’s Manual中。 C调用约定记录在Internet Archive的this page中;也许你可以找到一个仍然有图像的类似的?

请注意,Cygwin现在只会进行32位汇编; (非消费者)世界现在都是64位,而在现代处理器上的64位模式下,你有更多的寄存器和不同的调用约定。

答案 2 :(得分:1)

最好的方法实际上是安装一个VM(使用VirtualBox或其他),并在其下安装完整的Linux。听起来这可能太重了,无法满足您的要求,但这是我目前唯一的建议。

答案 3 :(得分:0)

嗨,我有一个类似的问题,但能够使用-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)