0

我是汇编语言的新手,我写完了一个简单的程序,所以我运行了以下推荐

nasm -o learn.bin learn.asm

然后组装代码

 chmod +x learn.bin

然后最后运行它

 ./learn.bin

但最后一个返回错误

 bash: ./learn.bin: cannot execute binary file

我用 atom intel CPU 运行 ubuntu

任何帮助都会很棒,在此先感谢

4

2 回答 2

1

错误消息听起来好像您没有正确的 ELF 可执行标头。可以使用 Nasm 的-f bin输出格式(默认值,如果您不指定输出格式)来组装文件。但它需要一个 ELF 标头塞入其中。

通常的方法是nasm -f elf32 learn.asm(或者-f elf64如果你有 64 位代码)。如果一切顺利,这个“应该”会产生“learn.o”。然后你必须使用链接这个“可链接对象”文件 ld -o learn learn.o-melf-i386如果你使用的是 64 位ld,请添加......你可能是)。或者,根据代码,gcc -o learn learn.o(添加-m3264 位 gcc)。我看到 Jester 刚刚告诉过你(用更少的话)。

这是一个“应该”按照您尝试的方式工作的文件示例:

[map all hkhw.map] ; optional
;==========================
bits 32
ORIGIN equ 8048000h
org ORIGIN
section .text
    code_offset equ 0
    code_addr:
;--------------------------- ELF header----------------------
        dd $464c457f,$00010101,0,0,$00030002,1,main,$34,0,0,$00200034,2,0
        dd 1,code_offset,code_addr,code_addr,code_filez,code_memsz,5,4096
        dd 1,data_offset,data_addr,data_addr,data_filez,data_memsz,6,4096
main:
;--------- your code goes here -------------------------------

    push byte 4
    pop eax
    xor ebx, ebx
    mov ecx, msg
    push byte msg_len
    pop edx
    int 80h

    push byte 1
    pop eax
    int 80h    


;------------ constant data -----------------------
; (note that we're in .text, not .rdata)
        align 4



;-------------------------------------------------------------
        align 4
        code_memsz equ $ - $$
        code_filez equ code_memsz
        data_addr equ (ORIGIN+code_memsz+4095)/4096*4096 + (code_filez % 4096)
        data_offset equ code_filez
section .data vstart=data_addr
;------------ initialized data -------------

msg db "Hello from Nasm, all by itself!", 10
msg_len equ $ - msg

;---------------------------------------------------------------------------
    idat_memsz equ $ - $$
    bss_addr equ data_addr + ($ - $$)
section .bss  vstart=bss_addr 
;------------- uninitialized data ----------------------



;-------------------------------------------------
    udat_memsz equ $ - $$
    data_memsz equ  idat_memsz + udat_memsz
    data_filez equ  idat_memsz
;========================

嗯...格式不太好。应该是不可读。试试 Nasm 论坛。如果您发布代码,我们可以为您提供更多帮助

于 2013-06-09T01:32:17.713 回答
0

您不能(通常)在 linux 下运行纯二进制文件。您必须首先要求nasm生成一个目标文件,然后使用链接器来创建一个 ELF 可执行文件。请注意,您的代码当然也应该为 linux 编写。互联网上有很多示例,例如,请参阅本教程

于 2013-06-09T01:05:06.933 回答