当前位置: 首页 > 面试题库 >

_start中RET上的nasm分段错误

丁兴德
2023-03-14
问题内容
section .text
     global _start
_start:
     nop
main:
     mov eax, 1
     mov ebx, 2
     xor eax, eax
     ret

我用以下命令编译:

nasm -f elf main.asm
ld -melf_i386 -o main main.o

当我运行代码时,Linux抛出分段错误错误

(我正在使用Linux Mint Nadia 64位)。为什么会产生此错误?


问题答案:

因为ret不是 要退出的Linux,Windows或苹果机的程序的正确方法!!!!

_start 不是函数,因为没有要返回的用户空间调用程序, 所以堆栈上没有返回地址
。用户空间中的执行在进程入口点从此处开始(在静态可执行文件中)。(或者使用动态链接,它在动态链接器完成后跳到此处,但结果相同)。

在Linux / OS X上,堆栈指针指向指向的argc入口_start(有关进程启动环境的更多详细信息,请参见i386或x86-64 System
V ABI文档);内核在启动用户空间之前将命令行参数args放入用户空间堆栈内存中。(因此,如果您尝试这样做ret,则EIP / RIP = argc
=一个小整数,不是有效的地址。如果调试器在地址0x00000001或其他内容上显示错误,这就是原因。)

对于Windows而言,对于ExitProcessLinux而言是系统调用- 对于x86,使用int 80Husing
sys_exit,对于x64而言,使用syscallusing 60exit如果要链接到C库,则从C库进行调用。

32位Linux

mov     eax, sys_exit ; sys_exit = 1
xor     ebx, ebx
int     80H

64位Linux

mov     rax, 60
xor     rdi, rdi
syscall

视窗

push    0
call    ExitProcess

或Windows / Linux链接到C库

call    exit

exit(与原始退出系统调用或libc不同_exit),将首先刷新stdio缓冲区。如果printf从中_start使用exit,则即使退出stdout到文件(使stdout成为全缓冲而不是行缓冲),也要确保退出前已打印所有输出。

通常建议,如果使用libc函数,请编写一个main函数并与gcc链接,以便可以通过常规CRT启动函数调用它ret

定义main为某种东西_start并不会使其变得特别,main如果它不像main由a调用的C
函数_start那样准备在main返回后退出,那么使用标签就令人感到困惑。



 类似资料:
  • 问题内容: 我尝试使用输入四个浮点数,将它们存储到堆栈中,然后使用将它们复制到寄存器中以供使用。我的问题是,当我尝试输出这4个数字时,程序seg错误出现在。 我认为它与堆栈有关,但是我尝试多次弹出(一次执行多个指令)无济于事。我还是汇编语言的新手,所以使用它对于我来说有点太先进了。 您会注意到我包含了一个名为的文件。它使我能够查看寄存器和堆栈(这就是为什么要有指令的原因。)这是由我的教授提供的,它

  • 如果待升级项目中未使用过 Ret,那么可以忽略本小节。如果是 jfinal 3.2、3.3、3.4 或者更高版本的 jfinal 也可以忽略。 JFinal 3.2 对Ret工具类进行了改进,使其更加适用于json数据格式交互的API类型项目。新版本状态名只有一个:state,取值为:ok/fail,而老版本状态名有两个:isOk与isFail,取值为:true/false。 所以,新旧版本Ret

  • NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多 的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16 位的'OBJ'和'Win32'。它还可以输出纯二进制文件。它的语法设计得相当的简 洁易懂,和Intel语法相似但更简单。它支持'Pentium','P6','MMX','3DNow!', 'SSE' an

  • 我在实现合并排序时遇到了分段错误。我已经检查了数组是否超出边界。我想得到一些帮助,找出我哪里出了问题。我尝试过小数组的输入,例如大小为10的数组,我将temp的大小作为静态值( 更新:我只需要改变mid=(低高)/2。

  • 我正在尝试使用 AWS PHP 开发工具包将一个 30 GB 的文件上传到亚马逊 S3。 它适用于最大7GB的文件。上传30 GB文件时,脚本运行约2小时后,我收到以下错误: 将部件上载到多部件上载时发生异常。以下部分出错:-第5部分:在上执行“UploadPart”时出错https://s3.amazonaws.com/Server3-27-SEP-2015/S3_www_1443369605.

  • 我是PHP的新用户。我在一些PHP上工作project.want一些关于PHP会话的帮助。我有login.html页面的形式动作执行login.js.登录时执行,用户名和密码已请求urllogin.php页面检查用户名 我在登录时启动了session_start()。php。我已与print\r(美元会话)进行了核对;对于会话,未在上启动。但这是一个开始。当我搬家的时候。这是行不通的。我在家里查。