我在网上编码的网站上输入了源代码。
但我在源代码下面收到错误。
我想我省略了“主要”。
由于我学习了Intel assmbly,我不知道如何修复它。
你能帮帮我吗?
感谢您提前帮助我。
SECTION .DATA
hello: db 'Hello world!',10
helloLen: equ $-hello
SECTION .TEXT
GLOBAL _START
_START:
; Write 'Hello world!' to the screen
mov eax,4 ; 'write' system call
mov ebx,1 ; file descriptor 1 = screen
mov ecx,hello ; string to write
mov edx,helloLen ; length of string to write
int 80h ; call the kernel
; Terminate program
mov eax,1 ; 'exit' system call
mov ebx,0 ; exit with error code 0
int 80h ; call the kernel
/usr/lib/gcc/i686-linux-gnu/4.6 /../../../ i386-linux-gnu / crt1.o:在函数_start':
(.text+0x18): undefined reference to
main'中
collect2:ld返回1退出状态
答案 0 :(得分:2)
如果您只是将 GCC 用作链接器并且不关心 C 运行时,则可以通过传递{{{Jester指出)将其排除在外({ 1}}到 gcc 。然后,您需要提供-nostdlib
符号,以便代码如下所示:
_start
你会像这样组装和链接它:
SECTION .DATA
hello: db 'Hello world!',10
helloLen: equ $-hello
SECTION .TEXT
GLOBAL _start
_start:
; Write 'Hello world!' to the screen
mov eax,4 ; 'write' system call
mov ebx,1 ; file descriptor 1 = screen
mov ecx,hello ; string to write
mov edx,helloLen ; length of string to write
int 80h ; call the kernel
; Terminate program
mov eax,1 ; 'exit' system call
mov ebx,0 ; exit with error code 0
int 80h ; call the kernel
或者,您可以直接与nasm -f elf file.asm
gcc -m32 -nostdlib -o file file.o
关联,这样您也可以这样做:
ld
这将生成一个名为nasm -f elf file.asm
ld -melf_i386 -o file file.o
虽然我不认为以下是您的意图,但有人可能会发现以下信息有用:
您可以使用 GCC ,并通过将file
重命名为_START
,使 C 库可用于汇编代码。 C 运行时包含一个名为main
的入口点,它处理初始化,然后调用名为_start
的函数。您可以利用 C 库,但main
必须正确设置堆栈帧并正确清理并在完成后返回,因为main
将被视为 C 功能。代码看起来像这样:
main
此示例使用EXTERN printf ; Tell the assembler printf is provided outside our file
SECTION .DATA
hello: db 'Hello world!',10,0 ; Null terminate for printf
helloLen: equ $-hello-1 ; Exclude null by reducing len by 1
SECTION .TEXT
GLOBAL main
; main is now a C function
main:
push ebp ; Setup stack frame
mov ebp, esp
push ebx ; We need to preserve EBX (C Calling convention)
; Write 'Hello world!' to the screen
mov eax,4 ; 'write' system call
mov ebx,1 ; file descriptor 1 = screen
mov ecx,hello ; string to write
mov edx,helloLen ; length of string to write
int 80h ; call the kernel
; Write 'Hello World!' with C printf
push hello ; push the address of string to print
call printf ; call printf in C library
add esp, 4 ; Restore stack pointer
; push hello pushed 4 bytes on stack
mov eax, 0x0 ; Return value of 0
pop ebx ; Restore EBX
leave
ret ; Return to C runtime which will cleanup and exit
系统调用来编写标准输出,并使用 C int 0x80
执行相同操作。您可以使用:
printf
的可执行文件
file