Cygwin:兼容性问题

你好,StackOverFlowers!

我是非常新的整个Linux的东西,我使用Cygwin来尝试做下面的事情..

通过parsing器放置testing文件…

./parser < test.c > test.asm //工作并生成ASM代码

按照教程中描述的那样做这一行,我不确定它究竟是什么…

nasm -f elf test.asm //工作

最后这行创buildexectuable(如果我正确理解教程)

ld -s -o test test.o

ld: i386 architecture of input file test.o' is incompatible with i386:x86-64 output此行的ld: i386 architecture of input file test.o' is incompatible with i386:x86-64 output 。 我知道这是因为我试图从32位到64位,但我不知道如何解决这个问题。 我试过使用elf_i386,但是我得到了ld: unrecognised emulation mode: elf_i386. Supported emulations: i386pep i386pe ld: unrecognised emulation mode: elf_i386. Supported emulations: i386pep i386pe

任何和所有的build议非常感谢!

编辑:

Test.asm文件

 section .data numbers db "0123456789", 0xA inputchar db 0 section .text global F_124565444 F_124565444: push ebp mov ebp, esp sub esp, 4 mov dword [ebp-4], 0 jmp G2 G1: add dword [ebp-4], 1 push edx G2: mov edx, 0 mov eax, [ebp+8] mov ebx, 10 div ebx mov [ebp+8], eax cmp eax, 0 jnz G1 push edx add dword [ebp-4], 1 jmp G3 G4: sub dword [ebp-4], 1 pop edx mov eax, 4 mov ebx, 1 mov ecx, numbers add ecx, edx mov edx, 1 int 80h G3: cmp dword [ebp-4], 0 jnz G4 mov eax, 4 mov ebx, 1 lea ecx, [numbers+10] mov edx, 1 int 80h leave ret global F_7362500 F_7362500: push ebp mov ebp, esp sub esp, 4 mov dword [ebp-4], 0 mov byte [inputchar], 0 jmp G6 G5: mov dword eax, [ebp-4] mov ebx, 10 mul ebx xor ecx, ecx mov byte cl, [inputchar] sub ecx, 48 add eax, ecx mov dword [ebp-4], eax G6: mov eax, 03h mov ebx, 00h mov ecx, inputchar mov edx, 01h int 80h cmp byte [inputchar], 0ah jne G5 mov dword eax, [ebp-4] leave ret global F_28052 F_28052: push ebp mov ebp, esp push dword [ebp+8] push dword 0 pop ebx pop eax cmp eax, ebx sete al movzx eax, al push dword eax pop eax cmp eax, 0 je L1 push dword [ebp+12] pop eax leave ret jmp L2 L1: push dword [ebp+8] push dword [ebp+12] push dword [ebp+12] push dword [ebp+8] pop ebx pop eax mov edx, eax sar edx, 31 idiv ebx push dword eax push dword [ebp+8] pop ebx pop eax imul eax, ebx push dword eax pop ebx pop eax sub eax, ebx push dword eax call F_28052 add esp, 8 push dword eax pop eax leave ret L2: leave ret global _start _start: push ebp mov ebp, esp sub esp, 4 sub esp, 4 call F_7362500 add esp, 0 push dword eax lea ebx, [ebp-4] pop eax mov dword [ebx], eax call F_7362500 add esp, 0 push dword eax lea ebx, [ebp-8] pop eax mov dword [ebx], eax push dword [ebp-4] push dword [ebp-8] call F_28052 add esp, 8 push dword eax call F_124565444 add esp, 8 push dword 0 pop eax leave mov ebx, eax mov eax,1 int 80h leave mov ebx, eax mov eax,1 int 80h 

从您的问题和意见中可以看出,您可能已经相信Cygwin与Linux相同。 事实并非如此。 Cygwin是一个类似于unix的 POSIX兼容环境,在Windows上本地运行:

Cygwin是Microsoft Windows的类Unix环境和命令行界面。 Cygwin提供了基于Windows的应用程序,数据和其他系统资源与类Unix环境的应用程序,软件工具和数据的本地集成。 因此,可以从Cygwin环境启动Windows应用程序,以及在Windows操作环境中使用Cygwin工具和应用程序。

特别是所有使用int 80h系统调用的Linux特定代码在Windows上运行时都会失败,因为它不适用于Windows环境。

如果你想创建在Linux上运行的代码,那么你需要安装Linux。 你可以通过在Windows上运行虚拟机软件来做到这一点,并安装Linux的味道(Ubuntu是很多人的选择)。