linux - Cygwin:兼容性问题

标签 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

最佳答案

从您的问题和评论看来,您可能被引导相信 Cygwin和Linux一样。事实并非如此。 Cygwin 是一个类unix posix 兼容环境,可在 Windows 上 native 运行:

Cygwin is a Unix-like environment and command-line interface for Microsoft Windows. Cygwin provides native integration of Windows-based applications, data, and other system resources with applications, software tools, and data of the Unix-like environment. Thus it is possible to launch Windows applications from the Cygwin environment, as well as to use Cygwin tools and applications within the Windows operating context.

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

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

关于linux - Cygwin:兼容性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55505916/

相关文章:

linux - 事件套接字的 '{tcp_error, Socket, etimedout}' 消息从何而来?

x86 - 流水线中的软件中断会如何处理?

linux - 将 Bash 变量传递给 awk 脚本

c - recvmmsg() 不填充 msghdr.msg_namelen?

windows - 使用 IIS 和应用程序池的 WCF Windows 身份验证

.net - 根据 SQL 表时间戳安排 .exe 执行

windows - Windows 上命令行搜索和替换工具的建议

x86 - 像 PTLsim 这样的 CAS 模拟器如何实现 x86 硬件的周期精确模拟?

assembly - x86 处理器汇编语言 AND 和 OR 运算符优先级

linux - Logstash高可用部署