热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

为什么在这段汇编代码中调用“pop”会导致分段错误?

如何解决《为什么在这段汇编代码中调用“pop”会导致分段错误?》经验,为你挑选了1个好方法。

我在Mac OS上玩x86-64程序集(使用NASM 2.09和2.13,以捕获由NASM问题引起的错误)。我目前正在尝试实现函数调用,并尝试使用pushpop指令,但pop始终似乎会导致段错误:

line 10: 41072 Segmentation fault: 11 ./result

我尝试手动调整rsprbp等等,但这pop似乎是问题所在。任何帮助,将不胜感激!

section .data

default rel
global start
section .text

start:
    mov r12, 4
    push r12
    call label_0_print_digit
    (some stuff to exit program)

label_0_print_digit:
    pop r12
    (some stuff to print the digit - the issue persists even without this)
    ret 

prl.. 5

在问题所示的代码中,call指令将返回地址放在堆栈上,pop指令从堆栈中删除返回地址(放入r12)。

ret然后,该指令4从堆栈弹出并跳转到那里。这不是有效的代码地址,从而导致故障。 ret基本上只是pop进入RIP。


访问参数的函数,是在堆栈上,使用[rsp + 8][rsp + 16]而不是等pop

x86-64的标准调用约定在寄存器而不是堆栈中传递整数args,而被调用者可以在其中直接使用它们。并且避免了调用者在函数返回后必须清理堆栈。(有2种:Linux / MacOS / etc与Windows,使用不同的寄存器。)



1> prl..:

在问题所示的代码中,call指令将返回地址放在堆栈上,pop指令从堆栈中删除返回地址(放入r12)。

ret然后,该指令4从堆栈弹出并跳转到那里。这不是有效的代码地址,从而导致故障。 ret基本上只是pop进入RIP。


访问参数的函数,是在堆栈上,使用[rsp + 8][rsp + 16]而不是等pop

x86-64的标准调用约定在寄存器而不是堆栈中传递整数args,而被调用者可以在其中直接使用它们。并且避免了调用者在函数返回后必须清理堆栈。(有2种:Linux / MacOS / etc与Windows,使用不同的寄存器。)


请注意,调用者然后需要知道函数返回时参数仍在堆栈上。
推荐阅读
  • scrcpy通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制您的Android设备。它可以通过USB连接,也可以通过Wifi连接(类似于隔空投屏),而且不需要任何ro ... [详细]
  • steam,2,7,2,已经,发布 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • PL2303HXD电路图(USB转UART)介绍及应用
    本文介绍了PL2303HXD电路图(USB转UART)的特性和应用,该电路图可以实现RS232和USB信号的转换,方便嵌入到手持设备中。PL2303HXD作为USB/RS232双向转换器,可以将USB数据转换为RS232信息流格式发送给外设,并将RS232外设的数据转换为USB数据格式传送回主机。通过利用USB块传输模式和自动流量控制,PL2303HXD能够实现更高的数据传输吞吐量比传统的UART端口。 ... [详细]
  • 本文摘自JavaGuide。1、简单易学;2、面向对象(封装,继承,多态);3、平台无关性(Java虚拟机实现平台无关性);4、可靠性;5、安全性;6、支持多线程(C++语言没有内 ... [详细]
  • 安卓及谷歌官网不容易上,在此整理好下载地址,这样就可以直接用迅雷下载了。Eclipse最新Mars版Eclipse(暂时还没被墙)Mac版:http:www.eclipse.org ... [详细]
  • 这么多流媒体服务器?你怎么技术选型?
    在上一篇文章里我们介绍了我们介绍了MCU和SFU的优缺点,webRTC通信方案SFU和MCU的区别?下面就来探讨下常见的SFU开源解决方案,当然,你也可以自己实现SFU流媒体服务器 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文主要讨论了在xps15上安装双系统win10和MacOS后,win10无法正常更新的问题。分析了可能的引导问题,并提供了解决方法。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • python怎么关闭红线提示_手把手教你安装Python开发环境
    Python在window环境下安装图解1、下载最新版本Windows的Python开发64位安装包目前最新版本是Python-3.7.22、下载完成后,获取安装包& ... [详细]
  • 这篇文章给大家介绍怎么从源码启动和编译IoTSharp ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。IoTSharp项目是 ... [详细]
author-avatar
cjcstc@163.com
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有