Linux Cygwin:兼容性问题

Linux Cygwin:兼容性问题,linux,windows,x86,cygwin,nasm,Linux,Windows,X86,Cygwin,Nasm,你好,飞越者 我对整个linux系统非常陌生,我正在使用Cygwin尝试做以下工作 将测试文件放入解析器 /parsertest.asm//工作并生成asm代码 按照教程中的描述做这行,我不确定它到底做了什么 nasm-f elf test.asm//有效 最后这一行创建可执行文件(如果我正确理解了教程) ld-s-o测试test.o 我得到一个错误,输入文件test.o的ld:i386体系结构与此行的i386:x86-64输出不兼容。我知道这是因为我试图从32位转换到64位,但我不知道如何解决

你好,飞越者

我对整个linux系统非常陌生,我正在使用Cygwin尝试做以下工作

将测试文件放入解析器

/parsertest.asm
//工作并生成asm代码

按照教程中的描述做这行,我不确定它到底做了什么

nasm-f elf test.asm
//有效

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

ld-s-o测试test.o

我得到一个错误,输入文件test.o的ld:i386体系结构与此行的i386:x86-64输出不兼容。我知道这是因为我试图从32位转换到64位,但我不知道如何解决这个问题。我尝试过使用elf_i386,但是我得到了ld:unrecogned仿真模式:elf_i386。支持的仿真: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

从您的问题和评论中可以看出,您可能已经被引导相信这与Linux是一样的。事实并非如此。Cygwin是一个类似unix的兼容posix的环境,在Windows上本机运行:

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

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


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

它创建了
test.exe
,但当我试图通过单击文件夹中的exe来运行它时,会出现一个错误
testing.exe已停止工作
,当我尝试使用./testing.exe在cygwin中运行它时,它给出了一个分段错误。有什么想法吗@MichaelPetch?@MichaelPetch已经添加了,谢谢你的努力。我很迷茫我无意中删除了我的第一个建议,我正在重新发布它:我不相信Cygwin上的LD的预编译版本除了i386pep和i386pe对象文件之外还能理解任何东西。这可以通过告诉nasm生成win32对象来实现
nasm-f win32 test.asm-o test.obj
ld-mi386pe-o test.exe test.obj。这是一个Linux中断,可能会导致SEGFULTS。我不确定我是否理解,您所说的
int0x80
在哪里,是否也有办法解决这个问题?其次,在一天结束时,我只想确保
test.asm
中运行的代码是有效的,我能设法避免这些问题吗?对于所有的问题,我很抱歉,我只是对整个linux完全陌生,我离我的java家还有很长的路要走