Cygwin:兼容性问题

Bec*_*hem 4 linux windows x86 cygwin nasm

您好StackOverFlowers!

我对整个linux事物是非常陌生的,并且我正在使用Cygwin尝试执行以下操作。

将测试文件通过解析器...

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

按照本教程中的描述执行此行,我不确定它到底是做什么的...

nasm -f elf test.asm //作品

最后一行创建可执行文件(如果我正确理解了本教程)

ld -s -o test test.o

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

任何和所有建议都非常感谢!

编辑:

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
Run Code Online (Sandbox Code Playgroud)

Mic*_*tch 5

从您的问题和评论看来,您可能已经导致相信Cygwin与Linux相同。事实并非如此。Cygwin是一个类似Unix的 posix兼容环境,可以在Windows上本地运行:

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

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

如果要创建在Linux上运行的代码,则需要安装Linux。您可以通过在Windows上运行虚拟机软件并在其中安装Linux来实现(Ubuntu是很多人的选择)。