我是汇编语言的新手,我写了一个简单的程序,所以我运行了跟随表彰
nasm -o learn.bin learn.asm
然后组装代码
chmod +x learn.bin
然后最终运行它
./learn.bin
但最后一次返回错误
bash: ./learn.bin: cannot execute binary file
使用atom intel CPU运行ubuntu
任何帮助都会很棒, 提前致谢
答案 0 :(得分:1)
错误消息听起来就像你没有正确的ELF可执行文件头。可以使用Nasm的-f bin
输出格式组装文件(默认情况下,如果未指定输出格式)。但它需要一个ELF标题。
通常的方法是nasm -f elf32 learn.asm
(如果你有64位代码,可能是-f elf64
)。如果一切顺利,这“应该”产生“learn.o”。然后,您必须使用ld -o learn learn.o
链接此“可链接对象”文件(如果您使用的是64位-melf-i386
,则添加ld
...)。或者,根据代码,gcc -o learn learn.o
(为64位gcc添加-m32
)。我看到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论坛。如果您发布代码,我们可以为您提供更多帮助
答案 1 :(得分:0)
你不能(通常)在linux下运行纯二进制文件。您必须首先要求nasm
生成目标文件然后使用链接器来创建ELF可执行文件。请注意,您的代码当然也应该是为linux编写的。互联网上有很多例子,例如this tutorial。