Assembly Cygwin:汇编语言开发?

Assembly Cygwin:汇编语言开发?,assembly,cygwin,Assembly,Cygwin,首先,我不确定这是否应该是线程I的一部分 从昨天开始但是我想 我在这里问的问题完全不同 我一直在想到底是什么via 维基百科和谷歌,我运气不好。 我刚刚开始使用gcc在Linux上进行汇编编程 气体装配工。那天午饭的时候我用机器上班 只有窗户在上面。我想练习一些组装 语言编程,所以我认为Cygwin可能 来帮忙 我错误地认为我在Linux中编写的代码 可以使用Cygwin在Windows中编译和运行。 Cygwin允许我很好地编译代码: as someAssmProg.as -o someAss

首先,我不确定这是否应该是线程I的一部分 从昨天开始但是我想 我在这里问的问题完全不同

我一直在想到底是什么via 维基百科和谷歌,我运气不好。 我刚刚开始使用gcc在Linux上进行汇编编程 气体装配工。那天午饭的时候我用机器上班 只有窗户在上面。我想练习一些组装 语言编程,所以我认为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我以前尝试过Windows,但它的安装量很大。

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

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

您完全可以在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
处理器组装说明的参考包含在中。C调用约定记录在Internet存档中;也许你能找到一个类似的仍然有图像的


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

嗨,我也遇到过类似的问题,但我能用-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)
$cat foo.c
内部主(空)
{
__asm_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
返回0;
}
$make
gcc-ggdb-Wall-mconsole-ooo.o-cfoo.c
gcc-ggdb-o foo foo.o-lm
$gdb./foo.exe
GNU gdb(gdb)(Cygwin 7.10.1-1)7.10.1
版权所有(C)2015免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“x86_64-pc-cygwin”。
键入“显示配置”以获取配置详细信息。
有关错误报告说明,请参阅:
.
在线查找GDB手册和其他文档资源,网址为:
.
要获得帮助,请键入“帮助”。
键入“apropos word”以搜索与“word”相关的命令。。。
正在从./foo.exe读取符号…完成。
(gdb)l
1内部主管道(无效)
2       {
3 uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
4返回0;
5       }
(gdb)b 3
0x1004010ed处的断点1:文件foo.c,第3行。
(gdb)r
启动程序:/cygdrive/c/c++/c/foo.exe
[新螺纹6724.0x13d0]
[新线程6724.0x1890]
[新螺纹6724.0x8e0]
[新螺纹6724.0xd84]
foo.c处的断点1,main():3
3 uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
(gdb)信息寄存器rax
rax 0x0 0
(gdb)s
4返回0;
(gdb)信息寄存器rax
rax 0x5
(gdb)c
持续的。
[线程6724.0x1890退出,代码为0]
[线程6724.0x8e0退出,代码为0]
[线程6724.0xd84已退出,代码为0]
[新线程6724.0x1368]
[次1(进程6724)正常退出]
(gdb)

谢谢,这很有道理。有一件事,什么是“运行时层”?不是学究,真的不知道!基本上,cygwin解释最初为某种unix编写的程序的C调用(与中断相反),然后尝试调用相应的Windows调用。因为它捕捉C调用而不是中断,所以您需要针对cygwin构建,以便能够在cygwin上运行它。当然,它要复杂得多,而且它可以做很多其他事情,但这是基本思想。DrJokepu:当然是-但这将是一个完全不同的问题(或者比我现在有时间回答的问题长得多).这是站点中的一个bug;它在预览窗口中正常工作。“AMD64体系结构程序员手册”链接到“本页”链接到I know ocliterature.com/。。。是坏的,这就是为什么我链接到回程机器是必要的?它只是确保我们生成一个MINGW可执行文件,对吗?mno cygwin`在cygwin的最新GCC上不起作用。如果有人出于与我相同的原因偶然发现这个主题,我已经成功地编译了LLVM IR,使用海报的命令运行cygwin。这也是我得出的结论。