这是我的汇编级代码...
section .text
global _start
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, size
int 0x80
exit: mov eax, 1
int 0x80
section .data
mesg db 'KingKong',0xa
size equ $-mesg
Output:
root@bt:~/Arena# nasm -f elf a.asm -o a.o
root@bt:~/Arena# ld -o out a.o
root@bt:~/Arena# ./out
KingKong
我的问题是全局_start的用途是什么?我用 Mr.Google 碰了碰运气,发现它是用来告诉我的程序的起点的。为什么我们不能拥有_start
告诉程序从哪里开始,就像下面给出的那样,它会产生一种
屏幕上出现警告
section .text
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, size
int 0x80
exit: mov eax, 1
int 0x80
section .data
mesg db 'KingKong',0xa
size equ $-mesg
root@bt:~/Arena# nasm -f elf a.asm
root@bt:~/Arena# ld -e _start -o out a.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080
root@bt:~/Arena# ld -o out a.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080
global
指令是 NASM 特定的。它用于将代码中的符号导出到它在生成的目标代码中指向的位置。在这里你标记一下_start
符号是全局的,因此它的名称被添加到目标代码中(a.o
)。链接器(ld
)可以读取目标代码中的该符号及其值,以便它知道在输出可执行文件中将何处标记为入口点。当您运行可执行文件时,它从标记为的位置开始_start
在代码中。
If a global
如果符号缺少指令,则该符号将不会放置在目标代码的导出表中,因此链接器无法了解该符号。
如果您想使用除_start
(这是默认的),您可以指定-e
ld 的参数如下:
ld -e my_entry_point -o output_filename object_filename
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)