【发布时间】:2016-08-28 21:57:42
【问题描述】:
你好 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
【问题讨论】:
-
它创建了
test.exe,但是当我尝试通过单击文件夹中的exe来运行它时,它给出了testing.exe has stopped working的错误,当我尝试使用./通过cygwin运行它时testing.exe,它给出了分段错误。有什么想法@MichaelPetch? -
@MichaelPetch 已添加,顺便感谢您的努力。我很迷茫
-
我不小心删除了我的第一个建议,我正在重新发布它:我不相信 Cygwin 上的 LD 的预编译版本能够理解除 i386pep 和 i386pe 目标文件之外的任何内容。这可以通过告诉 nasm 生成 win32 对象来工作。
nasm -f win32 test.asm -o test.obj然后ld -mi386pe -o test.exe test.obj -
话虽如此,
int 0x80将无法在 Windows/Cygwin 下工作。这是一个 Linux 中断,可能会导致段错误。 -
我不确定我是否理解,你所说的
int 0x80在哪里,还有什么可以与之抗争的吗?其次,归根结底,我只是想确保test.asm具有在其中运行的有效代码,我可以以某种方式一起避免这些问题吗?抱歉所有问题,我对整个 linux 完全陌生,我离我的 java 家很远
标签: linux windows x86 cygwin nasm